赞
踩
一、hadoop mapreduce 过程理解
(1)分片(split)操作
该部分不属于map和reduce的主要过程,但是是整个计算框架比较消耗时间的一部分,为map做数据准备。
split只是将源文件的内容分片形成一系列的 InputSplit,每个 InputSpilt 中存储着对应分片的数据信息(例如,文件块信息、起始位置、数据长度、所在节点列表…),每个InputSplit 都由一个 mapper 进行后续处理。
每个分片大小参数是很重要的,splitSize 是分片规则很重要的一个参数,该参数由三个值来确定:
set mapred.max.split.size=256000000; #每个Map最大输入大小,超过此阈值则被分片,不足则单独放着
set mapred.min.split.size.per.node=100000000; #一个节点上split的最小输入大小
set mapred.min.split.size.per.rack=100000000; #一个交换机下split的最小输入大小
set hive.input.format=org.apache.Hadoop.hive.ql.io.CombineHiveInputFormat; #执行Map前进行小文件合并在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定。
mapred.min.split.size.per.node决定了多个data node上的文件是否需要合并~
mapred.min.split.size.per.rack决定了多个交换机上的文件是否需要合并~
数据格式化(Format)操作:
将划分好的 InputSplit 格式化成键值对形式的数据。其中 key 为偏移量,value 是每一行的内容。值得注意的是,在map任务执行过程中,会不停的执行数据格式化操作,每生成一个键值对就会将其传入 map,进行处理。所以map和数据格式化操作并不存在前后时间差,而是同时进行的。(此处不理解)
(2)map过程
根据用户指定的map过程,MapReduce 尝试在数据所在机器上执行该 map 程序。在 HDFS中,文件数据是被复制多份的,所以计算将会选择拥有此数据的最空闲的节点。
在上图中,把Mapper任务的运行过程分为六个阶段。
第二阶段是对输入片中的记录按照一定的规则解析成键值对,有个默认规则是把每一行文本内容解析成键值对,这里的“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容。
第三阶段是调用Mapper类中的map方法,在第二阶段中解析出来的每一个键值对,调用一次map方法,如果有1000个键值对,就会调用1000次map方法,每一次调用map方法会输出零个或者多个键值对。
第四阶段是按照一定的规则对第三阶段输出的键值对进行分区,分区是基于键进行的,比如我们的键表示省份(如北京、上海、山东等),那么就可以按照不同省份进行分区,同一个省份的键值对划分到一个区中。默认情况下只有一个区,分区的数量就是Reducer任务运行的数量,因此默认只有一个Reducer任务。
第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值 对<2,2>、<1,3>、<2,1>,键和值分别是整数。那么排序后的结果 是<1,3>、<2,1>、<2,2>。如果有第六阶段,那么进入第六阶段;如果没有,直接输出到本地的linux 文件中。
第六阶段是对数据进行归约处理,也就是reduce处理,通常情况下的Comber过程,键相等的键值对会调用一次reduce方法,经过这一阶段,数据量会减少,归约后的数据输出到本地的linxu文件中。本阶段默认是没有的,需要用户自己增加这一阶段的代码。
(3)reducer 过程
包括以下几个步骤:
(4)Shuffle 派发:
Shuffle 过程是指Mapper 产生的直接输出结果,经过一系列的处理,成为最终的 Reducer 直接输入数据为止的整个过程。这是mapreduce的核心过程。
该过程可以分为两个阶段:
参考文章:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。