- MR:数据处理的编程模型
MR原理
- 输入文切割(默认按照最大切片(Long最大值),最小切片(>=1),块大小取(默认128M)三者中间值),形成k-v,并发执行。
- k-v进入map,执行map函数
- shuffle:根据map的输出,利用缓冲写到内存。根据reduce个数进行预分区、预排序,其结果在网络间分发(suffer),作为reduce的输入。
- 复制map的输出文件,合并,执行reduce函数,生成最终文件。
MR本地作业运行机制(源码分析)
调用waitForCompletion()后
- 提交作业,调用内部提交方法,作业提交器根据本地/集群模式获取作业id。作业提交器复制配置信息。作业提交器计算切片个数(map个数)。作业提交器生成作业配置文件,作业切片文件到临时目录。作业提交器把作业提交给本地/集群。
- 将作业转换成内部作业提交(是一个线程的子类),执行作业的run()
- 获取切片元数据,计算切片数,得到map任务集合,通过线程池执行map任务。得到reduce任务集合,执行reduce任务。
- 最终通过反射运行自己实现的类(通过配置文件,找到自己实现类的类名)
MR集群作业运行机
- 向资源管理器请求新的application 的id
- 将作业(切片信息,配置信息,jar包)拷贝到hdfs
- 资源管理器启动一个AppMaster,Appmaster检索作业信息(从hdfs)获取并发度(map个数)),向资源管理器请求资源列表(。
- APPMaster联系相应个数节点管理器 。节点管理器启动虚拟机,启动yarn子进程。子进程读取切片信息(第几个切片、从哪开始读,到哪结束、等),执行map和reduce任务
全排序和二次排序
全排序
对reduce所有输出结果进行排序
-
定义1个reduce
缺点:数据倾斜 -
自定义分区函数
缺点:不知道海量数据的分布
-
hadoop全排序分区+采样机制
对输入文件采样 合理划分分区
使用采样器,通过输入文件生成分区文件。使用全排序类,应用分区文件,进行分区。
二次排序
对value排序
(想获得所有年份中,温度最高所在年份)
步骤:
- 组合key(实现writeComparble)
- 自定义分区类
按照年份分区(同一年份进入同一个reduce - 定义排序对比
- 定义分组对比器
Hadoop MR的连接(join)
能够执行大型数据集间的连接操作
map端连接
前提:小表、reduce数量相同,建相同
步骤:将小表放入内存,放到map任务的内存中(hashmap)。扫描大表的时候检查hashmap相同的key连接输出。
reduce端连接
步骤:map端做标。
缺点:由于要经过shuffle,所以低效。
实现代码
半连接
步骤:在map端过滤掉不参加join的数据
其他
- Hadoop 将作业分成若干任务(task)执行,包括map任务、reduce任务。
- 任务运行在集群的节点上,通过YARN进行调度。
- haddop将map的输入数据分成等长数据块,称为输入分片。合理的分片大小趋向于hdfs的一个块大小(128M)。
- map的结果会存在硬盘上,作业完成后将其删除。
- combiner函数
- 位于map的输出端和reduce的输入端中间,有利于优化MR计算(减少了map端和reduce端的数据传输)
- combiner函数通过reduce函数实现。
相关问题
-
如何减少Hadoop Map端到Reduce端的数据传输量
1.使用combiner函数
2.减少map个数(修改参数)
3.减少reduce个数 -
reduce个数的选择
目标reduce保持在每个运行5分钟左右、且至少产生一个HDFS块的输出合适