1

助けてください、私は立ち往生しています。これがジョブを実行するための私のコードです。

hadoop jar mrjob.jar ru.package.Main -files hdfs://0.0.0.0:8020/MyCatalog/jars/metadata.csv -libjars hdfs://0.0.0.0:8020/MyCatalog/jars/opencsv.jar,hdfs://0.0.0.0:8020/MyCatalog/jars/gson.jar,hdfs://0.0.0.0:8020/MyCatalog/jars/my-utils.jar /MyCatalog/http_requests.seq-r-00000 /MyCatalog/output/result_file

私はこれらのWARNを受け取ります:

12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/opencsv.jar is not on the local filesystem. Ignoring.
12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/gson.jar is not on the local filesystem. Ignoring.
12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/my-utils.jar is not on the local filesystem. Ignoring.

次に:スレッド「メイン」の例外 java.lang.NoClassDefFoundError: メイン クラスの行で、my-utils.jar という名前の jar からクラスをインスタンス化しようとしています

  1. これらの jar ファイルはすべて hfds にあります (ファイル ブラウザで確認できます)。
  2. my-utils.jar にはNoClassDefFoundErrorの理由であるクラスが含まれています

私は何を間違っていますか?

UPD: GenericOptionsParser のソースコードを調べています:

/**
   * If libjars are set in the conf, parse the libjars.
   * @param conf
   * @return libjar urls
   * @throws IOException
   */
  public static URL[] getLibJars(Configuration conf) throws IOException {
    String jars = conf.get("tmpjars");
    if(jars==null) {
      return null;
    }
    String[] files = jars.split(",");
    List<URL> cp = new ArrayList<URL>();
    for (String file : files) {
      Path tmp = new Path(file);
      if (tmp.getFileSystem(conf).equals(FileSystem.getLocal(conf))) {
        cp.add(FileSystem.getLocal(conf).pathToFile(tmp).toURI().toURL());
      } else {
        LOG.warn("The libjars file " + tmp + " is not on the local " +
          "filesystem. Ignoring.");
      }
    }
    return cp.toArray(new URL[0]);
  }

つまり: 1. カンマの間にスペースがありません 2. まだわかりません... ローカル ファイル システム、hdfs ファイル システムを指定しようとしましたが、結果は同じです。クラスが追加されていないようです...

4

3 に答える 3

4

問題は解決しました。正しい呼び出しは次のとおりです。

hadoop jar my-job.jar ru.package.Main -files /home/cloudera/uploaded_jars/metadata.csv -libjars /home/cloudera/uploaded_jars/opencsv.jar,/home/cloudera/uploaded_jars/gson.jar,/home/cloudera/uploaded_jars/url-raiting-utils.jar /MyCatalog/http_requests.seq-r-00000 /MyCatalog/output/scoring_result

どこ

/ MyCatalog

hdfsパスです、

/ home / cloudera / uploaded_jars /

ローカルのfsパスです 問題はジョブjarにありました。以前は、Mapper、Reducer、Mainクラスの3つのクラスのみで 単純なjarを使用してジョブを実行しようとしました。今、私はmavenによって生成された他のものを提供しました(それらのうちの2つを生成します) 2番目のジョブjarにはすべての依存関係ライブラリが含まれています。その中。構造は次のようになります: my-job.jar

--lib _

--aopalliance - 1.0.jar asm-3.2.jar avro-1.5.4.jar ... commons-beanutils-1.7.0.jar commons-beanutils-core-1.8.0.jar ... zookeeper-3.4.3 -cdh4.0.0.jar

libフォルダー内には76個のjarファイルがあります。

動作しますが、理由がわかりません。

于 2012-10-27T11:00:36.920 に答える
1

HDFS 上にあるからといって、実行中のジョブのクラスパスにあるとは限りません。

本当にこの問題を修正したいだけなら、maven を使用して、単一の jar にすべての依存関係を含む「fat jar」を作成します。これは、 shade プラグインを使用して行うことができます。

しかし、あなたのコマンドを見ると、間違っているように見えます。here で説明されている-libjarsで「ジョブ」コマンドを使用すると、運が良くなる可能性があると思います。「hadoop jar」コマンドを使用して外部 jar を指定できるかどうかはわかりません。

于 2012-10-26T22:48:45.803 に答える