1

ウェブサイトhttp://hadoop.apache.org/docs/current2/hadoop-yarn/hadoop-yarn-site/WritingYarnApplications.htmlから最初の例を実行しようとしました

以下は私のコードです

    Path jarPath = new Path("target/HadoopStudy-0.0.1-SNAPSHOT.jar");
    FileSystem fs = FileSystem.get(conf);
    FileStatus jarStatus = fs.getFileStatus(jarPath);
    LocalResource amJarRsrc = Records.newRecord(LocalResource.class);

    amJarRsrc.setType(LocalResourceType.FILE);

    amJarRsrc.setVisibility(LocalResourceVisibility.APPLICATION);


    logger.debug(ConverterUtils.getYarnUrlFromPath(jarPath));
    amJarRsrc.setResource(ConverterUtils.getYarnUrlFromPath(jarPath));
    amJarRsrc.setTimestamp(jarStatus.getModificationTime());
    amJarRsrc.setSize(jarStatus.getLen());
    localResources.put(Common.LOCAL_JAR_PATH, amJarRsrc);
    amContainer.setLocalResources(localResources);

しかし、アプリケーションIDを取得できます。アプリケーションをヤーンに送信しますが、アプリケーションは常に失敗します。マスターでノードマネージャーのログを確認すると、これらのエラーが見つかりました

java.net.URISyntaxException: Relative path in absolute URI: ://target/HadoopStudy-0.0.1-SNAPSHOT.jar
    at java.net.URI.checkPath(URI.java:1804)
    at java.net.URI.<init>(URI.java:752)
    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)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl$RequestResourcesTransition.transition(ContainerImpl.java:523)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl$RequestResourcesTransition.transition(ContainerImpl.java:494)
    at org.apache.hadoop.yarn.state.StateMachineFactory$MultipleInternalArc.doTransition(StateMachineFactory.java:385)
    at org.apache.hadoop.yarn.state.StateMachineFactory.doTransition(StateMachineFactory.java:302)
    at org.apache.hadoop.yarn.state.StateMachineFactory.access$300(StateMachineFactory.java:46)
    at org.apache.hadoop.yarn.state.StateMachineFactory$InternalStateMachine.doTransition(StateMachineFactory.java:448)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl.handle(ContainerImpl.java:850)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl.handle(ContainerImpl.java:73)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl$ContainerEventDispatcher.handle(ContainerManagerImpl.java:681)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl$ContainerEventDispatcher.handle(ContainerManagerImpl.java:674)
    at org.apache.hadoop.yarn.event.AsyncDispatcher.dispatch(AsyncDispatcher.java:134)
    at org.apache.hadoop.yarn.event.AsyncDispatcher$1.run(AsyncDispatcher.java:81)
    at java.lang.Thread.run(Thread.java:722)

PC A で例を実行しますが、PC B で Hadoop をデプロイし、jar は PC A にあります。

調査した後、私はそれを修正することはできません.しかし、いくつか質問があります.
1) jar を hdfs にアップロードする必要がありますか? 必要に応じて、何をすべきかを知っています
2) 糸の原理を理解するだけです。アプリケーションを送信したい場合は、jar をマスターにアップロードする必要がありますか? jar ファイルをマスターのローカル ファイル システムにアップロードできますか? できれば、パスを設定する方法は?

4

1 に答える 1

2
  1. jar を hdfs にアップロードする必要がありますか? 私が必要なら、私は何をすべきか知っている

    はい。

  2. 糸の原理を理解するためだけに、アプリケーションを送信したい場合は、jar をマスターにアップロードする必要がありますか? jar ファイルをマスターのローカル ファイル システムにアップロードできますか? できれば、パスを設定する方法は?

    YARN NodeManagers は FileSystem インターフェイスを使用して、jar をローカル ノードに「ローカライズ」します。これを機能させるには、すべてのリソースを事前に、FileSystem 実装 (通常は HDFS) を介してアクセスできる中央の場所にアップロードする必要があります。

    したがって、「target/HadoopStudy-0.0.1-SNAPSHOT.jar」というパスがある場合は、最初にそれを HDFS のホーム ディレクトリにアップロードします。たとえば、hdfs:///user/song/HadoopStudy-0.0.1-SNAPSHOT とします。 jar」を作成し、そのパスを local-resource に設定します。

于 2013-11-10T21:27:57.473 に答える