一、MapReduce编程模型
1. 中心思想: 分而治之
2. map(映射)
3. 分布式计算模型,处理海量数据
4. 一个简单的MR程序需要制定
map()、reduce()、input、output
5. 处理的数据放在input中、处理的结果放在output中
6. MR程序>八股文
7. MR在处理数据的时候,是由一个流向,数据在处理过程中的流向格式:
以<key,value>进行流向
8. input -> map() -> reduce() -> output
<key,value> <key,value> <key,value>
9. 思考几个问题
(1)要对处理的文件转化成什么样的<key,value>
input <key,value>
(2)map()输出结果变成什么样的<key,value>
map() <key,value>
(3)reduce() 输出的<key,value>是什么样的
reduce() <key,value>
10. 词频统计WordCount
11. <key,value>
(1)key就是偏移量,数字
Hadoop mapreduce -> <0, hadoop mapreduce>, value就是每一行的值
12. 统计单词:
(1)分割单词,按照空格进行分词
Hadoop mapreduce -> hadoop mapreduce
hadoop yarn
map()
<hadoop, 1> <mapreduce,1>
<hadoop, 1> <yarn, 1>
reduce()
将相同key的value累加到一起
<hadoop, list(1,1)>
<mapreduce, list(1)>
<hdfs, list(1)>
13. MapReduce八股文
reduce的输入就是map的输出,map的输出就是<key,value>
14. 默认情况是从文件中一行行读取,我们需要获取的是value的值
15. 分割单词
16. 把每一个单词都拿出来,一个个组成<key,value>
迭代for循环
17. 一个<key,value>就要调用一次方法
18. HDFS上一个map对应一个块、把握<key,value>
19. 打成jar包运行在yarn上
export->runnabl-jar-file->选择path和main函数类
二、MapReduce流程总结
1. 每个文件就是一个分片,对应一个块,将文件按行分割成<key,value>
2. 按照key的排序规则,默认情况下是自然排序,可以指定它的排序规则
3. map输出到reduce输入之前,这中间的过程会有一个排序
4. MR框架最大的功能就是:排序
5. 排序非常消耗机器的资源:内存、CPU
6. 排序完后,reduce就会去各个map进行拷贝
7. 强调几点:
(1)默认情况下,map输入的<key,value>是什么样的格式
key: 偏移量
value: 每一行的值
(2)map -> partition -> sort -> group -> reduce
分区规则,分到不同的reduce中
组合在一起,相同key的value放在一起,这里涉及到一个比较,
(3)reduce输出结果
默认情况下是reduce将key和value作为一行数据进行输出
key和value之间的分割符就是制表符(\t),这个也是可以设置的
三、数据类型
1. 无论是排序还是分组,都会有一个比较
四、MapReduce on YARN
1. 对于MR程序来说,运行在YARN上,必须先打成jar包
Container容器:
包含了任务所需要的资源
五、YARN如何调度应用
3 map task
1 reduce task
1 mr am
默认情况下,每个容器的资源,1G内存,1核CPU
默认配置:
yarn-default.xml
1. 内存配置
2. 单个任务最好CPU核数,默认是1核
minimum-allocation-vcores
3. 默认情况下nodemanager启动后,本机是默认8G内存和8核CPU
binding ***
hadoop.tmp.dir
四、MapReduce Shuffle
1. 打乱、洗牌:随机打乱我们传递的元素
2. shuffle过程:
map() 输出------>reduce输入
输入<keyvalue>
<0, hadoop spark, hdfs hadoop>
<hadoop,1> <spark,1> <hdfs,1> <hadoop,1>
map首先将结果放到内存中,100MB
环形缓冲区
当内存占用空间达到80%,(80MB,默认情况下),金辉将数据溢写spill到磁盘(本地磁盘目录)
分区: partitioner 决定map输出的数据,被哪个reduce任务进行处理
排序: sort 对分区中的数据进行排序
溢写: spill 写到本地磁盘的某个工作目录中
合并:merge 将很多个小文件合并成一个大文件
自定义缓冲区大喜而排序的规则,磁盘的目录,分区都是可以设置的
reduce端,为了reduce的输入做准备
reduce会去很多的map拷贝然后放到内存中
当内存达到一定大写,也会写到本地磁盘中,合并、排序
分组: group,将相同key的value放在一起
<hadoop,1> <hadoop,1> <hadoop,1> --> <hadoop,list(1,1,1)>放在一个集合中
判断key->比较->Comparable
五、MapReduce shuffle优化之combiner
map端的reduce操作,它是一个可选项,用户自定义
而且不是所有的MR程序都可以设置combiner
压缩:可配置项
200MB -> 80MB
实际环境中,压缩是必须要做的;对于集群的性能是一个提升
*-site.xml
合理的设置reduce的数目,会让MR程序跑的更快
数目设置多少为合理?
(1)根据业务需求
词频统计A-Z,a-z
(2)分组是否可以合并一些数据
(3)通过测试去设置reduce数目
分布式环境、HA(自动故障转移)