大数据之Yarn和Spark配置与说明

2 篇文章 0 订阅
2 篇文章 0 订阅

Yarn配置

Yarn配置说明

需要调整的Yarn参数均与CPU、内存等资源有关,核心配置参数如下

  1. yarn.nodemanager.resource.memory-mb该参数的含义是,一个NodeManager节点分配给Container使用的内存。该参数的配置,取决于NodeManager所在节点的总内存容量和该节点运行的其他服务的数量。考虑上述因素,此处可将该参数设置为64G,如下:<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>65536</value>
    </property>

  2. yarn.nodemanager.resource.cpu-vcores该参数的含义是,一个NodeManager节点分配给Container使用的CPU核数。该参数的配置,同样取决于NodeManager所在节点的总CPU核数和该节点运行的其他服务。考虑上述因素,此处可将该参数设置为16。<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>16</value>
    </property>

  3. yarn.scheduler.maximum-allocation-mb该参数的含义是,单个Container能够使用的最大内存。由于Spark的yarn模式下,Driver和Executor都运行在Container中,故该参数不能小于Driver和Executor的内存配置,推荐配置如下:<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>16384</value>
    </property>

  4. yarn.scheduler.minimum-allocation-mb该参数的含义是,单个Container能够使用的最小内存,推荐配置如下:<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>512</value>
    </property>

Yarn配置实操

  1. 修改$HADOOP_HOME/etc/hadoop/yarn-site.xml文件

  2. 修改如下参数<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>65536</value>
    </property>
    <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>16</value>
    </property>
    <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>16384</value>
    </property>
    <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>512</value>
    </property>

  3. 分发该配置文件

  4. 重启Yarn。

Spark配置

Executor配置说明

Executor CPU核数配置

单个Executor的CPU核数,由spark.executor.cores参数决定,建议配置为4-6,具体配置为多少,视具体情况而定,原则是尽量充分利用资源。

此处单个节点共有16个核可供Executor使用,则spark.executor.core配置为4最合适。原因是,若配置为5,则单个节点只能启动3个Executor,会剩余1个核未使用;若配置为6,则只能启动2个Executor,会剩余4个核未使用。

Executor内存配置

Spark在Yarn模式下的Executor内存模型如下图所示:

Executor相关的参数有:

  • spark.executor.memory

  • spark.executor.memoryOverhead

spark.executor.memory用于指定Executor进程的堆内存大小,这部分内存用于任务的计算和存储;

spark.executor.memoryOverhead用于指定Executor进程的堆外内存,这部分内存用于JVM的额外开销,操作系统开销等。两者的和才算一个Executor进程所需的总内存大小。

默认情况下spark.executor.memoryOverhead的值等于spark.executor.memory*0.1

以上两个参数的推荐配置思路是,先按照单个NodeManager的核数和单个Executor的核数,计算出每个NodeManager最多能运行多少个Executor。在将NodeManager的总内存平均分配给每个Executor,最后再将单个Executor的内存按照大约10:1的比例分配到spark.executor.memory和spark.executor.memoryOverhead。

根据上述思路,可得到如下关系:

(spark.executor.memory+spark.executor.memoryOverhead)= yarn.nodemanager.resource.memory-mb * (spark.executor.cores/yarn.nodemanager.resource.cpu-vcores)

经计算,此处应做如下配置:

spark.executor.memory 14G

spark.executor.memoryOverhead 2G

Executor个数配置

此处的Executor个数是指分配给一个Spark应用的Executor个数,Executor个数对于Spark应用的执行速度有很大的影响,所以Executor个数的确定十分重要。

