HADOOP集群MAPREDUCE原理篇

87人阅读 评论(0) 收藏 举报
分类:

Mapreduce是一个分布式运算程序的编程框架是用户开发“基于hadoop的数据分析应用”的核心框架;

Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上;

 

1 为什么要MAPREDUCE

1)海量数据在单机上处理因为硬件资源限制,无法胜任

2)而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度

3)引入mapreduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理

 

设想一个海量数据场景下的wordcount需求:

单机版:内存受限,磁盘受限,运算能力受限

分布式:

1、文件分布式存储(HDFS

2、运算逻辑需要至少分成2个阶段(一个阶段独立并发,一个阶段汇聚)

3、运算程序如何分发

4、程序如何分配运算任务(切片)

5、两阶段的程序如何启动?如何协调?

6、整个程序运行过程中的监控?容错?重试?

可见在程序由单机版扩成分布式时,会引入大量的复杂工作。为了提高开发效率,可以将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑。

mapreduce就是这样一个分布式程序的通用框架,其应对以上问题的整体结构如下:

1、MRAppMaster(mapreduce application master)

2、MapTask

3、ReduceTask 


2、 MAPREDUCE框架结构及核心运行机制

2.1 结构

一个完整的mapreduce程序在分布式运行时有三类实例进程:

1MRAppMaster:负责整个程序的过程调度及状态协调

2mapTask:负责map阶段的整个数据处理流程

3ReduceTask:负责reduce阶段的整个数据处理流程

 

2.2 程序运行流程

流程示意图

.

流程解析

1、 一个mr程序启动的时候,最先启动的是MRAppMasterMRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程

2、 maptask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:

a)        利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV

b)        将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存

c)        将缓存中的KV对按照K分区排序后不断溢写到磁盘文件

3、 MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区) 

4、 Reducetask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同keyKV为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果数据输出到外部存储

 

3、并行度决定机制

maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度

那么,mapTask并行实例是否越多越好呢?其并行度又是如何决定呢?

 

mapTask并行度的决定机制

一个job的map阶段并行度由客户端在提交job时决定

而客户端对map阶段并行度的规划的基本逻辑为:

将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个mapTask并行实例处理

这段逻辑及形成的切片规划描述文件,FileInputFormat实现类的getSplits()方法完成,其过程如下图:


FileInputFormat切片机制

1、切片定义在InputFormat类中的getSplit()方法
2、FileInputFormat中默认的切片机制:

a)        简单地按照文件的内容长度进行切片

b)        切片大小,默认等于block大小

c)        切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

比如待处理数据有两个文件:

file1.txt    320M

file2.txt    10M

经过FileInputFormat的切片机制运算后,形成的切片信息如下: 

file1.txt.split1--  0~128

file1.txt.split2--  128~256

file1.txt.split3--  256~320

file2.txt.split1--  0~10M

3、FileInputFormat中切片的大小的参数配置

通过分析源码,在FileInputFormat中,计算切片大小的逻辑:Math.max(minSize, Math.min(maxSize,blockSize));  切片主要由这几个值来运算决定

minsize:默认值:

       配置参数: mapreduce.input.fileinputformat.split.minsize   

maxsize:默认值:Long.MAXValue 

    配置参数:mapreduce.input.fileinputformat.split.maxsize

blocksize

因此,默认情况下,切片大小=blocksize

maxsize(切片最大值):

参数如果调得比blocksize小,则会让切片变小,而且就等于配置的这个参数的值

minsize (切片最小值):

参数调的比blockSize大,则可以让切片变得比blocksize还大


选择并发数的影响因素:

1、运算节点的硬件配置

2、运算任务的类型:CPU密集型还是IO密集型

3、运算任务的数据量

4、 map并行度的经验之谈

如果硬件配置为2*12core+ 64G,恰当的map并行度是大约每个节点20-100个map,最好每个map的执行时间至少一分钟。

l  如果job的每个map或者 reducetask的运行时间都只有30-40秒钟,那么就减少该job的map或者reduce数,每一个task(map|reduce)的setup和加入到调度器中进行调度,这个中间的过程可能都要花费几秒钟,所以如果每个task都非常快就跑完了,就会在task的开始和结束的时候浪费太多的时间。

配置task的JVM重用[dht1] 可以改善该问题:

mapred.job.reuse.jvm.num.tasks默认是1,表示一个JVM上最多可以顺序执行的task

数目(属于同一个Job)是1。也就是说一个task启一个JVM

