YARN NodeLabel功能以及在EMR弹性伸缩中的应用

简介: YARN Node Label功能最早是在Hadoop 2.6版本中引入,在后续版本中有更多的功能完善。到了Hadoop 2.8.x版本之后,该功能已经比较完整,可以满足日常使用。在本文中,我们需要将Node Label功能应用在EMR弹性伸缩场景中。 其实Node Label特性更准确的叫法是Node Partition,也就是说通过label把YARN集群中的节点分组,每个节点拥有一个l

YARN Node Label功能最早是在Hadoop 2.6版本中引入,在后续版本中有更多的功能完善。到了Hadoop 2.8.x版本之后,该功能已经比较完整,可以满足日常使用。在本文中,我们需要将Node Label功能应用在EMR弹性伸缩场景中。

其实Node Label特性更准确的叫法是Node Partition,也就是说通过label把YARN集群中的节点分组,每个节点拥有一个label,通过调度器的配置,将作业Task调度到指定的节点中,如果节点没有配置Label,那么这个节点属于Label为DEFAULT的Partition。Hadoop 3.2之后加入的Node Attribute功能是更加灵活的方案,可以方便的给各个节点打上OS/kernel version/CPU architecture/JDK version等标签,但这个功能在本文中就不展开了。更多关于Node Label的信息请参考Hadoop YARN PMC Wangda的文章

配置

首先需要给YARN服务打开NodeLabel功能,yarn-site.xml需要增加配置:

  1. yarn.node-labels.enabled -> true
  2. yarn.node-labels.fs-store.root-dir -> /yarn/node-label

保存后需要重启YARN ResourceManager。

节点的Node Label

EMR集群的worker node有两类节点,分别是core节点(除了NodeManager之外还运行HDFS和HBase等存储服务进程)和task节点(只运行NodeManager之类的计算服务),我们首先增加两个node label

yarn rmadmin -addToClusterNodeLabels "core(exclusive=false),task(exclusive=false)"

exclusive=false意思是这个Label的资源可以共享给申请DEFAULT资源的作业。

然后给各个节点打上标签(用你的机器名字替代 emr-worker-*.cluster-105364):

yarn rmadmin -replaceLabelsOnNode \
  "emr-worker-1.cluster-105364=core emr-worker-2.cluster-105364=core emr-worker-3.cluster-105364=task"

Scheduler的配置

目前只有YARN Capacity Scheduler支持NodeLabel功能,我们以他为例,而且假设一个最简单的场景,集群内只有一个queue(default)。

在配置node label相关的信息之前,capacity-scheduler.xml 包含如下内容:

  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>100</value>
  </property>

新增Node Label相关配置:

  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels</name>
    <value>core,task</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels.core.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels.task.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
    <value>core,task</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.accessible-node-labels.core.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.accessible-node-labels.task.capacity</name>
    <value>100</value>
  </property>

上述配置的意思是:

  1. 对于Label为core的资源,default queue占用100%的资源
  2. 对于Label为task的资源,default queue占用100%的资源

保存配置之后,需要刷新YARN Scheduler queue。

作业提交

在弹性伸缩场景下,task节点可能随时被停止,所以如果一个长时间运行的作业的application master(AM)被运行在Task节点上,当节点停止后AM就退出了,可能会造成作业失败。所以,比较好的策略是AM只启动在Core节点上。

如果集群开启了Node Label功能,我们可以通过配置作业的方式,将AM启动在Core节点上。本文中只介绍MapReduce和Spark两类作业

MapReduce作业

提交作业如下:

hadoop jar hadoop-mapreduce-examples-2.8.5.jar pi \
    -Dmapreduce.job.am.node-label-expression=core \
    10 100000000

mapreduce.job.am.node-label-expression=core参数指明了MapReduce AM申请core类型资源,所以AM一定会启动在Core节点上。同时,因为没有指定普通Task运行的资源(也就是申请了DEFAULT),所以普通Task可以同时运行在Core和Task节点上(exclusive=false)。

如果要希望MapReduce Map或Reduce task只运行在Task节点上,可以在提交参数上指定:

hadoop jar hadoop-mapreduce-examples-2.8.5.jar pi \
    -Dmapreduce.job.am.node-label-expression=core \
    -Dmapreduce.job.node-label-expression=task \
    100 100000000

另外,还有mapreduce.map.node-label-expression和mapreduce.reduce.node-label-expression等参数可配置。

Spark作业

类似于MapReduce Job,我们可以指定spark.yarn.am.nodeLabelExpression 和 spark.yarn.executor.nodeLabelExpression 将作业提交到不同的节点上。下面这个例子是将Spark AM启动在Core节点上:

spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn --deploy-mode cluster \
    --conf spark.yarn.am.nodeLabelExpression=core \
    spark-examples_2.11-2.3.2.jar 10

参考资料

  1. YARN Node Labels: Label-based scheduling and resource isolation
  2. YARN Node Labels
目录
相关文章
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(四)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
121 0
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(二)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
105 0
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(一)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
3月前
|
SQL 存储 NoSQL
阿里云 EMR StarRocks 在七猫的应用和实践
本文整理自七猫资深大数据架构师蒋乾老师在 《阿里云 x StarRocks:极速湖仓第二季—上海站》的分享。
290 2
|
5月前
|
消息中间件 分布式计算 NoSQL
EMR-Kafka Connect:高效数据迁移的革新实践与应用探索
Kafka Connect是Kafka官方提供的一个可扩展的数据传输框架,它允许用户以声明式的方式在Kafka与其他数据源之间进行数据迁移,无需编写复杂的数据传输代码。
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(三)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
118 0
|
4月前
|
资源调度 分布式计算 监控
【揭秘Hadoop YARN背后的奥秘!】从零开始,带你深入了解YARN资源管理框架的核心架构与实战应用!
【8月更文挑战第24天】Hadoop YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的资源管理器,为Hadoop集群上的应用提供统一的资源管理和调度框架。YARN通过ResourceManager、NodeManager和ApplicationMaster三大核心组件实现高效集群资源利用及多框架支持。本文剖析YARN架构及组件工作原理,并通过示例代码展示如何运行简单的MapReduce任务,帮助读者深入了解YARN机制及其在大数据处理中的应用价值。
96 0
|
4月前
|
安全 分布式数据库 数据安全/隐私保护
阿里云EMR数据湖文件系统问题之JindoFS支持Snapshot功能的问题如何解决
阿里云EMR数据湖文件系统问题之JindoFS支持Snapshot功能的问题如何解决
|
5月前
|
分布式计算 Hadoop Serverless
数据处理的艺术:EMR Serverless Spark实践及应用体验
阿里云EMR Serverless Spark是基于Spark的全托管大数据处理平台,融合云原生弹性与自动化,提供任务全生命周期管理,让数据工程师专注数据分析。它内置高性能Fusion Engine,性能比开源Spark提升200%,并有成本优化的Celeborn服务。支持计算存储分离、OSS-HDFS兼容、DLF元数据管理,实现一站式的开发体验和Serverless资源管理。适用于数据报表、科学项目等场景,简化开发与运维流程。用户可通过阿里云控制台快速配置和体验EMR Serverless Spark服务。
|
7月前
|
SQL 分布式计算 监控
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
本文演示了使用 EMR Serverless Spark 产品搭建一个日志分析应用的全流程,包括数据开发和生产调度以及交互式查询等场景。
56602 7
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用