Hi Harsh, The setResource() call on LocalResource() is expecting an argument of type org.apache.hadoop.yarn.api.records.URL which is converted from a string in the form of URI. This happens in the following call of Distributed Shell example,
shellRsrc.setResource(ConverterUtils.getYarnUrlFromURI(new URI( shellScriptPath))); So, if I give a local file I get a parsing error like below, which is when I changed it to an HDFS file thinking that it should be given like that only. Could you please give an example of how else it could be used, using a local file as you are saying? 2013-08-06 06:23:12,942 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container: Failed to parse resource-request java.net.URISyntaxException: Expected scheme name at index 0: :///home_/dsadm/kishore/kk.ksh at java.net.URI$Parser.fail(URI.java:2820) at java.net.URI$Parser.failExpecting(URI.java:2826) at java.net.URI$Parser.parse(URI.java:3015) at java.net.URI.<init>(URI.java:747) at org.apache.hadoop.yarn.util.ConverterUtils.getPathFromYarnURL(ConverterUtils.java:77) at org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.LocalResourceRequest.<init>(LocalResourceRequest.java:46) On Tue, Aug 6, 2013 at 3:36 PM, Harsh J <ha...@cloudera.com> wrote: > To be honest, I've never tried loading a HDFS file onto the > LocalResource this way. I usually just pass a local file and that > works just fine. There may be something in the URI transformation > possibly breaking a HDFS source, but try passing a local file - does > that fail too? The Shell example uses a local file. > > On Tue, Aug 6, 2013 at 10:54 AM, Krishna Kishore Bonagiri > <write2kish...@gmail.com> wrote: > > Hi Harsh, > > > > Please see if this is useful, I got a stack trace after the error has > > occurred.... > > > > 2013-08-06 00:55:30,559 INFO > > org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: CWD > set > > to > /tmp/nm-local-dir/usercache/dsadm/appcache/application_1375716148174_0004 > > = > > > file:/tmp/nm-local-dir/usercache/dsadm/appcache/application_1375716148174_0004 > > 2013-08-06 00:55:31,017 ERROR > > org.apache.hadoop.security.UserGroupInformation: > PriviledgedActionException > > as:dsadm (auth:SIMPLE) cause:java.io.FileNotFoundException: File does not > > exist: hdfs://isredeng/kishore/kk.ksh > > 2013-08-06 00:55:31,029 INFO > > > org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService: > > DEBUG: FAILED { hdfs://isredeng/kishore/kk.ksh, 0, FILE, null }, File > does > > not exist: hdfs://isredeng/kishore/kk.ksh > > 2013-08-06 00:55:31,031 INFO > > > org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.LocalizedResource: > > Resource hdfs://isredeng/kishore/kk.ksh transitioned from DOWNLOADING to > > FAILED > > 2013-08-06 00:55:31,034 INFO > > > org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container: > > Container container_1375716148174_0004_01_000002 transitioned from > > LOCALIZING to LOCALIZATION_FAILED > > 2013-08-06 00:55:31,035 INFO > > > org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.LocalResourcesTrackerImpl: > > Container container_1375716148174_0004_01_000002 sent RELEASE event on a > > resource request { hdfs://isredeng/kishore/kk.ksh, 0, FILE, null } not > > present in cache. > > 2013-08-06 00:55:31,036 WARN org.apache.hadoop.ipc.Client: interrupted > > waiting to send rpc request to server > > java.lang.InterruptedException > > at > > > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1290) > > at > > java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:229) > > at java.util.concurrent.FutureTask.get(FutureTask.java:94) > > at > > org.apache.hadoop.ipc.Client$Connection.sendRpcRequest(Client.java:930) > > at org.apache.hadoop.ipc.Client.call(Client.java:1285) > > at org.apache.hadoop.ipc.Client.call(Client.java:1264) > > at > > > org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206) > > at $Proxy22.heartbeat(Unknown Source) > > at > > > org.apache.hadoop.yarn.server.nodemanager.api.impl.pb.client.LocalizationProtocolPBClientImpl.heartbeat(LocalizationProtocolPBClientImpl.java:62) > > at > > > org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ContainerLocalizer.localizeFiles(ContainerLocalizer.java:249) > > at > > > org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ContainerLocalizer.runLocalization(ContainerLocalizer.java:163) > > at > > > org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.startLocalizer(DefaultContainerExecutor.java:106) > > at > > > org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService$LocalizerRunner.run(ResourceLocalizationService.java:979) > > > > > > > > And here is my code snippet: > > > > ContainerLaunchContext ctx = > > Records.newRecord(ContainerLaunchContext.class); > > > > ctx.setEnvironment(oshEnv); > > > > // Set the local resources > > Map<String, LocalResource> localResources = new HashMap<String, > > LocalResource>(); > > > > LocalResource shellRsrc = Records.newRecord(LocalResource.class); > > shellRsrc.setType(LocalResourceType.FILE); > > shellRsrc.setVisibility(LocalResourceVisibility.APPLICATION); > > String shellScriptPath = "hdfs://isredeng//kishore/kk.ksh"; > > try { > > shellRsrc.setResource(ConverterUtils.getYarnUrlFromURI(new > > URI(shellScriptPath))); > > } catch (URISyntaxException e) { > > LOG.error("Error when trying to use shell script path specified" > > + " in env, path=" + shellScriptPath); > > e.printStackTrace(); > > } > > > > shellRsrc.setTimestamp(0/*shellScriptPathTimestamp*/); > > shellRsrc.setSize(0/*shellScriptPathLen*/); > > String ExecShellStringPath = "ExecShellScript.sh"; > > localResources.put(ExecShellStringPath, shellRsrc); > > > > ctx.setLocalResources(localResources); > > > > > > Please let me know if you need anything else. > > > > Thanks, > > Kishore > > > > > > > > On Tue, Aug 6, 2013 at 12:05 AM, Harsh J <ha...@cloudera.com> wrote: > >> > >> The detail is insufficient to answer why. You should also have gotten > >> a trace after it, can you post that? If possible, also the relevant > >> snippets of code. > >> > >> On Mon, Aug 5, 2013 at 6:36 PM, Krishna Kishore Bonagiri > >> <write2kish...@gmail.com> wrote: > >> > Hi Harsh, > >> > Thanks for the quick and detailed reply, it really helps. I am trying > >> > to > >> > use it and getting this error in node manager's log: > >> > > >> > 2013-08-05 08:57:28,867 ERROR > >> > org.apache.hadoop.security.UserGroupInformation: > >> > PriviledgedActionException > >> > as:dsadm (auth:SIMPLE) cause:java.io.FileNotFoundException: File does > >> > not > >> > exist: hdfs://isredeng/kishore/kk.ksh > >> > > >> > > >> > This file is there on the machine with name "isredeng", I could do ls > >> > for > >> > that file as below: > >> > > >> > -bash-4.1$ hadoop fs -ls kishore/kk.ksh > >> > 13/08/05 09:01:03 WARN util.NativeCodeLoader: Unable to load > >> > native-hadoop > >> > library for your platform... using builtin-java classes where > applicable > >> > Found 1 items > >> > -rw-r--r-- 3 dsadm supergroup 1046 2013-08-05 08:48 > >> > kishore/kk.ksh > >> > > >> > Note: I am using a single node cluster > >> > > >> > Thanks, > >> > Kishore > >> > > >> > > >> > > >> > > >> > On Mon, Aug 5, 2013 at 3:00 PM, Harsh J <ha...@cloudera.com> wrote: > >> >> > >> >> The string for each LocalResource in the map can be anything that > >> >> serves as a common identifier name for your application. At execution > >> >> time, the passed resource filename will be aliased to the name you've > >> >> mapped it to, so that the application code need not track special > >> >> names. The behavior is very similar to how you can, in MR, define a > >> >> symlink name for a DistributedCache entry (e.g. foo.jar#bar.jar). > >> >> > >> >> For an example, checkout the DistributedShell app sources. > >> >> > >> >> Over [1], you can see we take a user provided file path to a shell > >> >> script. This can be named anything as it is user-supplied. > >> >> Onto [2], we define this as a local resource [2.1] and embed it with > a > >> >> different name (the string you ask about) [2.2], as defined at [3] as > >> >> an application reference-able constant. > >> >> Note that in [4], we add to the Container arguments the aliased name > >> >> we mapped it to (i.e. [3]) and not the original filename we received > >> >> from the user. The resource is placed on the container with this name > >> >> instead, so thats what we choose to execute. > >> >> > >> >> [1] - > >> >> > >> >> > https://github.com/apache/hadoop-common/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/ApplicationMaster.java#L390 > >> >> > >> >> [2] - [2.1] > >> >> > >> >> > https://github.com/apache/hadoop-common/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/ApplicationMaster.java#L764 > >> >> and [2.2] > >> >> > >> >> > https://github.com/apache/hadoop-common/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/ApplicationMaster.java#L780 > >> >> > >> >> [3] - > >> >> > >> >> > https://github.com/apache/hadoop-common/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/ApplicationMaster.java#L205 > >> >> > >> >> [4] - > >> >> > >> >> > https://github.com/apache/hadoop-common/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/ApplicationMaster.java#L791 > >> >> > >> >> On Mon, Aug 5, 2013 at 2:44 PM, Krishna Kishore Bonagiri > >> >> <write2kish...@gmail.com> wrote: > >> >> > Hi, > >> >> > > >> >> > Can someone please tell me what is the use of calling > >> >> > setLocalResources() > >> >> > on ContainerLaunchContext? > >> >> > > >> >> > And, also an example of how to use this will help... > >> >> > > >> >> > I couldn't guess what is the String in the map that is passed to > >> >> > setLocalResources() like below: > >> >> > > >> >> > // Set the local resources > >> >> > Map<String, LocalResource> localResources = new > HashMap<String, > >> >> > LocalResource>(); > >> >> > > >> >> > Thanks, > >> >> > Kishore > >> >> > > >> >> > >> >> > >> >> > >> >> -- > >> >> Harsh J > >> > > >> > > >> > >> > >> > >> -- > >> Harsh J > > > > > > > > -- > Harsh J >