往期链接:
Spark基础:Spark SQL入门 Spark基础:数据读写 Spark基础:读写Parquet Spark基础:读写Hive Spark基础:读写JDBC Spark基础:Spark SQL优化 Spark基础:分布式SQL查询引擎 Spark基础:Hive特性兼容 Spark基础:集群运行 Spark基础:应用提交 Spark基础:Spark on Yarn(上)1 常用配置
Spark在Yarn中运行时,主要涉及:在client模式下app master相关的配置;在yarn中的jar包文件等配置;重试机制配置;history server配置;yarn中的队列、标签等配置;日志配置等。
[重要] spark.yarn.am.memory, 512m,Yarn在client模式下App Master可以使用的内存,支持jvm内存格式,如512m,2g等。在cluster模式下使用 spark.driver.memory 代替。使用小写后缀作为单位,k, m, g, t, p等。
[重要] spark.yarn.am.cores,1,client模式中Yarn App Master使用的核数。在cluster模式下,使用 spark.driver.cores 代替。
[重要] spark.yarn.am.waitTime,100s,仅在cluster模式中支持,限制SparkContext初始化时Yarn App Master等待的时间。
[重要] spark.yarn.submit.file.replication,默认是HDFS的副本数量3,上传到hdfs的文件副本数量,包括spark jar包,app jar包,以及其他的分布式缓存文件。
[重要] spark.yarn.stagingDir,user在文件系统中的根目录,提交应用的缓存目录。
[重要] spark.yarn.preserve.staging.files,false,如果配置为true,当应用执行完成时,不会删除相关的spark jar, app jar, 分布式缓存文件等
spark.yarn.scheduler.heartbeat.interval-ms,3000,spark app master与 yarn resource manager心跳的间隔时间。上限是yarn配置中 yarn.am.liveness-monitor.expiry-interval-ms 的一半。
spark.yarn.scheduler.initial-allocation.interval,200ms,当有container挂起时的心跳时间,这个值不能比 spark.yarn.scheduler.heartbeat.interval-ms 大。心跳时间成功后会翻倍,直到到达 interval-ms 值。
spark.yarn.max.executor.failures,numExecutors * 2, 最小值3。executor失败的最大数量。
spark.yarn.historyServer.address,无,Spark history server的地址,如 xxx:18080 。地址不能包含http://。默认history server是可选的服务,不需要配置。这个地址会交给yarn的rs,当spark应用完成后,master ui直接跳转到spark history server。针对这个属性,yarn属性会当做java普通属性来使用,因此可以在运行时进行替换。比如,如果history server运行在同一节点上,那么可以配置带有变量的url:${hadoopconf-yarn.resourcemanager.hostname}:18080
spark.yarn.dist.archives,无,对应executor的文件列表
spark.yarn.dist.files,无,对应executor的文件列表
spark.yarn.dist.jars,无,对应executor的文件列表
spark.yarn.dist.forceDownloadSchemes,无,对应executor的文件列表
[重要] spark.executor.instances,2,executor的数量,如果开启 spark.dynamicAllocation.enabled ,则初始值会有这么大。
[重要] spark.yarn.am.memoryOverhead,am内存的1/10,仅用在client模式,与spark.driver.memoryOverhead类似。
[重要] spark.yarn.queue,default,yarn的队列
[重要] spark.yarn.jars,无,包含spark运行所需要的jar目录。默认spark会使用本地的jar。该配置可以允许YARN在各个节点缓存文件,从而避免每次上传。
[重要] spark.yarn.archive,无,spark运行所需要的文件,如果配置该属性会替换spark.yarn.jars。
spark.yarn.appMasterEnv.[EnvironmentVariableName],无,为app master进程增加环境名称。在cluster模式下它会控制driver的变量,在client模式下仅会控制executor变量。
[重要] spark.yarn.containerLauncherMaxThreads,25,app master启动容器的最大线程数量。
[重要] spark.yarn.am.extraJavaOptions,无,在client模式下传给app master的JVM参数。在cluster模式中,使用 spark.driver.extraJavaOptions 代替。注意 -Xmx 是非法的,可以使用 spark.yarn.am.memory 代替。
spark.yarn.am.extraLibraryPath,无,client模式下配置扩展类路径
spark.yarn.maxAppAttempts,yarn.resourcemanager.am.max-attempts,提交应用的最大重试次数,不能比yarn重的配置大。
spark.yarn.am.attemptFailuresValidityInterval,无,定义am重试的间隔时间,如果应用运行超过间隔时间,那么重试次数会被重置,如果不配置则不会启用该特性。
spark.yarn.executor.failuresValidityInterval,无,executor的重试间隔。
[重要] spark.yarn.submit.waitAppCompletion,true,在cluster模式中,控制客户端是否等待应用完成。如果为true,客户端会一直监听应用状态并输出;否则应用提交后client就会退出。
spark.yarn.am.nodeLabelExpression,无,限制yarn调度时的标签。仅在yarn 2.6以上才支持,在之前的版本会忽略。
spark.yarn.executor.nodeLabelExpression,无,限制yarn启动executor的节点标签。
spark.yarn.tags,无,过滤查询的app标签
spark.yarn.config.gatewayPath,无,有一些路径可能仅在网关机器上才能访问,可以使用该变量定义,然后搭配 replacementPath 参数进行替换。比如 网关节点上hadoop安装目录为/disk1/hadoop,导出变量为 HADOOP_HOME, 那么 gatewayPath 为 /disk1/hadoop,repolacementPath 为 $HADOOP_HOEM。
spark.yarn.config.replacementPath,无,同上
spark.yarn.rolledLog.includePattern,无,配置日志聚合的包含模式
spark.yarn.rolledLog.excludePattern,无,配置日志聚合的排除模式
spark.yarn.blacklist.executor.launch.blacklisting.enabled,false,启用yarn分配时的黑名单机制。可以通过 spark.blacklist.application.maxFailedExecutorsPerNode 配置列入黑名单的次数。
spark.yarn.metrics.namespace,无,AM指标报告的root namespace,如果没配置则使用app id。
2 Spark external shuffle服务
在Spark中应用需要通过网络传输实现各个Stage之间的数据交换,这个过程也叫做shuffle。但是当上游的executor正在GC时,下游的executor无法获取到数据,会造成任务的卡顿。因此可以考虑使用外部服务来管理shuffle,比如可以在yarn中的nodemanager节点上安装一个常驻的 shuffle 服务,基于这个服务传输数据。不过这种方式也仅仅是把传输的压力从 executor 转移到了 nodemanager,因此一定要慎用。
按照下面的方法可以开启 Spark Suffle 服务:
1 上传 spark--yarn-shuffle.jar 到NodeManager的节点类路径上,如果是自己编译的jar包,则在 $SPARK_HOME/common/network-yarn/target/scala- 目录下;如果是安装包版本,则在yarn下。
2 在每个节点的yarn-site.xml中,给 yarn.nodemanager.aux-services 添加 spark_shuffle然后配置yarn.nodemanager.aux-services.spark_shuffle.class 为 org.apache.spark.network.yarn.YarnShuffleService.
3 调整 etc/hadoop/yarn-env.sh 中的 YARN_HEAPSIZE ,增加nodemanager的堆内存(默认是1000)
4 重启所有的NodeManager
当开启shuffle服务后,可以通过下面的配置进行检查校验。spark.yarn.shuffle.stopOnFailure,false,当Spark shuffle service初始化失败时,是否停止NodeManager。这样可以组织应用运行在没有开启 shuffle 服务的节点上运行出错。
在 yarn-site.xml 中配置:
nodemanager中长期运行的辅助服务,可以用于提升shuffle性能
如果已经存在,可以使用逗号分隔yarn.nodemanager.aux-servicesspark_shuffleyarn.nodemanager.aux-services.spark_shuffle.classorg.apache.spark.network.yarn.YarnShuffleServicespark.shuffle.service.port7337
在 spark-defaults.conf 中配置:
spark.shuffle.service.enabled true
spark.shuffle.service.port 7337
yarn中的配置和spark中的配置端口号需要一致。