尘世壹俗人 2025-03-28 00:35 采纳率: 81.3%
浏览 8
已结题

提交MR任务时任务参数无法在命令行携带吗

很久不手写MR代码了,最近集群要升级到3.x,先用测试集群搞了一下,写了一个MR测试,但是发现无法在hadoop jar提交任务的时候携带内存等调优参数,但是我记得以前-D携带是可以正常生效的,但是是版本问题吗?还是我忽略了什么配置?

hadoop jar ./test-1.0.jar com.wy.MR /input /output \
-Dmapreduce.map.memory.mb=2048 \
-Dmapreduce.map.java.opts=-Xmx1900m \
-Dmapreduce.map.cpu.vcores=3 \
-Dmapreduce.job.maps=2 \
-Dmapreduce.job.reduces=2
  • 写回答

4条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-03-28 00:36
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 用户遇到在使用hadoop jar提交MR任务时,无法通过传统的-D参数携带内存等调优参数,而以前是可以正常生效的。这可能涉及到Hadoop版本升级后参数传递方式的变化,或者集群配置的某些改变导致参数无法被正确识别。
    2. 解决方案:
      - 在Hadoop 3.x版本中,提交MR任务时携带参数的方式可能有所不同。一般来说,可以通过以下方式来设置任务参数:
      • 使用Configuration对象来设置参数。例如,在Java代码中,可以这样做:
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    public class MyMRJob {
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            // 设置内存相关参数等
            conf.set("mapreduce.map.memory.mb", "2048");
            conf.set("mapreduce.reduce.memory.mb", "4096");
    
            Job job = Job.getInstance(conf, "My MR Job");
            job.setJarByClass(MyMRJob.class);
    
            job.setMapperClass(MyMapper.class);
            job.setReducerClass(MyReducer.class);
    
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
    
            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
            System.exit(job.waitForCompletion(true)? 0 : 1);
        }
    }
    
     - 如果是在命令行提交任务,可以使用`hadoop jar your_jar.jar -Dmapreduce.map.memory.mb=2048 -Dmapreduce.reduce.memory.mb=4096...`这样的形式,其中`...`表示其他需要设置的参数。例如:
    
    hadoop jar my_mr_job.jar -Dmapreduce.map.memory.mb=2048 -Dmapreduce.reduce.memory.mb=4096 -input /input_path -output /output_path
    
    1. 不同方案优缺点:
      - 使用代码设置参数
      • 优点:代码中设置参数更加直观,适合在开发和调试过程中灵活配置参数,并且可以在代码中进行更复杂的参数处理逻辑。
      • 缺点:如果需要修改参数,需要重新编译代码,不够灵活。
      • 命令行设置参数
      • 优点:非常灵活,不需要重新编译代码就可以修改参数,适合在不同环境下快速调整任务配置。
      • 缺点:如果参数较多,命令行可能会比较冗长,容易出错。
    2. 总结:
      - 在Hadoop 3.x中,提交MR任务时携带参数可以通过代码中使用Configuration对象设置,也可以在命令行使用-D参数的形式。具体选择哪种方式,可以根据实际情况决定,如是否需要频繁修改参数、是否方便编译代码等。

    需要注意的是,确保参数的名称和值是符合Hadoop 3.x版本要求的,不同版本参数名称和含义可能会有所不同。同时,还要检查集群配置中是否有其他限制或冲突影响了参数的生效。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月1日
  • 创建了问题 3月28日