MapReduce
MapReduce
AlexMapReduce Map
确定map任务数时依次优先参考如下几个方面:
- 每个map任务使用的内存不超过800M,尽量在500M以下
- 每个map任务运行时间控制在大约20分钟, 最好1-3分钟
- 每个map任务处理的最大数据量为一个HDFS块大小,一个map任务处理的输入不能跨文件
- map任务数总数不超过平台可用的任务槽位
map个数为split的份数
压缩文件不可切分
非压缩文件和sequence文件可以切分
dfs.block.size决定block大小,默认64
修改配置
vi ./config/hdfs-site.xml
配置加载问题
- 简单配置通过提交作业是-file分发
- 复杂较大的配置
- 传入hdfs
- map中打开文件读取
- 建立内存结构
Reduce
确定reduce任务数时依次优先参考如下几个方面:
- 每个reduce任务使用的内存不超过800M,尽量在500M以下
- 每个reduce任务运行时间控制在大约20分钟, 最好1-3分钟
- 整个reduce阶段的输入数据总量
- 每个reduce任务处理的数据量控制在500M以内
- map任务数与reduce任务数的乘机
- 输出数据要求
reduce个数设置
- mapred.reduce.tasks
- 默认1
reduce个数太少
- 单词执行慢
- 出错再试成本高
reduce个数太多
shuffle开销大
输出大量小文件
多个reduce任务输入的数据都属于不同的partition,因此结果数据的key不会重复。
合并reduce的输出文件即可得到最终结果
MapReduce 三要素
- copy、排序、计算
6个map+2个reduce = 8个进程空间
进程算子可能在一台机器,也可能在多台机器
MapReduce采用多进程而非多线程
- 优点:多进程方便资源控制调配
- 缺点:消费更多启动时间、时效性不高
- 适合批量操作、高通吐情况下、离线情况下
- 对比spark:spark更快、缺点:高并发难保证多任务运行在同一个进,会导致多个线程严重资源竞争,你那控制资源运行情况,相比spark没有MapReduce稳定
MapReduce物理配置
- 文件句柄数:
- ulimit
- cpu:
- 多核
- 内存
- 8G以上
- 合适的slot:
- 可理解为槽位
- 单机map、reduce个数
mapred.tasktracker.map.tasks.masimum
(默认2)mapreduce.tasktracker,tasks,reduce.maximum
(默认2)- 内存限制
- cpu合数-1
- 多集群分离
- 磁盘情况
- 合适单机多磁盘
- mapred.local.dir和dfs.data.dir
MapReduce InputFormat
- MR框架基础类之一
- 数据分割(Data Splits)
- mapReduce启动个数依赖于Split个数
- 切割保证句子完整性
- 记录读取器(Record Reader)
- 每读取一条记录,调用一次map函数
当有一个记录横跨两个block时会被阶段放到前面block去
会出现,有的split比block大,有的split比block小
- 每读取一条记录,调用一次map函数
Shuffle
- 包含: Partion,sort,Spill,Meger,Combiner,Copy,Memery,Disk…
- 性能优化大有可能的地方
- Partitioner:
- 决定数据由那个Reducer处理,从而分区
- 比如采用hash法,有n个Reducer,那么数据
{"area" : 1}
的key"area"
对n进行取模,返回m,而生成{partition,key,value}
###MemoryBuffer
- 内存缓存区,每个map的结果和partition处理的key value结果都保存在缓存中
- 缓冲区大小:默认100M
- 溢写阈值:100M*0.8 = 80M
- 缓冲区 Partition key value 三元组数据
1
2
3{“1”,“area”:1} ##第一个值是位置 reduce
{“2”,“at”:1}
{“1”,“we”:1}
Spil
- 内存缓冲区达到阈值时,溢写spill线程锁住这80M的缓冲区,开始将数据写出到本地磁盘中,然后释放内存
- 每次溢写都生成一个数据文件。
1
溢出的数据到磁盘都会对数据进行Key排序sort,以及合并combiner
- 发送相同Reduce的key数量,会拼接到一起,减少partition的索引数量。
Spilt
- 实际上每个split包含后一个block中开头部分的数据(解决记录跨Blokc问题)
- 例:比如记录
we are studying at hom.\n
跨越存储在两个Block中,那么这条记录属于前一个block对应的split
- 例:比如记录
Sort
- 缓冲区数据按照key进行排序
Spill & Sort
- 和map一样,内存缓冲满时,也通过sort和combiner,将数据溢写到硬盘文件中
- Reduce端的缓存设置更灵活,此时reduce函数未运行,也可以占用较大的内存
Combiner
- 数据合并,相同的key的数据,value值合并,减少输出传输量
- ComBiner函数事实上是reducer函数,满足combiner处理不影响
{sum,max等}
最终reduce的结果是,可以极大提升性能 - 部分的reducer提前在Combiner做了