MapReduce基础01

一、MapReduce基础

Map             映射函数(后面有案例)

Reduce        规约函数(后面有案例)

 

hadoop1.x  MR1(计算+资源作业调度)

JobTracker————作业调度

TaskTracher:map task reduce task————资源作业计算

 

hadoop2.x  MR2(计算)

资源作业调度-->YARN

1、不需要部署组件,在YARN上面部署

2、架构设计(面试题)

-->MR JOB提交到yarn的工作流程

-->yarn的架构设计、yarn的工作流程

 

二、架构设计

1、查看官网

2、MR1架构设计

这幅图就是MapReduce 1的工作原理。

我们可以看到里面有10个步骤,分别来看看这10个步骤都干了些什么。

  1. 客户端启动一个job。
  2. jobtracker请求一个新的作业ID。(getNewJobId()方法)
  3. 检查作业的输出说明并计算作业的输入分片,然后将运行作业所需要的资源都复制到以作业ID命名的目录下。
  4. 提交作业,告知jobtracker作业准备执行。(submitJob()方法)
  5. 初始化作业。创建一个表示正在运行作业的对象,用来封装任务和记录信息。
  6. 获取客户端计算好的输入分片,然后为每个分片创建一个map任务。在此步骤的时候还会创建reduce任务、作业创建任务、作业清理任务。
  7. tasktracker运行一个简单的循环来定期发送“心跳”给jobtracker,用来充当两者之间的消息通道。
  8. 准备运行任务。
    1. 作业的JAR文件本地化。从共享文件系统把作业的JAR文件复制到tasktracker所在的文件系统。
    2. tasktracker为任务创建一个本地工作目录,并把JAR解压到这。
    3. tasktracker创建一个TaskRunner实例。
  9. 启动一个新的JVM来运行每个任务。
  10. 运行map/reduce。

这就是经典的MapReduce的工作原理。

 

名词解释:

Client: 客户端

JobTracker : 主要负责 资源监控管理和作业调度。

a.监控所有TaskTracker 与job的健康状况,一旦发现失败,就将相应的任务转移到其他节点;

b.同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源.

 

yarn.nodemanager.resource.memory-mb:64*0.8G=50G

yarn.scheduler.minimum-allocation-mb: 1G

yarn.scheduler.maximum-allocation-mb: 1G 50/1=50 数量是多了,并行度大了  

 

TaskTracker是JobTracker与Task之前的桥梁

a.从JobTracker接收并执行各种命令:运行任务、提交任务、Kill任务、重新初始化任务;

b.周期性地通过心跳机制,将节点健康情况和资源使用情况、各个任务的进度和状态等汇报给

JobTracker.

 

Task Scheduler: 任务调度器(默认 FIFO,先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业)

 

Map Task: 映射任务

Reduce Task: 归约任务


3、MR2架构设计

(1)名词概念

作业=job=application

Container: 容器 ,Yarn组件。将一定的内存(1G cpu 1core)等资源抽象成一个小房间,用以运行任务。

机器的配置不能用满,要留20%给linux系统:

机器的物理配置  64G 16CORES: * 75-85%

Yarn拿到的资源: 64*0.8 16*0.8

总结:

生产上要知道怎么从执行的作业的大小来判断怎么去配置MR2的组件大小(反推)

例子:

假设一个作业200G

Container:

yarn.nodemanager.resource.memory-mb:64*0.8G=50G(总共64G,配置给yarn的资源只有50G)

yarn.scheduler.minimum-allocation-mb: 1G

yarn.scheduler.maximum-allocation-mb: 1G   

50/1=50个容器,分配的最大容量小,所以数量是多了,并行度大了,MarTask只需执行4轮(4*50=200),但如果其中某个作业太大,超过最大的容量1G,则有可能会kill线程。  

 

官方文档上yarn的默认配置:

yarn.nodemanager.resource.memory-mb

yarn.scheduler.minimum-allocation-mb                          1024 

yarn.scheduler.maximum-allocation-mb                          8192 (最大是8G,对接收的作业进行判断,超过1G则自动分配多1G

yarn.scheduler.minimum-allocation-vcores                         1 

yarn.scheduler.maximum-allocation-vcores                         4

 

vcore:虚拟core:物理core = 1 :2

 

参考资料:

http://blog.itpub.net/30089851/viewspace-2127851/

http://blog.itpub.net/30089851/viewspace-2127850/

(2)MR2工作逻辑图

1、用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster命令、用户程序等。

2、ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用

程序的ApplicationMaster。

3、ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7.

4、ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。

5、一旦ApplicationMaster申请到资源后,便与对应的nodeManager通信,要求它启动任务。

6、Nodemanager为任务设置好运行环境(包括环境变量,Jar包,二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

7、各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前状态。

8、应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

总结:

1、第一个阶段是启动ApplicationMaster

2、第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。


4、模拟案例

Wordcount:词频统计

原文件数据:

------------------|

jepson ruoze |

hero yimi xjp |

123               | 

a b a             |

------------------|

通过mapreduce计算出现的单词个数:

jepson,1

ruoze,1

hero ,1

yimi ,1

xjp,1

123,1

a,2

b,1

(1)直接通过hadoop命令打开mapreduce的jar包(命令不熟的话,敲一下hadoop会弹出提示)

 hadoop jar hadoop-mapreduce-examples-2.8.1.jar

(2)直接按照格式输入试试

hadoop jar hadoop-mapreduce-examples-2.8.1.jar wordcount 

没有文件输入到mapreduce,因此需要自建文件进行模拟。

(3)在hdfs里创建wordcount/input文件夹用于存放文件

hdfs dfs -mkdir -p /wordcount/input

报错:Namenode在安全模式

离开安全模式:

hdfs dfsadmin -safemode leave

hdfs dfs -mkdir -p /wordcount/input

(4)将文件上传到/input

hdfs dfs -put HBinz.log /wordcount/input

(5)使用mapreduce进行词频计算(巧用反斜杠\进行换行)

hadoop jar \

/opt/software/hadoop-2.8.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar \

wordcount \

/wordcount/input \

/wordcount/output1

(6)打开截图网址:http://hadoop001:8088/proxy/application_1534860561113_0001/

(7)展开ID的内容

(8)一定要会查看日志文件,找系统问题

(9)查看输出文件

hdfs dfs -ls /wordcount/output1

(10)查看文件

hdfs dfs -cat /wordcount/output1/part-r-00000

5、原理

Map Task 映射

Reduce Task 规约,合并计算:

shuffle:洗牌

mapreduce.job.maps        2

mapreduce.job.reduces    1

 

总结:

假如我们设定hdfs的块的大小是64mb,

如果我们输入有三个文件,大小分别是3mb、65mb和127mb,

那么mapreduce会把3mb文件分为一个输入分片(input split),

65mb则是两个输入分片(input split)而127mb也是两个输入分片(input split),

 

那么就会有5个map任务将执行,而且每个map执行的数据大小不均,运行时间不一致,会造成木桶效应,导致有些数据大的任务执行较慢影响整体计算效率。

这个也是mapreduce优化计算的一个关键点。

 

换句话说我们如果在map计算前,做输入分片调整,例如合并小文件,3mb+65mb+127mb=3.0x==4块

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值