MaReduce
MapReduce设计理念
何为分布式计算
移动计算,而不是移动数据
MapReduce四个阶段
1、Split(切数据)
2、Map(有多少个线程段,就有多少个map)
3、Shuffle(洗牌过程中【分组、排序、分区】,数据结构不改变,类似于打麻将,整理数据)
4、Reduce(洗牌后的数据,可以自定义reduce的数量,如果reduce的数量过少,会影响MapReudce的执行时间)
Mapper:
Map-reduce的思想就是"分而治之"
Mapper负责"分",即把复杂的任务分解为若干个"简单的任务"执行
"简单的任务"有几个含义:
数据或计算规模相对于原任务要大大缩小
就近计算,即会被分配到存放了所需数据的节点进行计算
这些小任务可以并行计算,彼此间几乎没有依赖关系
Reducer:
对map阶段的结果进行汇总
Redcuer的数目由mapred-site.xml配置文件里的项目mapred.reduce.tasks决定。
缺省值为1,用户可以覆盖之
Shuffle:
在mapper和reducer中间的一个步骤
可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里去处理
一个Split段的大小,不会超过一个block的大小
Hadoop计算框架Shuffle过程详解
每个map task都有一个内存缓冲区(默认是100MB),存储着map的输出结果
当缓冲区快满的时候需要将缓冲区的数据以临时文件的访问存放到磁盘
(Spill溢写是由单独线程来完成,不影响往缓冲区写map结果的线程(spill.percent,默认是0.8))
当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)
假如client设置过Combiner,那么现在就是使用Combiner的时候了。
将相同key的key/value对的value加起来,减少溢写到磁盘的数据量。(reduce1,word1,[8])
当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并(Merge),对于
MapReduce基本流程
MapReduce执行流程
map任务处理:
1> 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次函数
2> 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出
3> 对输出的key、value进行分区
4> 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中
5> (可选)分组后的数据进行归约
Reduce任务处理
1> 对多个map任务的输出,按照不同的分区,通过网络copy到不同reduce节点
2> 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value
处理,转换成新的key、value输出
3> 把reduce的输出保存到文件中
MapReduce编程模型
MapReduce将作业的整个运行过程分为两个阶段:Map阶段和Reduce阶段
Map阶段由一定数量的Map Task组成:
输入数据格式解析:InputFormat
输入数据处理:Mapper
数据分组:Partitioner
Reduce阶段由一定数量的Reduce Task组成:
数据远程拷贝
数据按照key排序
数据处理:Reducer
数据输出格式:OutputFormat
编写MapReduce程序
基于MapReduce计算模型编写分布式并行程序非常简单,程序员的主要编码工作就是实现Map和Reduce函数
其他的并行编程中的种种复杂问题,如分布式存储,工作调度,负载平衡,容错处理,网络通信等,均由YARN框架
负责处理
MapReduce八股文
MapReduce中,map和reduce函数遵循如下常规格式:
map:(k1,v1)->list(k2,v2)
reduce:(k2,list(v2))->list(k3,v3)
Mapper的接口:
protected void map(KEY key,VALUE value,Context context)throws IOException,InterruptedException{
}
Reduce的接口:
protected void reduce(KEY key,Iterable<VALUE> values,Context context)throws IOException,InterruptedException{
}
什么时候容易出现数据倾斜
reduce task的时候,有多个reduce task的时候,
数据倾斜:有一个reduce task计算量很大,其他的reduce task计算量很小