组合任务概述

  • 一些复杂的任务很难由一个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任务完成才可以进行,导致集群利用率不高;无法实现多重依赖的关系(或者说多依赖关系的实现比较麻烦)。

package com.rzp.linemr;


import org.apache.hadoop.mapreduce.Job;

import java.io.IOException;

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

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

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

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

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

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

//TODO 创建Job
return null;
}
}

依赖关系组合式

  • 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失败后执行流失败等操作)

package com.rzp.linemr;

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

import java.io.IOException;

public class Demo2 {

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

boolean succeeded = false; //job执行流是否成功执行的标志位
try{
new Thread(jc).start();
while (!jc.allFinished()){
//没有执行完,继续进行
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}finally {
//停止执行
jc.stop();
if(jc.allFinished()&&jc.getSuccessfulJobList().size() == totalSize){
//全部执行完,而且执行成功job个数和总的job个数相等,那么任务job执行陈工
succeeded = true;
}
}
System.out.println("job执行"+(succeeded?"成功":"失败"));
}

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


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

链式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。

package com.rzp.linemr;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.lib.ChainMapper;
import org.apache.hadoop.mapred.lib.ChainReducer;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import java.io.IOException;

public class Demo3 {

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

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

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

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

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

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

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

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. What is the difference between shades and shadows?

    Shade is the darkness of an object not in direct light, while shadows are the silhouette of an objec ...

  2. 如何配置 GitHub 为个人的手机图床

    PicPlus 是一个手机端的图床上传工具,支持七牛云.阿里云.又拍云等主流图床配置,同时还支持配置 GitHub.码云作为自己的图床,如下所示: 这篇文章主要介绍如何在 PicPlus 中配置 Gi ...

  3. Linux下反弹shell笔记

    0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 —u 则 ...

  4. python 顺序读取文件夹下面的文件(自定义排序方式)

    我们在读取文件夹下面的文件时,有时是希望能够按照相应的顺序来读取,但是 file_lists=os.listdir()返回的文件名不一定是顺序的,也就是说结果是不固定的.就比如读取下面这些文件,希望能 ...

  5. Oracle设置和修改system和scott的口令,并且如何连接到system和scott模式下

    1.在Oracle数据库中,有个示例模式scott和系统模式system. 2.在安装数据库时只是设置了system的口令,即密码,如果忘记的话可以使用如下办法,首先打开sqlplus工具或者cmd命 ...

  6. hdu1213 并查集板子

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1213/ 并查集是一种支持合并与查找的数据结构,在森林中进行操作,加上路径压缩,合并和查找的时间复杂度几乎都是常数 ...

  7. ASP.NET动态网站课程设计——个人网页

    时光荏苒,岁月如梭,又是学期期末时,没错,我又来补课程设计了,hhh. 本文主要讲述如何在用H5+CSS3写的静态网站的基础上,结合ASP.NET动态网站开发,制作一个动态的个人网页. 首先需要熟悉一 ...

  8. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

  9. "xaml+cs"桌面客户端跨平台初体验

    "Xaml+C#"桌面客户端跨平台初体验 前言   随着 .Net 5的到来,微软在 .Net 跨平台路上又开始了一个更高的起点.回顾.Net Core近几年的成果,可谓是让.Ne ...

  10. [CS充实之路] CS50 WEEK 1

    前言 大学电子专业,幸好自学了JAVA,遂有幸工作了三年,但这期间一直在焦虑,一个是基础不扎实的担心,另一个是未来方向的不确定.去年开始终于下定决心,一方面走一遍CS之路,巩固知识体系,另一方面部署自 ...