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

时间:2015-10-28 07:55:31

标签: java hadoop mapreduce

我有一个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 ProcessBuilderrunning 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的其中一个库需要它。

1 个答案:

答案 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