1

私のマッパー コードでは、JTS.jar のサード パーティ ライブラリを使用しています。すべてのノードがアクセスできるように、hadoop の分散キャッシュに配置する必要があります。このリンクで、-libjars を使用してこれを行うことができることがわかりました。

私は今、自分のコードを実行します

hadoop jar -libjars JTS.jar my_jar.jar classname inputFiles outputFiles.

しかし、これは機能しません。これを修正する方法について何か提案はありますか?

4

3 に答える 3

0

別の努力で、私はこのリンクをたどろうとしました。

1)以下を使用してJarライブラリをhadoopにコピーしました。

hadoop fs -copyFromLocal JTS.jar /someHadoopFolder/JTS.jar

2)次に、構成を次のように変更しました。

        Configuration conf = new Configuration();

    Job job = new Job(conf);
    job.setJobName("TEST JOB");

    List<String> other_args = parseArguments(args, job);

    DistributedCache.addFileToClassPath(new Path("/someHadoopFolder/JTS.jar"), conf);

    job.setMapOutputKeyClass(LongWritable.class);
    job.setMapOutputValueClass(Text.class);

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

    job.setMapperClass(myMapper.class);
    //job.setCombinerClass(myReducer.class);
    //job.setReducerClass(myReducer.class);

    job.setInputFormatClass(TextInputFormat.class);   
    job.setOutputFormatClass(TextOutputFormat.class);


    String inPath = other_args.get(0);
    String outPath = other_args.get(1);     
    TextInputFormat.setInputPaths(job, inPath);
    TextOutputFormat.setOutputPath(job, new Path(outPath));

    TextInputFormat.setMinInputSplitSize(job, 32 * MEGABYTES);
    TextInputFormat.setMaxInputSplitSize(job, 32 * MEGABYTES);

    job.setJarByClass(myFile.class);

    job.waitForCompletion(true);

3)チュートリアルには、「マッパーでキャッシュされたファイルを使用する」と書かれているので、マッパーは次のようになります。

    public static class myMapper extends Mapper<LongWritable, Text, LongWritable, Text>{
       private Path[] localArchives;
       private Path[] localFiles;

       public void configure(Configuration conf) throws IOException {
         localArchives = DistributedCache.getLocalCacheArchives(conf);
         localFiles = DistributedCache.getLocalCacheFiles(conf);
       }



    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
            //ENVELOPE IS FROM THE JTS.JAR library
        Envelope e1 = new Envelope(-180, 85, 180, -85);
            context.write(key, value);

    }

}

これらすべてを実行したにもかかわらず、「Classboutfound」をスローすることでコードは失敗します。何か助けはありますか?

于 2012-07-13T03:31:41.973 に答える
0

私は少し遅れていると思いますが、これを行う 1 つの方法は、jar ファイルを Hadoop のインストール フォルダーにコピーすることです。として、/usr/local/hadoop/share/hadoop/common で XXX.jars (サードパーティの jar) を作成し、このファイルを外部 jar ファイルとして追加しました。

これで私の問題は解決しました。この方法でやりたくない場合は、エクスポート HADOOP_CLASSPATH=/XXX/example.jar:... に外部 jar ファイルのディレクトリ/ファイル パスを含める方法があります。

于 2015-01-21T19:06:25.117 に答える
0

コマンド ライン パラメータの正しい順序を使用してみてください。エラーメッセージはかなり示唆的だと思います。

hadoop jar my_jar.jar classname -libjars JTS.jar inputFiles outputFiles
于 2012-07-13T03:04:05.090 に答える