我有一个mapreduce jar文件,需要JDK 1.8和安装并配置了JDK 1.7的Hadoop集群。
是否可以在不更改Hadoop配置的情况下运行我的jar(即没有更改为hadoop-env.sh)?
所有Hadoop节点也可以访问JDK 1.8,我可以轻松地将JAVA_HOME更改为指向JDK 1.8,但是如果不更改Hadoop环境变量,这似乎没有任何效果。
我已经查看了submitting Hadoop job with ProcessBuilder和running mapreduce job from simple Java program,但是目前还不清楚如何处理您通常拥有的工作配置。 例如,我使用它来运行我的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;
}
}
P.S。我的工作需要JDK 1.8,因为我使用-libjars的其中一个库需要它。
答案 0 :(得分:2)
我设法发现这实际上并不需要对我的程序或任何自定义java启动器进行任何更改。最有帮助的是How to run a jar file in hadoop?并确定 hadoop jar 命令的一部分
hadoop jar MyJar.jar -libjars somelibrary.jar input_folder output_folder
实际上做了,这只是为了设置类路径。 因此,要在hadoop中运行一个jar,其java版本与hadoop-env.sh中配置的版本不同:
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