组合任务概述

  • 一些复杂的任务很难由一个MR处理完成,所以一般需要将其拆分成为多个简单的MR子任务来执行。

  • MapReduce框架中对于这类的问题提供了几种方式进行任务执行流程的控制,主要包括以下几种方式:

    • 顺序组合式MapReduce任务

      • 前一个执行完,后面再执行

    • 依赖关系组合式MapReduce任务

      • 前面有多个执行完,后面再执行

    • 链式MapReduce任务

      • 在Map之前或者Reduce之后增加处理

    • 其中顺序组合式MapReduce任务可以经过变形成为迭代式的MapReduce任务。

顺序组合式MapReduce任务

  • 多个MR任务作为一个串进行执行,前一个MR的输出作为后一个MR的输入,自动的完成顺序化的执行。

  • 顺序组合式MR中:

    • 每一个子任务都需要专门的设置独立的配置代码(其实就是和普通的MR是一样的)

    • 安装任务的执行顺序设置job的运行顺序

    • 任务完成后所有的中间结果输出目录都可以进行删除操作。

  • 格式: MapReduce1 -> MapReduce2 -> MapReduce3....,

  • 每个子任务都必须调用job.waitForCompletion(true)等待job执行完成才可以--就是前一个执行完成,后面才可以开始执行。

    优点:结构简单,容易实现。

    缺点:由于后一个MR任务必须等待前一个MR任务完成才可以进行,导致集群利用率不高;无法实现多重依赖的关系(或者说多依赖关系的实现比较麻烦)。

  1. package com.rzp.linemr;


  2. import org.apache.hadoop.mapreduce.Job;

  3. import java.io.IOException;

  4. //测试组合mr任务的案例:wordcount案例的输出结果是按照keyword字典排序进行输出,修改成按出现次数排序
  5. public class Demo1 {

  6. public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException {
  7. //按顺序创建job1,job2...
  8. Job job1 = createJobByTimes(1);
  9. Job job2 = createJobByTimes(2);
  10. //开始执行,这里执行顺序一定要和组合MR的Job的执行顺序一直

  11. runJob(job1,1);
  12. runJob(job2,2);
  13. System.out.println("Job执行成功");
  14. }

  15. //执行Job,执行失败抛出异常
  16. public static void runJob(Job job,int times) throws InterruptedException, IOException, ClassNotFoundException {
  17. if (!job.waitForCompletion(true)){
  18. throw new RuntimeException("第"+times+"个job执行失败");
  19. }
  20. }

  21. /**
  22. * 创建job根据给定的参数times
  23. * times = 组合式MR任务中第几个job
  24. */

  25. public static Job createJobByTimes(int times){
  26. //和普通MR的Job创建一样,从InputFormant开始到OutputFormat给定

  27. //TODO 创建Job
  28. return null;
  29. }
  30. }

