MapReduce框架学习(3)——Job的创建及配置

本文深入解析Hadoop MapReduce作业的配置流程,从Job对象的创建到作业的提交运行,涵盖代码打包、函数设置、数据类型及路径指定等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考: JeffreyZhou的博客园
《Hadoop权威指南》第四版

0

一个MR作业,包括三点:

  • 输入数据
  • MR程序
  • Job配置信息

前面两篇学习了数据格式和MR过程(map函数和reduce函数),那么今天再讲一下配置信息,是怎么把 数据 和 程序结合起来的。

3.1 代码

Job对象指定作业执行规范,我们可以用它来控制整个作业的运行。打算对照代码来讲解,这样可能要有逻辑一点,不至于讲到最后都不知道自己的线索在哪。先贴上WordCount中的Job任务代码:

public static void main(String[] args) throws Exception {
	Configuration conf = new Configuration();   // 配置文件
	// System.out.println("url:" + conf.get("fs.default.name"));  // deprecated
	// System.out.println("url:" + conf.get("fs.defaultFS"));
	
// 获取一个作业
	// Job job = new Job(conf, "word count");  // deprecated
	Job job = Job.getInstance(conf,"wordcount");  // 用job的静态方法
// 设置job所用的那些类(class)文件在哪个jar包
	job.setJarByClass(WordCount.class);
// 设置所用的map reduce类
	job.setMapperClass(TokenizerMapper.class);
	job.setCombinerClass(IntSumReducer.class);  // 对每个节点的map输出进行combine
	job.setReducerClass(IntSumReducer.class);  // 对所有节点的输出进行reduce

// 设置数据输出类型
	job.setOutputKeyClass(Text.class);
	job.setOutputValueClass(IntWritable.class);
// 指定要处理的输入、输出路径,
	//此处输入/出为固定文件目录
	FileInputFormat.addInputPath(job, "input");
	FileOutputFormat.setOutputPath(job, "output");
	//此处为参数
	// FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
	// FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
	
// 将job提交给集群运行
	System.exit(job.waitForCompletion(true) ? 0 : 1);

那么,现在对照上面的代码来分析作业提交到执行的整个过程吧。

3.2 创建Job

任务创建比较容易,其实就是new一个实例,先创建一个配置文件的对象,然后将配置文件,以及作业名称作为参数,构造一个Job对象就行了

Configuration conf = new Configuration();   // 配置文件
Job job = Job.getInstance(conf,"wordcount");  // 用job的静态方法

3.3 打包作业

我们在Hadoop集群上运行这个作业时,要把代码打包成一个JAR文件(Hadoop在集群上发布这个文件),关于打包JAR,大概意思就是把程序运行所需要的包啊类啊啥的,全部形成一个压缩包,但这个工作不用我们自己去一个个找,只要在Job对象的setJarByClass()方法中传递一个类即可,Hadoop会利用这个类来查找包含它的JAR文件,进而找到相关的JAR文件。

// 将job所用的那些类(class)文件,打成jar包
job.setJarByClass(WordCount.class);

3.4 设置各个环节的函数

这个很好理解,上一篇博文分析了MR过程中的各个环节,这些环节都是可以自定义的,就是在Job里面设置,将自定义的函数和具体作业联系起来。

job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);  // 对每个节点的map输出进行combine
job.setPartitionerClass(MyPartitioner.class); // 对每个节点的map输出进行partition
job.setReducerClass(IntSumReducer.class);  // 对所有节点的输出进行reduce

3.5 设置输入输出数据类型

job.setInputFormatClass(MyInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

3.6 设置输入输出文件目录

在设置输入输出文件目录时,可以选择使用绝对目录,就是直接在语句中写入目录;也可以使用参数输入,即在运行程序时,再在控制台输入目录。

// 指定要处理的输入、输出路径,
	//此处输入/出为固定文件目录
	FileInputFormat.addInputPath(job, "input");
	FileOutputFormat.setOutputPath(job, "output");
	//此处为参数
	// FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
	// FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

3.7 提交并运行作业

单个任务的执行

可以直接使用语句:

job.waitForCompletion(true)

waitForCompletion()方法提交作业并等待执行完成,该方法唯一的参数是一个标识,指示是否已生成详细输出,当标识为true(成功)时,作业会把其进度写到控制台。
–《Hadoop权威指南》第四版,28页

多个任务执行

多个任务的话,就有多种组织形式,例如串行、并行、无关、组合。如下图:

在这里插入图片描述
图中,Job2和Job3将会等Job1执行完了再执行,且可以同时开始,而Job4必须等Job2和Job3同时结束后才结束。

这个组合,就可以采用这样的代码来实现:

Configuration conf = new Configuration();
Job job1 = new Job(conf, "job1");   //.. config Job1
Job job2 = new Job(conf, "job2");   //.. config Job2
Job job3 = new Job(conf, "job3");	//.. config Job3
Job job4 = new Job(conf, "job4");	//.. config Job4
 
//添加依赖关系
job2.addDependingJob(job1);
job3.addDependingJob(job1);
job4.addDependingJob(job2);
job4.addDependingJob(job3);
 
JobControl jc = new JobControl("jbo name");
jc.addJob(job1);
jc.addJob(job2);
jc.addJob(job3);
jc.addJob(job4);

jc.run();

3.x 后记

这里讲的其实偏向于作业的编程方面,但是在程序中把这些都设置好了,提交给集群后,又是怎样的运行机制呢?这个就是关于application mastermap task等方面的分析了。

MapReduce job是指通过MapReduce框架进行并行计算的任务。在MapReduce任务中,数据被分割成若干逻辑片段,并由多个map任务并行处理。每个map任务将数据进行处理和转换,并输出键值对。然后,这些键值对根据键进行排序和合并,并由多个reduce任务并行处理。每个reduce任务将相同键的值进行聚合和处理,最后输出最终结果。 在配置MapReduce任务时,可以设置map任务槽和reduce任务槽的数量。任务槽是指集群能够同时运行的map和reduce任务的最大数量。可以根据集群的规模和需求,设置每台机器最多可以同时运行的map和reduce任务的个数,决定了任务槽的数量。通常来说,建议设置reduce任务数量为reduce任务槽的0.95到1.75倍。 在MapReduce任务的执行过程中,数据的切片和处理也是关键。一般情况下,切片的大小应与数据节点的切块大小一致,以避免数据的拷贝和网络传输的影响。此外,为了减少带宽的影响和网络传输,常见的做法是将jobtracker和namenode放在同一台机器上,并将datanode和tasktracker放在同一台机器上,尽量减少数据的拷贝和网络传输的开销。 另外,为了减少网络传输的开销和提高性能,可以使用combine函数进行本地合并数据的操作。combine函数用于在map任务本地对输出的键值对进行合并,以减少网络I/O操作的消耗。可以通过设置combine函数来指定reduce函数为combine函数,从而实现本地合并的功能。 总结来说,MapReduce job是通过MapReduce框架进行并行计算的任务。任务括map和reduce两个阶段,数据被切片、处理和合并,并最终输出结果。在配置任务时,可以设置任务槽数量和使用combine函数来优化任务的执行效率和减少网络传输的开销。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MapReduce编程job概念原理](https://blog.youkuaiyun.com/weixin_33739627/article/details/86115820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Hadoop学习——MapReducejob机制和job链介绍](https://blog.youkuaiyun.com/wohaqiyi/article/details/85316531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值