一个Spark应用的Executor个数的指定方式有两种,静态分配和动态分配。

  1. 静态分配可通过spark.executor.instances指定一个Spark应用启动的Executor个数。这种方式需要自行估计每个Spark应用所需的资源,并为每个应用单独配置Executor个数。

  2. 动态分配动态分配可根据一个Spark应用的工作负载,动态的调整其所占用的资源(Executor个数)。这意味着一个Spark应用程序可以在运行的过程中,需要时,申请更多的资源(启动更多的Executor),不用时,便将其释放。在生产集群中,推荐使用动态分配。动态分配相关参数如下:#启动动态分配
    spark.dynamicAllocation.enabled true

    #启用Spark shuffle服务
    spark.shuffle.service.enabled true

    #Executor个数初始值
    spark.dynamicAllocation.initialExecutors 1

    #Executor个数最小值
    spark.dynamicAllocation.minExecutors 1

    #Executor个数最大值
    spark.dynamicAllocation.maxExecutors 12

    #Executor空闲时长,若某Executor空闲时间超过此值,则会被关闭
    spark.dynamicAllocation.executorIdleTimeout 60s

    #积压任务等待时长,若有Task等待时间超过此值,则申请启动新的Executor
    spark.dynamicAllocation.schedulerBacklogTimeout 1s
    spark.shuffle.useOldFetchProtocol true
    说明:Spark shuffle服务的作用是管理Executor中的各Task的输出文件,主要是shuffle过程map端的输出文件。由于启用资源动态分配后,Spark会在一个应用未结束前,将已经完成任务,处于空闲状态的Executor关闭。Executor关闭后,其输出的文件,也就无法供其他Executor使用了。需要启用Spark shuffle服务,来管理各Executor输出的文件,这样就能关闭空闲的Executor,而不影响后续的计算任务了。

Driver配置说明

Driver主要配置内存即可,相关的参数有spark.driver.memory和spark.driver.memoryOverhead。

spark.driver.memory用于指定Driver进程的堆内存大小

spark.driver.memoryOverhead用于指定Driver进程的堆外内存大小。

默认情况下,两者的关系如下:spark.driver.memoryOverhead=spark.driver.memory*0.1。两者的和才算一个Driver进程所需的总内存大小。

一般情况下,按照如下经验进行调整即可:

假定yarn.nodemanager.resource.memory-mb设置为X,

  • 若X>50G,则Driver可设置为12G,

  • 若12G<X<50G,则Driver可设置为4G。

  • 若1G<X<12G,则Driver可设置为1G。

此处yarn.nodemanager.resource.memory-mb为64G,则Driver的总内存可分配12G,所以上述两个参数可配置为

spark.driver.memory 10G

spark.yarn.driver.memoryOverhead 2G

Spark配置实操

  1. 修改spark-defaults.conf文件

    1. 修改$HIVE_HOME/conf/spark-defaults.confspark.master yarn
      spark.eventLog.enabled true
      spark.eventLog.dir hdfs://myNameService1/spark-history
      spark.executor.cores 4
      spark.executor.memory 14g
      spark.executor.memoryOverhead 2g
      spark.driver.memory 10g
      spark.driver.memoryOverhead 2g
      spark.dynamicAllocation.enabled true
      spark.shuffle.service.enabled true
      spark.dynamicAllocation.executorIdleTimeout 60s
      spark.dynamicAllocation.initialExecutors 1
      spark.dynamicAllocation.minExecutors 1
      spark.dynamicAllocation.maxExecutors 12
      spark.dynamicAllocation.schedulerBacklogTimeout 1s

  2. 配置Spark shuffle服务Spark Shuffle服务的配置因Cluster Manager(standalone、Mesos、Yarn)的不同而不同。此处以Yarn作为Cluster Manager。

    1. 拷贝$SPARK_HOME/yarn/spark-3.0.0-yarn-shuffle.jar到$HADOOP_HOME/share/hadoop/yarn/lib

    2. 分发$HADOOP_HOME/share/hadoop/yarn/lib/yarn/spark-3.0.0-yarn-shuffle.jar

    3. 修改$HADOOP_HOME/etc/hadoop/yarn-site.xml文件<property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle,spark_shuffle</value>
      </property>

      <property>
      <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
      <value>org.apache.spark.network.yarn.YarnShuffleService</value>
      </property>

    4. 分发$HADOOP_HOME/etc/hadoop/yarn-site.xml文件

    5. 重启Yarn

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值