大数据培训 Yarn 和 Spark 配置与说明
Yarn 配置
Yarn 配置说明
需要调整的 Yarn 参数均与 CPU、内存等资源有关,核心配置参数如下
yarn.nodemanager.resource.memory-mb 该参数的含义是,一个 NodeManager 节点分配给 Container 使用的内存。该参数的配置,取决于 NodeManager 所在节点的总内存容量和该节点运行的其他服务的数量。考虑上述因素,此处可将该参数设置为 64G,如下:<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>65536</value>
</property>
yarn.nodemanager.resource.cpu-vcores 该参数的含义是,一个 NodeManager 节点分配给 Container 使用的 CPU 核数。该参数的配置,同样取决于 NodeManager 所在节点的总 CPU 核数和该节点运行的其他服务。考虑上述因素,此处可将该参数设置为 16。<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>16</value>
</property>
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>
yarn.scheduler.minimum-allocation-mb 该参数的含义是,单个 Container 能够使用的最小内存,推荐配置如下:<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
Yarn 配置实操
修改 $HADOOP_HOME/etc/hadoop/yarn-site.xml 文件
修改如下参数<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>
分发该配置文件
重启 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 个数的指定方式有两种,静态分配和动态分配。
静态分配可通过 spark.executor.instances 指定一个 Spark 应用启动的 Executor 个数。这种方式需要自行估计每个 Spark 应用所需的资源,并为每个应用单独配置 Executor 个数。
动态分配动态分配可根据一个 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 配置实操
修改 spark-defaults.conf 文件 修改 $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
配置 Spark shuffle 服务 Spark Shuffle 服务的配置因 Cluster Manager(standalone、Mesos、Yarn)的不同而不同。此处以 Yarn 作为 Cluster Manager。 拷贝 $SPARK_HOME/yarn/spark-3.0.0-yarn-shuffle.jar 到 $HADOOP_HOME/share/hadoop/yarn/lib 分发 $HADOOP_HOME/share/hadoop/yarn/lib/yarn/spark-3.0.0-yarn-shuffle.jar 修改 $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>
分发 $HADOOP_HOME/etc/hadoop/yarn-site.xml 文件
重启 Yarn
评论