我有一个mapreduce jar文件,它需要JDK 1.8和一个安装并配置了JDK 1.7的Hadoop集群。
是否可以在不更改Hadoop配置的情况下运行我的jar(即不更改hadoopenv.sh)?
所有Hadoop节点都可以访问JDK1.8,我可以很容易地将JAVA_HOME更改为指向JDK1.8,但如果不更改Hadoop环境变量,这似乎不会有任何效果。
我已经考虑过用ProcessBuilder提交Hadoop作业,并从简单的Java程序中运行mapreduce作业,但还不清楚如何处理您通常拥有的作业配置。例如,我正在使用它来运行我的Hadoop作业:
hadoop jar MyJar.jar -libjars somelibrary.jar input_folder output_folder
我有我的主类(它是已经在jar清单中配置的入口点),它执行这样的作业配置:
public class MyJobMapReduce extends Configured implements Tool {
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new MyJobMapReduce(), args);
System.exit(res);
}
@Override
public int run(String[] args) throws Exception {
Configuration conf = this.getConf();
Job job = Job.getInstance(conf, "myjob");
String inputPath = args[0];
String outputPath = args[1];
String inputType = args[2];
boolean readFolder = Boolean.valueOf(args[3]);
boolean compressOutput = Boolean.valueOf(args[4]);
job.setNumReduceTasks(50);
// input
if (readFolder)
FileInputFormat.setInputDirRecursive(job, true);
FileInputFormat.addInputPath(job, new Path(inputPath));
job.setInputFormatClass(TextInputFormat.class);
// output
job.setOutputFormatClass(TextOutputFormat.class);
FileOutputFormat.setOutputPath(job, new Path(outputPath));
if (compressOutput) {
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
}
// entry point
job.setJarByClass(MyMapReduce.class);
// mapper
job.setMapperClass(BuildSyntacticTreeMapper.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(Text.class);
// reducer
job.setReducerClass(DataDumpReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
return job.waitForCompletion(true) ? 0 : 1;
}
}
附言:我的工作需要JDK1.8,因为我与-libjars一起使用的一个库需要它
我发现这实际上不需要对我的程序或任何自定义java启动器进行任何更改。帮助最大的是如何在hadoop中运行jar文件?并确定我的命令的hadoop-jar部分
hadoop jar MyJar.jar -libjars somelibrary.jar input_folder output_folder
实际上是这样做的,只是设置类路径。因此,使用与hadoop-env.sh:中配置的java版本不同的java版本在hadoop中运行jar
hadoop classpath
然后将输出与自定义java位置结合使用,从而生成
/usr/java/jdk1.8.0_45/bin/java -cp {output from hadoop classpath command}:/path/to/MyJar.jar com.my.SomeClass -libjars somelibrary.jar input_folder output_folder