一、上次课程回顾
二、Hadoop五
三、作业
MapReduce主要分为Map+Reduce;会涉及代码编程:
Map --> 映射
Reduce --> 聚合
映射的举例如下:
select a+1 as a from t
a | a+1 |
---|---|
1 | 2 |
2 | 3 |
3 | 4 |
聚合的举例如下:
select id,count(0) from t group by id
1 1 2 3 4
本次课程主要涉及MapReduce2.X
Yarn:ResourceManager、NodeManager
1、MapReduce是run在Yarn上的,MR on Yarn的流程 <> 也叫mr 提交job <> MapReduce的架构设计.
我们使用ps -ef查看到的是进程,applications Manager -->应用程序管理器;resource scheduler --> 资源memory+cpu调度器;
在NodeManager中红框圈出的表示的是容器,container是虚拟的概念,属于NodeManager节点上专门用来计算MR、Spark计算的最小单元
MapReduce在run的时候分为map task和reduce task;
1、用户向Yarn提交应用程序(jar文件、sql),其中包括ApplicationMaster的主程序、启动ApplicationMaster的命令;应用程序也叫作业job、app、application
2、ResourceManager为该job分配第一个container容器,运行job的applicationMaster;
3、此时已经启动了一个MR App Master,主程序启动后就是它来干活了,App Master向Application Manager注册,这样就可以在我们的web界面查询到这个job的运行状态(直到整个作业结束都会有一个状态显示);
4、注册完了之后MR App Master主程序采用轮询的方式通过RPC协议向ResourceManager申请和领取资源;
5、一旦App Master拿到资源,就与对应的NodeManager进行通信,要求启动任务;
6、NodeManager为任务设置好运行环境(就是划分一块内存和CPU来运行app master),将任务启动命令写在一个脚本里,并通过该脚本启动任务task;
//比如在hadoop002的机器上启动一个Map Task,在hadoop003的机器上启动一个Map Task和一个Reduce Task。
//生产上并不一定是map task全部运行完了才会启动reduce task
7、各个task通过rpc协议向我们的App Master汇报自己的状态和进度,以此让App Master随时掌握各个task的运行状态,从而在task运行失败时重启任务;
8、当我们所有的map task、reduce task运行完了之后,向Applications Manager注销并且关闭自己。–> windwos上的状态就是finish和success的状态。
简述这个大的流程:
1、拿到每一组的单词,为它赋上一个1
比如传入值a b c,==> (a,1) (b,1) (c,1)
传入值a c d, ==> (a,1) (c,1) (d,1)
2、Reduce进行举例:
(a,1)(b,1)
在mapred-default.xml中,有两个参数决定了map数和task数:
name | value | description |
---|---|---|
mapreduce.job.maps | 2 | The default number of map tasks per job. Ignored when mapreduce.framework.name is “local”. |
mapreduce.job.reduces | 1 | The default number of reduce tasks per job. Typically set to 99% of the cluster’s reduce capacity, so that if a node fails the reduces can still be executed in a single wave. Ignored when mapreduce.framework.name is “local”. |
2、我们运行一遍wordcount词频统计:
1、命令如下:
oop@hadoop001 hadoop]$ hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.16.2/share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.16.2.jar wordcount /wordcount/input/wordcount.log /wordcount/output10
2、打印在控制台的内容如下:
Job Counters
Launched map tasks=1
Launched reduce tasks=1
//为什么只有一个task?
20/03/26 21:30:10 INFO input.FileInputFormat: Total input paths to process : 1
20/03/26 21:30:11 INFO mapreduce.JobSubmitter: number of splits:1
因为输入的路径下只有一个文件,所以map task只有一个;
3、我们测试:在这个hdfs目录下:/wordcount/input/wordcount1.log,多上传一个文件;再次进行词频统计,发现此时的map task是2;
Job Counters
Launched map tasks=2
Launched reduce tasks=1
map task:
1、log文件是86字节大小 1个块
map task 就是1份
===>
2、log 20字节 1个块
map task 就是2份
认为map task个数和文件的数量有关?这句话能达到80%准确率
===>
此时来了第三号文件:log 130m 2个块
map task是几份?
尽量在生产上控制一个文件的大小略微小于一个blocksize?
比如生产上规格是128M,文件差不多是120M
假如我们设定hdfs的块的大小是64mb,如果我们输入有三个文件,
大小分别是3mb、65mb和127mb,那么mapreduce会把3mb文件分为一个输入分片
(input split),65mb则是两个输入分片(input split)
而127mb也是两个输入分片(input split),
换句话说我们如果在map计算前做输入分片调整,
例如合并小文件,那么就会有5个map任务将执行,
而且每个map执行的数据大小不均,这个也是mapreduce优化计算的一个关键点。
???
应该在生产要考虑你的文件
是什么文件格式: txtfile orc parquet
压缩格式: gzip snappy lzo
Shuffle名词解析:洗牌
==> 把相同的牌洗给自己
面试题:Shuffle阶段是属于map阶段还是reduce阶段?
可以认为shuffle阶段是属于reduce阶段的,如下图map阶段的映射已经okay了;在做reduce聚合阶段之前,就相当于是把相同的key给搂到一起;
表一:null值 1kw
表二:null值 1w
那么最终的结果就是1kw x 1w,换言之,会存在一个节点撑爆了,全是(null,1);在这个节点就会慢的要死,存在夯住的状态,需要进行调优
1、整理mapreduce on yarn的工作流程:
2、整理文件格式有哪些,它们的优缺点?
3、整理压缩格式有哪些,优缺点
4、输入分片和map task的关系?
5、wordcount的解剖图
6、Shuffle的理解 (洗牌)