Hadoop 04
1. MapReduce大致流程
大致分为五个阶段:map前 -> map -> shuffle -> reduce -> reduce后
各阶段做的操作如下:
map前
- InputFormat计算切片信息
- 建立临时目录
- 生成jobid
- 生成提交目录
- 将切片信息放入提交目录
- 将程序jar包放入提交目录
- 将xml配置文件放入提交目录
- 将提交目录内的内容发送给Yarn集群
- yarn根据切片等信息计算需要的资源
- 创建appmaster、maptask、reducetask进程
map
- maptask通过InputFormat的RecordReader向hdfs读取信息到map方法中
- 执行map方法中的逻辑
- 若是有自定义分区,输出的数据会加上分区号,否则分区号为0
shuffle
- map中数据出来后进入环形缓冲区
- 缓冲区内占满80%后,会进行一次排序并写入磁盘,新数据从缓冲区另一方向继续写入
- 当所有数据都处理完后,各文件会进行一次归并排序成一个文件,若有自定义combainer,此处会进行一次合并,浓缩数据
reduce
- 数据从各个maptask的宿主机通过网络向reducetask中按分区写入数据
- redustask内存不够则会持久到磁盘
- 所有数据接收完后,进行一次归并排序为一个文件
- 文件按组写入到reduce方法中供逻辑代码处理
reduce后
- 经过处理后的数据,通过OutputFormat输出到日志/数据库/文件中
2. MapReduce中可自定义的一些组件
按照数据流顺序如下
InputFormat
设置后的作用:
- 根据自己需要来自定义RecordReader读取数据到map中
Partioner
设置后的作用:
- 在map方法后,每一个数据会被添加一个分区号
- 有几个分区就会有几个reducetask
- reduce阶段开始时会将同一分区号的数据copy到对应的reducetask中
Combainer
设置后的作用:
- 在shffle阶段(map的后面阶段),环形缓冲区向磁盘溢写的时候会先combain一次,再溢写到磁盘
- 在shffle阶段(map的后面阶段),所有文件归并排序为一个文件之前会先combain一次,再归并排序为一个文件
- 注意:使用combainer需要保证结果不会被影响
OutputFormat
设置后的作用:
- 可自定义数据最后的流出方式
3. Mapper特点
- mapper中自己编写的逻辑代码执行之前,会运行一个setup方法,根据这个特性可以实现类似数据库中的join
- mapper中自己编写的逻辑代码执行之后,会运行一个cleanup方法
- 运行过程如:setup() -> map() //根据数据会多次执行 ->cleanup()
- setup() 和 cleanup() 在一个map阶段只会运行一次