一、本质
MapReduce是一个基于分治思想,用于处理海量数据的分布式计算框架。
二、mapreduce解决了什么问题
1.数据分布式存储-HDFS
2.作业调度
3.容错
4.机器间通信等复杂问题
三、分布式计算vs单机计算
四、MapReduce执行流程
1.四个阶段
- Input到map:
①file:HDFS中,每个文件切分成多个一定大小(默认64M)的Block
②inputformat:经过数据分割(Data Splits)成记录
③split:多条记录的集合构成split,每个split包含后一个Block中开头部分(解决记录跨block的问题)
④Record Reader:每读取一条记录,调用一次map函数,直到split的尾部
2) map:
每条记录调用执行一次map()函数,就会在内存中增加数据
3) map到reduce (shuffle):
①Partitioner:决定数据由哪个Reducer处理,从而分区
如:{key, value}经过hash得到{partition, key, value}
②MemoryBuffer:每个map的结果和partition处理的结果都保存在缓存中
缓冲区大小:默认100M,溢写阈值:100M * 0.8 = 80M
③Spill:内存缓冲区达到阈值时,溢写spill线程锁住这80M的缓冲区,开始将
数据写出到本地磁盘中,然后释放内存。
④Sort:缓冲区数据按照key进行排序
⑤Combiner:预聚合,相同的key的数据,value值合并,减少输出传输量
-
reduce:
多个reduce任务输出的数据都属于不同的partition,因此结果数据的key不会重复,合并reduce的输出文件即可得到最终的结果。
2.map和reduce的设置
1) map
– map任务总数不超过平台可用的任务槽位
– map个数为split的份数,split几乎对应一个block,dfs.block.size决定block大小
- reduce
– mapred.reduce.task,默认为1
• reduce个数太少
单次执行慢,出错再试成本高
• reduce个数太多
shuffle开销大,输出大量小文件
- 集群控制
• 对单个MapReduce
Map个数最好为集群slot的倍数
Reduce个数最好为集群slot的个数、倍数
• 多个MapReduce
节奏控制
五、Hadoop Streaming
1.Strieaming的优点:
- 开发效率高
– 只需按照一定的格式从标准输入读取数据、向标准输出写数据就可以
– 容易单机调试:cat input | mapper | sort | reducer > output
- 程序运行效率高
– 对于CPU密集的计算,有些语言如C/C++编写的程序可能比用Java效率更高一些
- 便于平台进行资源控制
– Streaming框架中通过limit等方式可以灵活地限制应用程序使用的内存等资源
2.Streaming的局限:
1) Streaming默认只能处理文本数据
2) 两次数据拷贝和解析(分割),带来一定的开销
3.Streaming的开发要点:
- input:
指定输入文件的HDFS路径,支持使用*通配符和指定多个文件或目录,可多次使用
- output:
指定输出文件的HDFS路径,路径必须不存在,且具备创建该目录的权限,只能使用一次
- mapper:
用户自己写的mapper程序
- reduer:
用户自己写的reduce程序
- file:
打包文件到提交的作业中,
(1)map和reduce的执行文件,如run.sh
(2)map和reduce要用输入的文件,如配置文件
另外,还有-cacheFile, -cacheArchive分别用于向计算节点分发HDFS文件和HDFS压缩文件
- jobconf:
提交作业的一些配置属性,常见配置:
(1)mapred.map.tasks:map task数目
(2)mapred.reduce.tasks:reduce task数目
(3)stream.num.map.output.key.fields:指定map task输出记录中key所占的域数目
(4)num.key.fields.for.partition:指定对key分出来的前几部分做partition,而非整个key
(5)mapred.compress.map.output:map的输出是否压缩
(6)mapred.map.output.compression.codec:map的输出压缩方式
(7)mapred.output.compress:reduce的输出是否压缩
(8)mapred.output.compression.codec:reduce的输出压缩方式
网友评论