前置要看的博客:http://blog.itpub.net/30089851/viewspace-2095837/
一、MapReduce了解
:企业开发中不用,需要很多复杂的Java代码。
但是面试要用学习其它组件的一个参考。
是一个基于磁盘的框架:但是到了后期出现了基于内存的框架Spark;了解一个概念Shuffle;
MapReduce的计算框架主要由两个组成:Map映射、Reduce规约。
shuffle:洗牌
Map:映射 元素的个数,我们把单个结构映射成为<key,value>结构,键值对形式。
假设在hadoop001机器上的数据如下:
x -->(x ,1) key,value 键值对
y -->(y ,1)
x -->(x ,1)
Reduce:归约,(根据业务需求计算,计算出x,y,z出现的次数)
在hadoop002机器上:
x -->(x ,1)
y -->(y ,1)
在生产中,不可能是单台机器,肯定是分布式计算求和;
eg:在MySQL中有如下两个字段,用SQL语句统计出x,y,z 出现的次数:
name | value |
---|---|
x | 1 |
y | 1 |
z | 1 |
x | 1 |
select
name,sum(value)
from t
group by name;
二、container容器
:容器:运行在nodemanager节点机器上,是一个虚拟的概念。
将一定大小的内存和cpu vcore组成的最小单元
来运行我们需要计算的任务task。
它是YARN的资源调度的抽象概念:
举例eg:一大瓶桶装水29L
小瓶的规格29L 只能装1瓶 1container
小瓶的规格是8L 只能装3瓶 3container
http://blog.itpub.net/30089851/viewspace-2127851/
YARN中的CPU被划分为虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念;初衷是考虑到不同节点的CPU的性能可能不同,每个CPU的计算能力也是不一样的,比如某个物理CPU的性能是另一个物理CPU的两倍,这时候,你可以通过为第一个物理CPU多配置几个虚拟CPU来弥补这种差距
生产参数调优:影像以后生产作业开发:
正常机器都是物理core,在生产中物理core:虚拟core的比例默认为1:2,有些公司机器强劲不需要设置那就是1:1。
好处:将我们的计算能力充分利用起来,我们运行的task可以更多,即处理并行度更高。
三、MR on Yarn架构
:task:是在container环境中运行计算任务的
- 用户向yarn提交应用程序(job作业),其中包括applicationMaster(相当于主程序、入口类)、启动applicationMaster命令等等。
- ResourceManager会为该job分配第一个容器,并与对应的NodeManager通信,要求它在这么容器中启动job的MR applicationMaster程序。
- applicationMaster会向applicationsManager(作业管理者)注册,这样用户就可以直接在web界面查看job的整个的运行状态和日志。
- applicationMaster向Resource Scheduler(资源调度器)采用轮询的方式通过RPC协议申请和领取资源。返回的是一个资源信息列表(比如哪台机器启动多少内存、CPU);
- 一旦applicationMaster申请到资源之后,于是和NM节点进行通信,NodeManager拿到一个清单(启动多少内存、CPU)开始去设置启动。
- NodeManager为task任务设置好运行环境(环境变量、Jar包等等),将任务的命令写在一个脚本文件中,通过这个脚本去【启动任务】;
- 各个mapTask和reduceTask会通过RPC协议向applicationMaster汇报自己的进度,来让applicationMaster随时掌握各个任务的运行状况,任务失败重启container跑任务;在web界面也可以实时查看运行状态;
- 所有的任务完成后,applicationMaster向ResourceManager注销自己,告诉它自己是finish还是success状态;任务运行完成或,applicationMaster向RM注销并关闭自己.
在执行第六步 mapTask和reduceTask时,如果失败了会启动另一个容器继续跑;没有资源的话向ResourceScheduler去申请;作业列表很多而资源不够时,等mapTask运行到100是,这个任务释放,再在这个容器上跑其它任务。
四、提交jar的过程剖析
hadoop提交jar包到yarn上:
hadoop jar /home/hadoop/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wordcount/input /wordcount/ouput2
- 界面内容解读: number of splits:1 传入input文件夹下只有一个文件,ruozeinput.txt文件是35个字节,它只能是一个块,它远远小于128MB。
- MR application name相当于是一个主程序的命名
- INFO mapreduce.Job: The url to track the job: http://hadoop002:8088/proxy/application_1563439179887_0001/ 可以进入如下网址进行作业跟踪。
[hadoop@hadoop002 hadoop]$ hadoop jar /home/hadoop/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wordcount/input /wordcount/ouput2
19/07/20 05:50:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/07/20 05:50:46 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
19/07/20 05:50:53 INFO input.FileInputFormat: Total input paths to process : 1
19/07/20 05:50:54 INFO mapreduce.JobSubmitter: number of splits:1
19/07/20 05:50:55 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1563439179887_0001
19/07/20 05:50:59 INFO impl.YarnClientImpl: Submitted application application_1563439179887_0001
19/07/20 05:50:59 INFO mapreduce.Job: The url to track the job: http://hadoop002:8088/proxy/application_1563439179887_0001/
19/07/20 05:50:59 INFO mapreduce.Job: Running job: job_1563439179887_0001
19/07/20 05:51:33 INFO mapreduce.Job: Job job_1563439179887_0001 running in uber mode : false
19/07/20 05:51:33 INFO mapreduce.Job: map 0% reduce 0%
19/07/20 05:52:04 INFO mapreduce.Job: map 100% reduce 0%
19/07/20 05:52:20 INFO mapreduce.Job: map 100% reduce 100%
19/07/20 05:52:22 INFO mapreduce.Job: Job job_1563439179887_0001 completed successfully
19/07/20 05:52:22 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=41
FILE: Number of bytes written=223663
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=153
HDFS: Number of bytes written=58
HDFS: Number of read operations=6
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=27383
Total time spent by all reduces in occupied slots (ms)=13371
Total time spent by all map tasks (ms)=27383
Total time spent by all reduce tasks (ms)=13371
Total vcore-seconds taken by all map tasks=27383
Total vcore-seconds taken by all reduce tasks=13371
Total megabyte-seconds taken by all map tasks=28040192
Total megabyte-seconds taken by all reduce tasks=13691904
Map-Reduce Framework
Map input records=3
Map output records=6
Map output bytes=59
Map output materialized bytes=41
Input split bytes=118
Combine input records=6
Combine output records=3
Reduce input groups=3
Reduce shuffle bytes=41
Reduce input records=3
Reduce output records=3
Spilled Records=6
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=465
CPU time spent (ms)=4800
Physical memory (bytes) snapshot=412418048
Virtual memory (bytes) snapshot=5510770688
Total committed heap usage (bytes)=299368448
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=35
File Output Format Counters
Bytes Written=58
我们提交了作业,如果作业进入假死状态,那我们怎么把当前作业杀掉呢?
1、进入到如下目录:
[hadoop@hadoop004 bin]$ pwd
/home/hadoop/app/hadoop/bin
2、查看命令帮助:
[hadoop@hadoop004 bin]$ mapred job --help
3、mapred job -list //查看有无正在跑的job。
存在一个误区:生产上并不是map全部跑完了才开始跑reduce的,可能map跑了一半,reduce就开始跑了。
五、Shuffle剖析
:shuffle:洗牌,分为两个阶段:map->shuffle–>reduce
eg:
1、我们输入一组文本文件,文件大小为260M;所以该文件有3个block块;
2、Splitting(分割):我们把一个文件切割为3个文件,根据块来划分并行度。记住"输入并行度"按照块大小,比如:有10个文件,它是100个块就是100个并行度。
在我们hadoop jar提交wordcount时,他的并行度是1,因为只有一个文件一个块
3、Mapping(映射):(Deer,1) (Bear,1) (Fiver,1)
4、Shuffling:shuffle阶段也可以说是map和reduce的中间阶段,是通过网络把相同的key拉到同一个地方。简洁明了如下图:
5、Reducing(规约):相加
6、Final result:如图中,map task数是3个,最终的reduce默认是一个,所以输出是一个文件;这个怎么去看?
MapReduce参数配置:mapreduce.job.reduces 值为1,意味着输出文件就是只有一个。
官网mapreduce.job.reduces的描述:
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”.
**补充:**在hadoop jar提交word count程序运行mapreduce时:19/07/15 21:19:08 INFO mapreduce.JobSubmitter: number of splits:2;为什么此处的分片是2呢?因为参与word count的文件是两个,且大小都小于128M。
参见官网Map Reduce的代码:又长又臭:
http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v1.0