在我的映射器代码中,我使用的是 JTS.jar 的第 3 方库。我需要把它放在hadoop的分布式缓存中,以便所有节点都可以访问它。我在此链接中发现 -libjars 可用于执行此操作。
我现在使用执行我的代码
hadoop jar -libjars JTS.jar my_jar.jar classname inputFiles outputFiles
.
但这不起作用。关于如何解决这个问题的任何建议?
尝试使用正确的命令行参数顺序。我认为错误信息很有启发性。
hadoop jar my_jar.jar classname -libjars JTS.jar inputFiles outputFiles
在另一项努力中,我尝试关注此链接。
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”而失败。有什么帮助吗?
我想我有点晚了,这样做的一种方法是将jar文件复制到hadoop的安装文件夹下。因为,我在 /usr/local/hadoop/share/hadoop/common 中完成了 XXX.jars(第三方 jars),然后将此文件添加为外部 jar 文件。
这解决了我的问题,如果您不想这样做,另一种方法是将外部 jar 文件的目录/文件路径包含在 export HADOOP_CLASSPATH=/XXX/example.jar:...