1

Apache Hadoop 1.2.1 を使用して map-reduce プログラムを開発しました。Eclipse IDE を使用して最初の開発を行い、すべての入力ファイルと出力ファイルをローカル ファイル システムから取得する Hadoop 分散コンピューティング環境をシミュレートしました。このプログラムは Eclipse で問題なく実行されます。次に、Eclipse を使用して JAR ファイルを作成し、これを 1 つのクラスターの Hadoop マシンで実行しようとすると、エラーが発生します。

Hadoop ジョブをセットアップして実行するコードは次のとおりです。

String outputPath = "/output";
String hadoopInstructionsPath = args[0];

Job job = new Job();
job.setJarByClass(Main.class);  //setJarByClass is here but not found apparently?!?
job.setJobName("KLSH");

FileInputFormat.addInputPath(job, new Path(hadoopInstructionsPath));
FileOutputFormat.setOutputPath(job,new Path(outputPath));


job.setMapperClass(KLSHMapper.class);
job.setReducerClass(KLSHReducer.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

System.exit(job.waitForCompletion(true) ? 0:1);
boolean success = job.waitForCompletion(true);
return success ? 0 : 1;

次に、[ファイル] -> [エクスポート] -> [実行可能な JAR ファイル] を使用して Eclipse を使用して jar を作成し、クラスターで実行する JAR ファイルを作成します。

ジョブを実行するために使用するコマンドは次のとおりです (KLSH.jar は JAR ファイルの名前、/hadoopInstruction は args[0] 入力パラメーター、imageFeature.Main/ はメイン クラスの場所を指定します)。

./hadoop jar ./KLSH.jar /hadoopInstructions imageFeatures.Main/

これにより、次の出力が生成されます。

14/11/12 11:11:48 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/11/12 11:11:48 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
14/11/12 11:11:48 INFO input.FileInputFormat: Total input paths to process : 1
14/11/12 11:11:48 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/11/12 11:11:48 WARN snappy.LoadSnappy: Snappy native library not loaded
14/11/12 11:11:49 INFO mapred.JobClient: Running job: job_201411051030_0022
14/11/12 11:11:50 INFO mapred.JobClient:  map 0% reduce 0%
14/11/12 11:11:56 INFO mapred.JobClient: Task Id : attempt_201411051030_0022_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: imageFeatures.KLSHMapper
...

マッパークラスが見つからないため、エラーになります。「No job jar file set」という警告が出ますが、コードの最初のブロックで job.setJarByClass を指定したような気がするので、なぜこのエラーがスローされるのかわかりません...

次のコマンドを実行すると、KLSHMapper クラスが JAR にあることもわかります。

jar tf KLSH.jar

かなり多くの出力が得られますが、出力の一部を次に示します。

...
imageFeatures/Main.class
imageFeatures/Feature.class
imageFeatures/FileLoader.class
imageFeatures/KLSHMapper.class
...

明らかに KLSHMapper クラスがそこにあります... Hadoop クラスパスを変更して KLSH.jar パスを含めようとしました。KLSH.jar を DFS にコピーして、上のパスの代わりにそのパスを使用しようとしました。また、-libjars 指定子を使用してジョブを実行しようとしました。何を試しても、hadoop は Mapper クラスを見つけることができないようです。誰かが私が間違っていることを教えてくれますか? Eclipse で動作するコードから、実際の Hadoop クラスターで動作するようにジャンプすることはできないようです。ありがとう!

4

2 に答える 2

0

いくつかの追加作業の後、私は自分の問題を解決することができました。最終的には、Hadoop クラスターで実行しようとしていた jar ファイルを作成する方法にたどり着きました。

eclipse を使用して JAR ファイルをビルドする代わりに、コマンド ラインから Maven を使用して JAR ファイルをビルドしました。pom.xml ファイルでは、次の行に沿って何かを使用してメイン クラスを指定できます。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>maxTemp.MaxTemperature</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

私の場合、maxTemp はパッケージであり、MaxTemperature はメイン メソッドを含むクラスでした。これにより、maven がビルドする JAR 内に含まれるマニフェスト ファイルに、次の行が追加されます。

Main-Class: maxTemp.MaxTemperature

これで、hadoop を使用して jar ファイルを実行するときに、jar のマニフェストで既に行っているように、mainClass を指定する必要がなくなりました。JAR のマニフェストにこの行がないと、次の構文を使用してクラスターでジョブを実行する必要があります。

./hadoop jarFile [mainClass] args...

マニフェスト ファイルの行を使用すると、次のようにジョブを実行できます。

./hadoop jarFile args...

余談ですが、多少関連することですが、 jeigen Java ライブラリを使用して線形代数を実行していたため、いくつかの問題に遭遇しました。クラスターは、使用した依存関係 (jeigen.jar) を見つけることができず、さらにエラーをスローしていました。このサイトで説明されているように、私は太った瓶を作ることになりました:

http://hadoopi.wordpress.com/2014/06/05/hadoop-add-third-party-libraries-to-mapreduce-job/

pom.xml ファイルにいくつか追加することで、maxTemp-jar-with-dependencies を生成することができ、jar ファイルに含まれていたため、クラスターはすべての依存関係を見つけることができました。これが将来誰かの時間を節約するのに役立つことを願っています。これらの依存関係の一部は私のローカル システムにあり、Maven はそれらを取得することができませんでした。次のコマンドを使用して、maven をそれらに向け、手動でインストールすることができました。

mvn install:install-file -DgroupId=jeigen -DartifactId=jeigen -Dversion=1 -Dpackaging=jar -Dfile=/path/to/the/location/of/Jeigen.jar

これは、依存関係が含まれているものと含まれていないものの2つのjarを生成するpom.xmlファイルです。

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>maxTemp</groupId>
  <artifactId>maxTemp</artifactId>
  <version>0.0.1</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>

      <plugin>  
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>maxTemp.MaxTemperature</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
            <archive>
              <manifest>
                <mainClass>maxTemp.MaxTemperature</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>
                jar-with-dependencies
              </descriptorRef>
            </descriptorRefs>
          </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>
  <dependencies>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>1.2.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>1.2.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-tools</artifactId>
      <version>1.2.1</version>
    </dependency>

    <dependency>
      <groupId>jeigen</groupId>
      <artifactId>jeigen</artifactId>
      <version>1</version>
    </dependency>

    <dependency>
      <groupId>jna</groupId>
      <artifactId>jna</artifactId>
      <version>4.0.0</version>
    </dependency>

  </dependencies>
</project>
于 2014-11-16T19:41:03.560 に答える
0

ファイルのどこかにインポートステートメントがありますか:

import imageFeatures.KLSHMapper;

また、imageFeatures.KLSMapper を含む jar ファイルを CLASSPATH 環境変数に含める必要があります。これはあなたがここに持っている非常に奇妙で外国のコードなので、多分私は的外れです...

于 2014-11-12T19:40:43.807 に答える