Spark On YARN

2018-10-30 15:27:47
Deployment Modes

在YARN中,每个应用实例有一个ApplicationMaster进程,这是应用实例开启的第一个容器。 ResourceManager向ApplicationMaster申请资源,
在资源分配后,应用实例会通知NodeManagers去启动容器。ApplicationMasters 评估每个客户端的需要:进程启动的应用可以被中断,持续协调管理进程。

Cluster Deployment Mode

在集群模式,Spark driver 运行在ApplicationMaster集群主机里边,在Yarn容器里的进程负责驱动应用和向YARN请求资源。
集群模式不适合交互
cluster mode

Cluster Deployment Mode

在客户端模式,Spark driver运行在提交job的主机上,ApplicationMaster响应来自于Yarn容器的请求,在容器启动后,客户端和容器协调完成任务调度
client mode

Configuring the Environment

Spark 需要配置 HADOOP_CONF_DIR or YARN_CONF_DIR 环境变量指向包含客户端目录的配置文件,这些配置文件用于写入HDFS和连接YARN ResourceManager.如果使用Cloudera Manager的部署客户端配置,这些变量会自动配置好.
否则在提交job会出现如下错误

1
2
3
4
5
Exception in thread "main" java.lang.Exception: When running with master 'yarn' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.
at org.apache.spark.deploy.SparkSubmitArguments.validateSubmitArguments(SparkSubmitArguments.scala:251)
at org.apache.spark.deploy.SparkSubmitArguments.validateArguments(SparkSubmitArguments.scala:228)
at org.apache.spark.deploy.SparkSubmitArguments.<init>(SparkSubmitArguments.scala:109)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:114)

Running a Spark Shell Application on YARN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#launch a Spark application in cluster mode
[root@cdh2 admin]# cat job.sh
sudo -uhdfs spark-submit --class org.apache.spark.examples.SparkPi \
--verbose \
--master yarn \
--deploy-mode cluster\
--num-executors 3 \
--driver-memory 2g \
--executor-memory 512m \
--executor-cores 1 \
--queue thequeue \
/opt/cloudera/parcels/CDH-6.0.1-1.cdh6.0.1.p0.590678/lib/spark/examples/jars/spark-examples_2.11-2.2.0-cdh6.0.1.jar \
10

#run spark-shell in client mode:
./bin/spark-shell --master yarn --deploy-mode client
Spark On YARN相关的配置参数
1
2
3
4
5
6
7
8
9
10
spark.driver.memory :默认值512m
spark.executor.memory :默认值512m
spark.yarn.am.memory :默认值512m
spark.yarn.executor.memoryOverhead :值为 executorMemory * 0.07, with minimum of 384
spark.yarn.driver.memoryOverhead :值为 driverMemory * 0.07, with minimum of 384
spark.yarn.am.memoryOverhead :值为 AM memory * 0.07, with minimum of 384

#--executor-memory/spark.executor.memory 控制 executor 的堆的大小,但是 JVM 本身也会占用一定的堆空间,比如内部的 String 或者直接 byte buffer, spark.yarn.XXX.memoryOverhead 属性决定向 YARN 请求的每个 executor 或dirver或am 的额外堆内存大小,默认值为 max(384, 0.07 * spark.executor.memory )
#在 executor 执行的时候配置过大的 memory 经常会导致过长的GC延时,64G是推荐的一个 executor 内存大小的上限。
#HDFS client 在大量并发线程时存在性能问题。大概的估计是每个 executor 中最多5个并行的 task 就可以占满写入带宽

YARN中有几个关键参数,参考YARN的内存和CPU配置

1
2
3
4
yarn.app.mapreduce.am.resource.mb :AM能够申请的最大内存,默认值为1536MB
yarn.nodemanager.resource.memory-mb :nodemanager能够申请的最大内存,默认值为8192MB
yarn.scheduler.minimum-allocation-mb :调度时一个container能够申请的最小资源,默认值为1024MB
yarn.scheduler.maximum-allocation-mb :调度时一个container能够申请的最大资源,默认值为8192MB

设置AM申请的内存值,要么使用cluster模式,要么在client模式中,是有 –conf 手动设置 spark.yarn.am.memory 属性,例如:

1
2
3
4
5
6
7
8
9
10
11
12
sudo -uhdfs  spark-submit --class org.apache.spark.examples.SparkPi \
--verbose \
--master yarn \
--deploy-mode cluster\
--num-executors 3 \
--driver-memory 2g \
--executor-memory 512m \
--executor-cores 1 \
--conf spark.yarn.am.memory=1024m \rr
--queue thequeue \
/opt/cloudera/parcels/CDH-6.0.1-1.cdh6.0.1.p0.590678/lib/spark/examples/jars/spark-examples_2.11-2.2.0-cdh6.0.1.jar \
10

ref
Running Spark Applications on YARN