6.3.2 MapReduce2.X
-
yarn的加入
- 2.X开始使用Yarn(Yet Another Resource Negotiator)另一种资源协调者,来统一管理资源,
- 以后其他的计算框架可以直接访问yarn来获取当前集群的空闲节点
-
client
- 客户端发送任务到集群
- 如RM、spark、flink等
- 客户端发送任务到集群
-
ResourceManager组件
- 定义:
- 资源协调框架的管理者,负责整个集群的资源管理和分配
- 分类:
- 分为主节点和备用节点(防止单点故障)
- 主备节点的切换基于Zookeeper进行管理
- 分为主节点和备用节点(防止单点故障)
- 作用:
- 监控ApplicationMaster的运行情况和NodeManager的资源情况
- 时刻与NodeManager保持心跳,接受NodeManager汇报当前节点的资源情况
- 当有外部框架要使用资源的时候,直接访问ResourceManager即可
- 比如说有MR任务时,先去ResourceManager申请资源,ResourceManager根据汇报相对灵活分配资源
- 资源在NodeManager1时,NodeManager1要负责开辟资源
- 监控ApplicationMaster的运行情况和NodeManager的资源情况
- 定义:
-
NodeManager组件
-
资源协调框架的执行者
- 负责集群中每个节点的资源以及使用,运行任务
-
每一个DataNode上默认有一个NodeManager
-
NodeManager汇报自己的信息到ResourceManager
-
-
Container
- 2.X资源单位
- 包括CPU,内存等
- Container中的资源是动态分配的
- 2.X资源单位
-
Application
- 我们提交给yarn需要运行的应用程序
- 如RM,spark,flink等
- 我们提交给yarn需要运行的应用程序
-
ApplicationMaster组件
-
定义:
- 本次JOB任务的主导者
-
作用:
- 对集群中的某个应用程序进行管理
- 向RM申请资源
- 负责调度本次被分配的资源Container并监控任务
-
当所有的节点任务全部完成,application告诉ResourceManager请求杀死当前ApplicationMaster的线程
-
本次任务所有的资源都会被释放
-
-
RPC
- Remote Procedure Call ,yarn中各个组件间的通信采用的RPC机制
-
Task(MapTask–ReduceTask)
-
为了完成application,需要完成多个任务,按照MR的流程执行业
- 分为Map task和Reduce task
-
当任务完成时,ApplicationMaster接收到当前节点的回馈
-
- 注意:
- RM主要对资源进行管理以及分配,不负责task,但是会监控AM的运行情况,如果AM运行失败的话,会重新分配Container,然后重启AM
- NM负责该节点容器的资源使用情况,不监控task
- AM主要申请资源,然后分配任务给相应的NM,同时监控task的运行情况,如果任务失败,那么会重新申请资源,在新的container中运行task
- 我们提供的jar包来运行MapReduce时,其中的应用作业的配置文件,jar包等都是通过HDFS分配到各个节点的
6.3.3 MapRedujarce 2.X 的工作流程☕️
从整体层面上看,有五个独立的实体:
- 客户端,提交 MapReduce 作业。
- YARN 资源管理器(YARN resource manager),负责协调集群上计算机资源的分配。
- YARN 节点管理器(YARN node manager),负责启动和监视集群中机器上的计算容器(container)。
- MapReduce的 application master,负责协调MapReduce 作业的任务。MRAppMaster 和 MapReduce 任务运行在容器中,该容器由资源管理器进行调度(schedule)[此处理解为划分、分配更为合适] 且由节点管理器进行管理。
- 分布式文件系统(通常是 HDFS),用来在其他实体间共享作业文件。
工作流程具体内容
自我理解步骤:
- 首先客户端向HDFS发来一个请求,这个请求经过yarn之后被分配给RM(ResourceManager)这个资源协调框架的管理者,然后由RM来向下面的NM(NodeManager)来完成相应的请求
- 接受请求之后,RM会创建一个ApplicationMaster进程来给告诉他要完成哪些请求
- 然后ApplicationMaster会检查NodeManager下面的资源情况,查看谁有空闲的Container,接着给这些Container的NodeManager资源协调框架的执行者发出一个指令,告诉他们去给他们下面的Container去执行实际的请求
- 当Container完成了NodeManager发来的请求时,MR会杀死ApplicationMaster这个进程,然后资源被释放,请求完成
书籍借鉴步骤:
在yarn框架中执行一个MapReduce程序时,从提交到完成需要经历如下8个步骤
-
用户编写客户端应用程序,向yarn提交应用程序,提交的内容包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
-
yarn中的ResourceManager负责接收和处理来自客户端的请求,然后ResourceManager里面的调度器会为应用程序分配一个容器Container。同时。ResourceManager的应用程序管理器会与该容器所在的NodeManager通信,为该应用程序在该容器中启动一个ApplicationMaster
-
ApplicationMaster被RM创建后,首先会向ResourceManager注册,从而使得用户可以通过ResourceManager来直接查看应用程序的运行状态,接下来的4-7步骤是具体的应用程序的执行过程
-
ApplicationMaster采用轮询的方式用过RPC协议向ResourceManager申请资源
-
ResourceManager以“容器”的形式向提出申请的ApplicationMaster分配资源,一旦ApplicationMaster申请到资源,就会与该容器所在的NodeManager进行通信,要求他启动任务。
-
当ApplicationMaster要求启动任务时,他会为任务设置好运行环境(包括环境变量,jar包等),然后将任务启动命令写到一个脚本中,最后通过在容器中运行该脚本来启动任务
-
各个任务通过某个RPC协议向ApplicationMaster汇报自己的进度和状态,让ApplicationMaster可以随时掌握各个任务的运行状态,从而可以在任务失败时重启任务
-
应用程序完成后,ApplicationMaster向ResourceManager的应用程序管理器注销并关闭自己,若ApplicationMaster因故障失败,ResourceManager中的应用程序管理器会检测到失败的情形,然后将其重新启动,直到所有的任务执行完毕。
书籍网上资料参考:
[YARN体系结构工作流程介绍【大数据文章】 (itcast.cn)](
🔖 Day10-MapReduce详解
重点掌握
1、MR2.x中的Yarn架构与作用
2、MR的HelloWorld程序的实现与执行理解
1、第一个MapReduce的Job实现
2、Map和Reduce泛型参数
3、WordCount实现与Jar包执行
4、源码分析之前置讲解
5、源码分析之Split切片相关
6、源码分析之Map数据读取相关
7、源码分析之KvBuffer-Partitioner-Sort-Spill-Merge
6.4 Hadoop搭建yarn环境
NameNode01 | NameNode02 | DateNode | ZKFC | ZooKeeper | JournalNode | ResourceManager | NodeManager | |
---|---|---|---|---|---|---|---|---|
Node01 | √ | √ | √ | √ | √ | √ | √ | |
Node02 | √ | √ | √ | √ | √ | √ | ||
Node03 | √ | √ | √ | √ | √ |
*yarn环境搭建需要基于前面的HA环境
6.4.1切换工作目录
- [root@node01 ~]# cd /opt/yjx/hadoop-3.1.2/etc/hadoop/
6.4.2修改集群环境
-
[root@node01 hadoop]# vim hadoop-env.sh
oot@node01 hadoop]# vim hadoop-env.sh 5.3. 修改配置文件 [root@node01 hadoop]# vim mapred-site.xml ##继续添加用户信息 export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_ZKFC_USER=root export HDFS_JOURNALNODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
6.4.3 修改配置环境
-
[root@node01 hadoop]# vim mapred-site.xml
<!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 指定mapreduce jobhistory地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>node01:10020</value> </property> <!-- 任务历史服务器的web地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node01:19888</value> </property> <!-- 配置运行过的日志存放在hdfs上的存放路径 --> <property> <name>mapreduce.jobhistory.done-dir</name> <value>/history/done</value> </property> <!-- 配置正在运行中的日志在hdfs上的存放路径 --> <property> <name>mapreudce.jobhistory.intermediate.done-dir</name> <value>/history/done/done_intermediate</value> </property> <property> <name>mapreduce.application.classpath</name> <value> /opt/yjx/hadoop-3.1.2/etc/hadoop, /opt/yjx/hadoop-3.1.2/share/hadoop/common/*, /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/*, /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/*, /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/*, /opt/yjx/hadoop-3.1.2/share/hadoop/mapreduce/*, /opt/yjx/hadoop-3.1.2/share/hadoop/mapreduce/lib/*, /opt/yjx/hadoop-3.1.2/share/hadoop/yarn/*, /opt/yjx/hadoop-3.1.2/share/hadoop/yarn/lib/* </value> </property>
-
[root@node01 hadoop]# vim yarn-site.xml
<!-- 开启RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-yjx</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分别指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node01</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node03</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>node01:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>node03:8088</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>node01:2181,node02:2181,node03:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 开启日志聚合 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>86400</value> </property> <!-- 启用自动恢复 --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 制定resourcemanager的状态信息存储在zookeeper集群上 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- Whether virtual memory limits will be enforced for containers. --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>3</value> </property>
6.4.4 拷贝到其他节点
[root@node01 hadoop]# scp yarn-site.xml mapred-site.xml root@node02:`pwd`
[root@node01 hadoop]# scp yarn-site.xml mapred-site.xml root@node03:`pwd`
6.4.5 开启集群
- [123]zkServer.sh start
- [root@node01 hadoop]# start-dfs.sh
- [root@node01 hadoop]# start-yarn.sh
- [root@node01 hadoop]# mr-jobhistory-daemon.sh start historyserver
6.4.6 关闭服务并关机拍摄快照
- [1]stop-all.sh
- [1]mr-jobhistory-daemon.sh stop historyserver
- [123]zkServer.sh stop
- [123]shutdown -h now