依赖关系组合式

  • Hadoop框架为复杂的数据依赖关系提供了一种组合式MapReduce作业的执行流程机制。

  • 其实就是MR3依赖于MR1和MR2的结果,但是MR1和MR2不互相依赖,可以同时进行,而如果用顺序式就做不到。

  • Hadoop通过Job和JobControl类为这些作业提供具体的编程方法。

    • Job除了维护配置信息外,还需要维护子任务的依赖关系

    • JobControl类主要用来控制整个作业的执行过程。JobControl是一个Runnable子类,通过线程来调用start方法进行作业的执行流程控制。

  • Job完整类名为: org.apache.hadoop.mapred.jobcontrol.Job

  • JobControl完整类名为: org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl

  • 优点:实现相对而言简单,提高了集群利用率。

  • 缺点:需要自己实现job执行流管理(job失败后执行流失败等操作)

  1. package com.rzp.linemr;

  2. import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob;
  3. import org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl;
  4. import org.apache.hadoop.mapreduce.Job;

  5. import java.io.IOException;

  6. public class Demo2 {

  7. public static void main(String[] args) throws IOException {
  8. //调用createControlledJob()把mapreduce.Job(普通的job)转换为可控制的ControlledJob对象
  9. ControlledJob job1 = createControlledJob(createJobByTimes(1));
  10. ControlledJob job2 = createControlledJob(createJobByTimes(2));
  11. ControlledJob job3 = createControlledJob(createJobByTimes(3));
  12. //指定依赖关系--job3依赖于job1和job2
  13. //addDependinJob会返回Boolean,可以用于验证
  14. job3.addDependingJob(job1);
  15. job3.addDependingJob(job2);
  16. //开始创建job的执行流
  17. JobControl jc = new JobControl("测试依赖关系组合式");
  18. //添加job,没有顺序
  19. jc.addJob(job1);
  20. jc.addJob(job2);
  21. jc.addJob(job3);
  22. //总的job个数
  23. int totalSize = jc.getReadyJobsList().size();
  24. //开始执行job流
  25. //因为继承了Runnable接口,可以直接调用run方法
  26. //jc.run();
  27. //更推荐使用Thread来执行

  28. boolean succeeded = false; //job执行流是否成功执行的标志位
  29. try{
  30. new Thread(jc).start();
  31. while (!jc.allFinished()){
  32. //没有执行完,继续进行
  33. try {
  34. Thread.sleep(30000);
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }finally {
  40. //停止执行
  41. jc.stop();
  42. if(jc.allFinished()&&jc.getSuccessfulJobList().size() == totalSize){
  43. //全部执行完,而且执行成功job个数和总的job个数相等,那么任务job执行陈工
  44. succeeded = true;
  45. }
  46. }
  47. System.out.println("job执行"+(succeeded?"成功":"失败"));
  48. }

  49. //把mapreduce.Job(普通的job)转换为可控制的ControlledJob对象
  50. public static ControlledJob createControlledJob (Job job) throws IOException {
  51. ControlledJob cj = new ControlledJob(job.getConfiguration());
  52. cj.setJob(job);//惊醒设置
  53. return cj;
  54. }


  55. //和普通MR的Job创建一样,从InputFormant开始到OutputFormat给定
  56. public static Job createJobByTimes(int times){
  57. //TODO 创建Job
  58. return null;
  59. }
  60. }

链式MapReduce

  • 前两种方式都会有多个Job的启动和关闭,会消耗资源,而Map和Reduce都涉及IO操作,效率不高,因此可以使用链式MR。

  • 一个MR任务可能会有一些前处理和后处理,比如说文档倒序索引中可能前处理需要去掉一些“停用词”,后处理需要将一些同义词进行归并。

  • 链式MR:链式Mapper(ChainMapper)和链式Reducer(ChainReducer)来完成这种处理。这种作业的执行流程为:map1-->map2-...-->reducer-->map3-->map4-...

    • 链式MR要求一个链路中只能有一个reduce操作,可以有多个map操作。

  • 优点:对于前处理和后处理有要求的MR任务,减轻了操作,提高了效率。

  • 缺点:需要指定额外的参数信息(前两种方式,job本身写法和普通MR是一样的,只是在运行主程序上做了操作,但是这种就不同了)。

  • 创建完job后,需要使用hadoop提供的专门类设置链路中的map-reduce执行顺序。

    • 使用ChainMapper.addMapper添加Map阶段的mapper,按照添加顺序执行,

    • 在Reducer阶段必须先使用ChainReducer.setReducer添加reducer处理类,然后才可以使用ChainReducer.addMapper添加mapper处理类,也是按照添加顺序执行job。

  1. package com.rzp.linemr;


  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.mapred.JobConf;
  5. import org.apache.hadoop.mapred.Mapper;
  6. import org.apache.hadoop.mapred.lib.ChainMapper;
  7. import org.apache.hadoop.mapred.lib.ChainReducer;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

  10. import java.io.IOException;

  11. public class Demo3 {

  12. public static void main(String[] args) throws Exception {
  13. Configuration conf1 = new Configuration();
  14. Job job1 = Job.getInstance(conf1,"job1");
  15. job1.setJarByClass(Demo3.class);
  16. FileInputFormat.addInputPath(job1,new Path(""));

  17. /**
  18. * 设置mapper
  19. * klass 对应mapper类
  20. * K1, V1, K2, V2---klass对应的输入、输出的类型
  21. * mapperConf mapper使用的编写信息
  22. */

  23. //添加第1个mapper
  24. ChainMapper.addMapper(JobConf job,
  25. Class<? extends Mapper<K1, V1, K2, V2>> klass,
  26. Class<? extends K1> inputKeyClass,
  27. Class<? extends V1> inputValueClass,
  28. Class<? extends K2> outputKeyClass,
  29. Class<? extends V2> outputValueClass,
  30. boolean byValue, JobConf mapperConf);

  31. //添加第2个mapper
  32. ChainMapper.addMapper(JobConf job,
  33. Class<? extends Mapper<K1, V1, K2, V2>> klass,
  34. Class<? extends K1> inputKeyClass,
  35. Class<? extends V1> inputValueClass,
  36. Class<? extends K2> outputKeyClass,
  37. Class<? extends V2> outputValueClass,
  38. boolean byValue, JobConf mapperConf);

  39. //添加reducer
  40. //输入值和上面的一样
  41. ChainReducer.setReducer(...);

  42. //添加reducer后续Mapper
  43. //格式也和上面的一样
  44. //注意reducer
  45. ChainReducer.addMapper(...);

  46. //设置总的输入输出路径
  47. job1.setJarByClass(Demo3.class);
  48. //TODO 添加map和reduce的输出key和value的类型
  49. }
  50. }

Hadoop(十一):组合任务概述和格式的更多相关文章

  1. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据

    将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...

  2. hadoop排序组合键的使用情况

    于hadoop当处理复杂的业务,需要使用组合键,与单纯的复杂的继承Writable接口,但继承WritableComparable<T>接口.事实上.WritableComparable& ...

  3. 大数据入门第五天——离线计算之hadoop(上)概述与集群安装

    一.概述 根据之前的凡技术必登其官网的原则,我们当然先得找到它的官网:http://hadoop.apache.org/ 1.什么是hadoop 先看官网介绍: The Apache™ Hadoop® ...

  4. ebay商品基本属性组合成数据表格式,可用上传到系统递交数据

    该刊登表设计是利用VB写的,当时因为两个系统的数据不能直接对接,又copy并且组合SKU,一个表格一个表格填写,比较麻烦,还好刊登系统可以允许用excel表格上传数据 所以就下好模板,学了VB语言,在 ...

  5. Hadoop 3.1.1 - 概述 - 集群安装

    Hadoop 集群安装 目标 本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群.如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装). 本文并不包含诸如安 ...

  6. FineUI第十一天---布局概述

    布局概述 1.填充整个页面: 让整个容器填充整个页面,设置PageManager的AutoSizePanelID为需要填充整个页面的容器控件ID. 2. 填充整个容器(Fit): 让一个控件填满另一个 ...

  7. Hadoop -YARN 应用程序设计概述

    一概述        应用程序是用户编写的处理数据的统称,它从YARN中申请资源完毕自己的计算任务.YARN自身相应用程序类型没有不论什么限制,它能够是处理短类型任务的MapReduce作业,也能够是 ...

  8. HADOOP (十一).安装hbase

    下载安装包并解压设置hbase环境变量配置hbase-site.xml启动hbase检测hbase启动情况测试hbase shell 下载安装包并解压 https://mirrors.tuna.tsi ...

  9. hadoop(十一)HDFS简介和常用命令介绍

    HDFS背景 随着数据量的增大,在一个操作系统中内存不了了,就需要分配到操作系统的的管理磁盘中,但是不方便管理者维护,迫切需要一种系统来管理多态机器上的文件,这就是分布式文件管理系统. HDFS的概念 ...

随机推荐

  1. Go语言转义字符

    \a 匹配响铃符 (相当于 \x07) 注意:正则表达式中不能使用 \b 匹配退格符,因为 \b 被用来匹配单词边界, 可以使用 \x08 表示退格符. \f 匹配换页符 (相当于 \x0C) \t ...

  2. 数据结构 - List 接口

    简介 List接口继承自Collection接口,是Collection三大延伸接口之一.List中的元素都是有序的,并且都支持用索引访问.同时List中的元素允许重复. public interfa ...

  3. python安装包的3的方式

    1.pip pip install 包名 2.压缩包(针对pip安装不上) 1.下载源码解压(压缩包有setup.py) 2.python setup.py install 3.****.whl文件 ...

  4. MySQL第三章知识第一部分

    SQL的特点:是一个综合的.功能极强并且简洁容易学的语言. SQL的功能:数据查询.数据操纵.数据定义.数据控制. 数据库系统的主要功能是通过数据库支持的数据语言来实现. 菲关系模型(层次模型.网状模 ...

  5. Python生态_turtle库

    Python生态_turtle库: 绘制状态函数: pendown():别名pd(),落下画笔,之后,移动画笔将绘制形状 penup():抬起画笔 pensize():画笔粗细大小 颜色控制函数: p ...

  6. CTF_WriteUp_HTTP——302临时重定向问题

    HTTP--302临时重定向 题目描述 点击给出的链接后,没有发生任何变化. 解决方案 通过擦好看网络请求,可以发现发生了302临时跳转,所以我们无法通过浏览器直接访问未跳转的页面,而flag 可能藏 ...

  7. C 2013笔试题

    1.把整数分解成素数 如90=2*3*3*5 [见2015年] 方法一: int main() { int n, i=2; printf("\nInput:"); scanf(&q ...

  8. Android应用开发基本流程

    Android应用开发流程 应用规划及架构设计 开发应用程序的步骤 项目有哪些功能. 需要哪些必要的界面及界面之间跳转的流程. 需要的数据及其数据的来源和格式. 是否需要服务器端的支持. 是否需要本地 ...

  9. 洛谷 P3935 Calculating 题解

    原题链接 一看我感觉是个什么很难的式子-- 结果读完了才发现本质太简单. 算法一 完全按照那个题目所说的,真的把质因数分解的结果保留. 最后乘. 时间复杂度:\(O(r \sqrt{r})\). 实际 ...

  10. redhat7安装

    ------------恢复内容开始------------ 新建虚拟机向导(自定义) 指定虚拟机安装位置,把他放在固态硬盘提升他的运行速度(不推荐,一般将位置定为非系统盘) 选择系统镜像文件 开机选 ...