0

私はhadoopでページランクアルゴリズムを使用しようとしていますが、ジョブの初期化に問題があります。

Jobクラスを使用して初期化しようとすると、コンパイル時に次のエラーが発生します。

スレッド「main」の例外java.lang.NoClassDefFoundError:org / apache / commons / logging / LogFactory at org.apache.hadoop.mapreduce.Job。(Job.java:89)at Pagerank.main(Pagerank.java:244)

コードは次のとおりです。

Job job;
job = new Job();
job.setJarByClass(Pagerank.class);      // In what class are our map/reduce functions for this job found?
job.setMapperClass(PRMap.class);        // What is our map function for this job?
job.setReducerClass(PRReduce.class);    // What is our reduce function for this job?

job.setOutputKeyClass(Text.class);              // What are the (hadoop.io compliant) datatype for our
job.setOutputValueClass(Text.class);            // reducer output's key-value pairs?
job.setInputFormatClass(TextInputFormat.class);     // How will the mapper distinguish (key value) record inputs?
FileInputFormat.addInputPath(job, new Path(args[0])); // First command line argument
FileOutputFormat.setOutputPath(job, new Path("temp0"));
job.waitForCompletion(true);

JobConfクラスを使用して初期化を行おうとすると、使用されているいくつかのメソッドの引数に関するエラーが発生します。

コードは次のとおりです。

     JobConf conf = new JobConf(Pagerank.class);
     conf.setJobName("pagerank");

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

     conf.setMapperClass(PRMap.class);
     conf.setReducerClass(PRReduce.class);

     conf.setInputFormat(TextInputFormat.class);
     conf.setOutputFormat(TextOutputFormat.class);

     FileInputFormat.setInputPaths(conf, new Path(args[0]));
     FileOutputFormat.setOutputPath(conf, new Path(args[1]));

     JobClient.runJob(conf);

エラーによると:

JobConfクラスのメソッドsetMapperClassは、指定されたタイプには適用できません。

必須:クラスはマッパーを拡張します

見つかった:クラスPRMap

理由:実際の引数Class PRMapをClassに変換できませんか?メソッド呼び出し変換によってMapperを拡張します

私が書いたPRMapクラスはHadoopによるMap関数標準に従っているのに、setMapperClassの引数としてPRMap.classを渡すことができないようです。

public static class PRMap extends Mapper<LongWritable, Text, Text, Text>
{ ... }

これらの2つのアプローチに関するアドバイスはありますか?

4

4 に答える 4

1

この行をメイン メソッドに追加します。

DistributedCache.addFileToClassPath(new Path("<Absolute Path>/common-loggings.jar"), conf);
于 2013-02-08T05:52:15.690 に答える
1

org.apache.commons.Logging.LogFactory jar を含む jar をすべてのマシンの HadoopHome の Lib ディレクトリに配置して、クラスターを再起動してみてください。

または、コマンド ラインから libjars オプションを使用して jar を追加してみてください。なので:

hadoop jar myjar.jar package.classname -libjars mypath/common-loggings.jar

于 2013-02-08T04:22:02.807 に答える
0

PRMapクラスがorg.apache.hadoop.mapreduce.Mapperhttp://hadoop.apache.org/docs/mapreduce/current/api/org/apache/hadoop/mapreduce/Mapper.htmlと必要なクラスを拡張しているように見えますJobConfを介して渡されるのは、org.apache.hadoop.mapred.Mapperのサブクラスである必要があります。

java.lang.NoClassDefFoundErrorの問題を修正するには、commons-logging-xxxjarをクラスパスに追加します。

hadoopクラスパスを実行して、jarが表示されるかどうかを確認します。

于 2013-02-08T04:26:35.963 に答える
0

これは、Mapper がLogFactoryの一部であるを見つけることができないためですcommon-loggings.jar。そのためには、すべてのクライアント マッパーがアクセスできるようにする必要があります。jar をすべてのマシンにコピーするか、他の効率的な方法として分散キャッシュにコピーします。

$bin/hadoop fs -copyFromLocal mylib.jar /myapp/mylib.jar
And accessing it from you code
DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job);

詳細はこちら

于 2013-02-08T09:17:47.707 に答える