1

在我的映射器代码中,我使用的是 JTS.jar 的第 3 方库。我需要把它放在hadoop的分布式缓存中,以便所有节点都可以访问它。我在链接中发现 -libjars 可用于执行此操作。

我现在使用执行我的代码

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

但这不起作用。关于如何解决这个问题的任何建议?

4

3 回答 3

0

尝试使用正确的命令行参数顺序。我认为错误信息很有启发性。

hadoop jar my_jar.jar classname -libjars JTS.jar inputFiles outputFiles
于 2012-07-13T03:04:05.090 回答
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);

    }

}

尽管做了所有这些,代码仍然通过抛出“Class bout found”而失败。有什么帮助吗?

于 2012-07-13T03:31:41.973 回答
0

我想我有点晚了,这样做的一种方法是将jar文件复制到hadoop的安装文件夹下。因为,我在 /usr/local/hadoop/share/hadoop/common 中完成了 XXX.jars(第三方 jars),然后将此文件添加为外部 jar 文件。

这解决了我的问题,如果您不想这样做,另一种方法是将外部 jar 文件的目录/文件路径包含在 export HADOOP_CLASSPATH=/XXX/example.jar:...

于 2015-01-21T19:06:25.117 回答