Hadoop-在作业配置中设置自定义jdk路径/版本



我有一个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

最新更新