l  如果input的文件非常的大,比如1TB,可以考虑将hdfs上的每个block size设大,比如设成256MB或者512MB


5、 ReduceTask并行度的决定

reducetask的并行度同样影响整个job的执行并发度和执行效率,但与maptask的并发数由切片数决定不同,Reducetask数量的决定是可以直接手动设置:

//默认值是1,手动设置为4

job.setNumReduceTasks(4);

如果数据分布不均匀,就有可能在reduce阶段产生数据倾斜

注意:reducetask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1reducetask

尽量不要运行太多的reduce task。对大多数job来说,最好rduce的个数最多和集群中的reduce持平,或者比集群的reduce slots小。这个对于小集群而言,尤其重要。

 

6、 MAPREDUCE程序运行演示

Hadoop的发布包中内置了一个hadoop-mapreduce-example-2.4.1.jar,这个jar包中有各种MR示例程序,可以通过以下步骤运行:

启动hdfsyarn

然后在集群中的任意一台服务器上启动执行程序(比如运行wordcount):

hadoopjar hadoop-mapreduce-example-2.4.1.jar wordcount  /wordcount/data /wordcount/out


查看评论

Hadoop集群模式下运行Mapreduce任务

写了一个Hadoop权威指南中MapReduce处理天气数据的Demo一.MapReduce执行过程map前 map后 mapreduce流程图二.编写Mapper和Reducer类MaxTemp...
  • Chi_LaughingGor
  • Chi_LaughingGor
  • 2017年04月19日 17:18
  • 782

Hadoop学习---第三篇Hadoop的第一个Mapreduce程序

Mapreducer程序写了好几个了,但是之前一直都没有仔细的测试过本地运行和集群上运行的区别,今天写了一个Mapreduce程序,在此记录下来。  本地运行注意事项有以下几点: 1、本地必须配置好H...
  • zxl333
  • zxl333
  • 2015年05月30日 21:50
  • 837

MAPREDUCE原理篇

转载自:http://www.jianshu.com/p/21152050ff96 MAPREDUCE原理篇 MAPREDUCE概念 Mapreduce是一个分布式运算程序的...
  • weinierzui
  • weinierzui
  • 2017年05月29日 14:28
  • 325

MapReduce原理篇

简介Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架; Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布...
  • yangzheng0515
  • yangzheng0515
  • 2017年10月17日 18:17
  • 217

在eclipse上运行MapReduce程序

之前几次运行Hadoop程序,都是将Hadoop程序
  • zzu09huixu
  • zzu09huixu
  • 2014年07月21日 11:51
  • 1951

Hadoop集群内存优化

MapReduce map task 和reduce task 数量设置规则 1、map task的个数=输入文件总大小/分片尺寸。也就是说分片尺寸越大,map task的个数就越少=>系统执行的开...
  • cdl2008sky
  • cdl2008sky
  • 2018年01月10日 18:16
  • 178

windows下idea中搭建hadoop开发环境,向远程hadoop集群提交mapreduce任务

1.下载hadoop2.6.0-cdh5.6.1,解压并安装公司用的hadoop集群版本是hadoop2.6.0-cdh5.6.1,防止版本冲突,所有的hadoop版本号都用了这个。 下载地址:ht...
  • u014494857
  • u014494857
  • 2017年11月28日 15:28
  • 125

在myeclipse上连接hadoop-2.8.0 运行mapreduce程序

首先 hadoop集群是要先搭建的没的说。可以先在hadoop上运行自带的mapreduce jar包,跑一下,不成功说明配置文件没有配置好,这里就不说配置哪些了,网上很多。1.在windows下下载...
  • m0_37786447
  • m0_37786447
  • 2018年03月07日 18:47
  • 27

hadoop的集群copy

hadoop不同版本之间的集群复制。 1.基础 使用hadoop distcp 来进行集群间的数据复制。 2.实战 如果两个集群之间版本不一样,应该这样来复制。 hadoop  distcp...
  • joomlaer
  • joomlaer
  • 2013年09月05日 15:05
  • 3879

MapReduce 程序本地调试 / Hadoop 操作本地文件系统

将 hadoop 主目录下的 conf 下的配置文件全部置空. 此时运行 hadoop 命令将使用本地文件系统, 可以在本地运行 mapreduce 程序, 操作磁盘上的文件. 例如: kentH...
  • zklth
  • zklth
  • 2013年04月14日 12:04
  • 4029
    个人资料
    持之以恒
    等级:
    访问量: 458
    积分: 241
    排名: 31万+
    文章存档