运行脚本
按照一般的场景下,我们使用spark自带的例子进行dubug的分析。
spark-submit --conf spark.eventLog.dir=hdfs://cluster/logs/spark --conf spark.yarn.stagingDir=/data/spark/ --master yarn --deploy-mode cluster --executor-memory 2G --executor-cores 2 --queue root.default --class org.apache.spark.examples.SparkPi spark-examples_2.11-2.2.2.jar 1000
spark-submit
exec "${SPARK_HOME}"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"
spark-class
运行堆内存=128m,由此可以计算并发度
"$RUNNER" -Xmx128m -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@"
Main
org.apache.spark.launcher.Main
执行新的shell命令 main-class org.apache.spark.deploy.SparkSubmit
设置环境变量 SPARK_PRINT_LAUNCH_COMMAND=true可以查看命令
SparkSubmit
设置verbose可以查看参数
一般而言,提交用户和执行用户是不一致的,在这个地方使用ugi创建代理用户去真正的执行。而真正的用户可以在spark内部传递用来记录读写记录,权限等。
val proxyUser = UserGroupInformation.createProxyUser(args.proxyUser,
UserGroupInformation.getCurrentUser())
YarnClusterApplication
org.apache.spark.deploy.yarn.YarnClusterApplication
Client
org.apache.spark.deploy.yarn.Client
一些重要的配置
appStagingDirPath
所有的配置和环境信息,都打包到这个目录,后续分发给executor.
spark.yarn.stagingDir /spark-stage/
结构如下:
spark.driver.memory/cores
applicationMaster的资源和driver的资源是一致的。
applicationMaster所需要的内存= amMemory + amMemoryOverhead,具体需要多少内存,后面再说。
spark.driver.memory 7g
spark.driver.cores 2
spark.driver.memoryOverhead
spark.driver.extraLibraryPath
指定启动driver的JVM时用到的库路径/,比如一些native函数(压缩类文件等)
spark.driver.extraJavaOptions
传递给driver的JVM选项字符串(包括GC,日志设置,或者其他的扩展javaagent)
Djava.io.tmpdir
具体发送到driver的命令如下
LD_LIBRARY_PATH="/Hadoop-2.8.3/hadoop/lib/native:$LD_LIBRARY_PATH" {{JAVA_HOME}}/bin/java -server -Xmx7168m -Djava.io.tmpdir={{PWD}}/tmp '-XX:+UseConcMarkSweepGC' '-Dfile.encoding=utf-8' '-XX:CICompilerCount=2' '-XX:ParallelGCThreads=16' -Dspark.yarn.app.container.log.dir=<LOG_DIR> org.apache.spark.deploy.yarn.ApplicationMaster --class 'org.apache.spark.examples.SparkPi' --jar file:/spark/examples/jars/spark-examples_2.11-2.2.2-mrs-1.9.0.jar --arg '1000' --properties-file {{PWD}}/__spark_conf__/__spark_conf__.properties 1> <LOG_DIR>/stdout 2> <LOG_DIR>/stderr