hadoop2.5.2学习06--MapReduce原理及操作2

    xiaoxiao2021-03-26  17

    主从机构

    主:jobtracker从:tasktracker

    MapReduce四个阶段:

    1、 Split

    数据上传到hdfs上以block的形式存在, 作为Split的数据,例如:wordcount按照行分割,将每行数据作为一个任务,交给map处理;

    2、 Mapper:key-value(对象)

    Split拆分的数据交给map,按照键值对形式, 如wordcount,每行数据的第一个字母的序号作为key,每行数据作为value,交由map处理。输出得到的也是键值对形式。

    3、 Shuffle

    a) 分区(partition,HashPartition:根据key的hashcode值 和 Reduce的数量 模运算),可以自定义分区,运算速度要快。一定要解决数据倾斜和reduce的负载均衡。b) 排序:默认按照字典排序。WriterCompartor(比较)c) 合并:减少当前mapper输出数据,根据key相同(比较),把 value 进行合并。d) 分组(key相同(比较),value组成一个集合)(merge)

    4、 Reduce

    a) 输入数据:key + 迭代器

    1、下图为MapReduce的计算架构

    map输出的数据,经过shuffle(洗牌), 形成键相同的一系列值, 作为reduce的输入

    2、wordcount的计算流程

    3、Mapper

     Map-Reduce的思想就是“分而智之”

    Mapper负责“分”, 把复杂的任务分解成若干个 “简单的任务”执行

     “简单任务”有几个含义:

    数据或计算规模较原任务要大大缩小 就近计算,即会分配到存放了所需数据的节点进行计算,移动计算,而不是移动数据这些小任务之间没有以来关系,可以并行计算

    3、Shuffler

    在mapper和reducer中间的一个步骤,包含4个过程:分区,排序,合并,分组,可以见mapper的输出按照某种key值重新切分,和组合;把key值符合某种范围的输出到特定的reduce那里处理。可以简化reduce的过程

    下图为shuffler的详细流程图

    shuffler为map输出到reduce输入

    map部分的shuffler: 首先map输出的数据首先存在内存中, 由于内存有限, 但达到一定阈值,数据即将溢出, 将数据写到磁盘中, 但是,在这之前, 首先要进行partition(使每个map输出的键值对都有一个分区号,将交由对应的reduce处理), sort(默认情况,对键进行字典排序), 然后spill to disk , 写到磁盘中,形成临时文件,当map task执行完了, shuffler会将所有的临时文件合并(merge),

    reduce部分的shuffler: 从各个map经由shuffle得到的数据(磁盘中合并后的文件),fetch(抓取)该reduce对应的分区的数据,优先放在内存中, 但是也会有溢写,需要再次进行排序,这个shuffle过程进行了两次排,font>排序之后进行分组,每组交由一个reduce处理。至此shuffler结束。

    4、MapReduce的Split大小

    max.split(100M)min.split(10M)block(hadoop1.x中为64M, 2.0中为128M)

    三者决定Split的大小:max(min.split, min(block, max.split)) 根据上面的公式可知:要么是一个碎片段就是一个block, 要么一个block被拆分成多个碎片段。 不可能出现一个碎片段由多个block组成:

    如果这两个block不在同一台机器上,就需要进行数据的拷贝。这违背了mapreduce的理念:移动计算而不移动数据。

    hadoop1.x与hadoop2x中的MapReduce区别:

    hadoop1.x中为jobtracker和tasktracker的主从架构 hadoop2.x中,运行在yarn架构中。为resourceManager和NodeManager主从架构。

    转载请注明原文地址: https://ju.6miu.com/read-659664.html

    最新回复(0)