MapReduce执行流程详解

前置要看的博客: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 出现的次数:

namevalue
x1
y1
z1
x1

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环境中运行计算任务的
在这里插入图片描述

  1. 用户向yarn提交应用程序(job作业),其中包括applicationMaster(相当于主程序、入口类)、启动applicationMaster命令等等。
  2. ResourceManager会为该job分配第一个容器,并与对应的NodeManager通信,要求它在这么容器中启动job的MR applicationMaster程序。
  3. applicationMaster会向applicationsManager(作业管理者)注册,这样用户就可以直接在web界面查看job的整个的运行状态和日志。
  4. applicationMaster向Resource Scheduler(资源调度器)采用轮询的方式通过RPC协议申请和领取资源。返回的是一个资源信息列表(比如哪台机器启动多少内存、CPU);
  5. 一旦applicationMaster申请到资源之后,于是和NM节点进行通信,NodeManager拿到一个清单(启动多少内存、CPU)开始去设置启动。
  6. NodeManager为task任务设置好运行环境(环境变量、Jar包等等),将任务的命令写在一个脚本文件中,通过这个脚本去【启动任务】;
  7. 各个mapTask和reduceTask会通过RPC协议向applicationMaster汇报自己的进度,来让applicationMaster随时掌握各个任务的运行状况,任务失败重启container跑任务;在web界面也可以实时查看运行状态;
  8. 所有的任务完成后,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

  1. 界面内容解读: number of splits:1 传入input文件夹下只有一个文件,ruozeinput.txt文件是35个字节,它只能是一个块,它远远小于128MB。
  2. MR application name相当于是一个主程序的命名
  3. 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值