复习
序列化 – Writable
序列化/反序列化机制:在MapReduce中,一个对象要想进行传输,那
么这个对象对应的类必须实现Hadoop提供的序列化接口 - Writable - 只
需要将按序写出
控制分区 – Partitioner
分区 - Partitioner:默认是按照键的哈希码进行分区,但是实际使用过程
中需要手动指定分区情况,就需要写一个类继承Partitioner来指定分
区。— 每一个分区会对一个ReduceTask
合并数据 – Combiner
Combiner - 合并。在Map任务结束后,会产生大量的数据,如果将这些
数据直接交给reduce会增加reduce的任务量,所以可以先将map之后的
数据进行一次合并,再交给reduce进行最后的规约
排序 – Comparable
排序 - 在Hadoop中, 在Map任务结束后,会按照键进行排序,如果需要
手动指定排序规则,那么就需要对象对应的类实现Comparable接口
MR的执行流程
MapReduce的组成
Hadoop1.0/Hadoop2.0 所对应的名称
JobTracker/ResourceManager : 管理任务
TaskTracker/NodeManager : 执行任务
问题 :
- ExitCode=-107… — 当前系统缺少了dll文件依赖
- 环境变量问题 : NativeIO$… — 将%HADOOP_HOME%/bin — 写成Hadoop的具体路径
Shuffle
MapTask
- 获取到切片(FileSplit)信息
- 读取具体的数据块(Block)
- 每一个切片对应一个MapTask
- 按行读取数据
- 每一行数据会调用一次map方法 , 进行处理
- map方法在执行完成之后会产生k-v结构 , 这个数据会存在缓冲区中
- 缓冲区默认大小事100M , 缓冲区中还会有一个阈值 — 80% — 就意味着如果缓冲区使用达到了80%的时候,认为缓冲区满了
1> 获取到切片(FileSplit)信息
2> 每一个切片对应一个MapTask
3> 读取具体的数据块(Block)
4> 按行读取数据
5> 每一行数据会调用一次map方法,进行处理
6> map方法在执行完成之后会产生k-v结构,这个数据会存在缓冲区中
7> 在缓冲区中会进行partition/sort/combine
8> 缓冲区默认大小是100M,缓冲区中还会有一个阈值—80% — 就意味着如果缓冲区使用达到了80%的时候,认为缓冲区满了
9> 如果缓冲区满了,就会将缓冲区中的数据写到磁盘的文件中,过程称为Spill(溢写),写出的文件称之为溢写文件
10> 每一个溢写文件中的数据是分好区且排好序
11> 每一次Spill过程都会产生一个新的溢写文件,所以所有的溢写文件从整体上不是分区且排序的
12> 在交给ReduceTask之前,会对所有的溢写文件进行一次合并— merge
13> 合并之后的文件是对所有的数据进行了整体的分区并且排序
注意 :
1> Spill过程不一定发生
2> 如果产生了Spill过程,且最后一次的数据不足阈值,将最后一次的缓冲区中的数据flush到最后一个溢写文件中
3> 切片的大小和溢写文件的个数不是对等的
4> 达到缓冲区的80%的时候会Spill到溢写文件中,理论上Spill文件应该是80M,实际上溢写文件一定是80M么?— 不一定 ①要考虑最后一次的flush;②要考虑序列化的因素
5> 如果溢写文件的个数>=3个,在merge的时候会再进行一次combine过程
6> 每一个MapTask对应一个缓冲区
7> 缓冲区本质上是一个字节数组
8> 缓冲区是一个环形缓冲区,为了重复利用缓冲区
9> 阈值的作用:①防止数据覆盖②防止写入过程的阻塞
ReduceTask
1> ReduceTask通过http请求来访问对应的MapTask获取到分区的数据 —fetch - fetch线程数量默认是5
2> 获取到不同的MapTask的数据之后,会对数据进行merge,将数据合并(将相同的键所对应的值放入一个迭代器中)且排序(根据键进行排序)
3> 每一个键调用一次reduce方法来进行处理
4> 将处理之后的数据写到HDFS中
注意:
1> merge因子:确定每次将几个文件合并一次。默认是10。如果文件个数<merge因子,直接合并
2> ReduceTask的阈值:ReduceTask不是等所有的MapTask都结束之后才启动执行,而是在一定数量的MapTask结束之后就开始启动抓取数据。—5% — 当5%的数量的MapTask结束之后,ReduceTask就开始启动抓取数据
调优
1.可以调大缓冲区,一般建议是250~400M之间
2.可以适当的增加combine过程
3.在map过程中会产生一个最后merge好的文件,通过网络发送给ReduceTask — 可以将文件进行压缩,压缩之后再发送 — 如果网络带宽比较稀缺,这个时候可以考虑压缩