Spark on YARN的cluster模式
目录
YARN架构
YARN是Hadoop2.0之后出现的集群资源的管理与任务调度的分布式框架。
资源管理:
集群中的资源(如内存、cpu)使用情况由主节点ResourceManager管理。从节点NodeManager管理自己所在节点的资源使用情况并报告给主节点ResourceManager,从而主节点ResourceManager可以对整个集群的资源使用情况进行统一管理。
任务调度:
客户端提交Application给主节点ResourceManager,ResourceManager会为该应用分配合适的container,在指定的NodeManager生成一个应用程序管理者Application Master来管理该应用的所有任务;Application Master根据自己的任务需求向ResourceManager申请资源;ResourceManager根据请求分配任务所需要的container容器;Application Master会初始化container容器,并告诉container所在的NodeManager启动container中的任务。启动完成后,container中的任务由Application Master管理,在运行过程中,container中的任务会与Application Master保持联系,报告任务运行情况,同时Application Master与container所在的NodeManager保持通讯,目标就是可以实时监控container中的任务;当应用任务完成后会报告ResourceManager从而可以释放资源。
Spark on YARN的cluster模式
如果理解了YARN的架构设计,那么Spark on YARN就不难理解了。YARN cluster模式,就是通过YARN来调度Spark application所需要的资源。此时Driver程序会在YARN中运行,而应用的运行结果不能在客户端显示,所以建议将运行结果保存在外部存储介质(如HDFS、Redis、Mysql)而非stdout输出的应用程序,客户端的终端显示的仅是作为YARN的job的简单运行状况。
客户端提交的Application会通过YARN client提交到YARN的主节点ResourceManager上,ResourceManager会在一个工作节点上启动Application Master(实现是org.apache.spark.deploy.yarn.ApplicationMaster)。启动了ApplicationMaster后,才算是完成了Spark Application的提交。
ApplicationMaster将在自己注册成为一个YARN ApplicationMaster后,才会开始执行用户提交的Application。YARN cluster模式的TaskScheduler的实现是org.apache.spark.scheduler.cluster.YarnClusterScheduler。YarnClusterScheduler继承自org.apache.spark.scheduler.TaskSchedulerImpl,额外实现的逻辑是确定ApplicationMaster初始化完成。ApplicationMaster会通过YARN ResourceManager和NodeManager的接口在集群中启动若干个容器,用于启动org.apache.spark.executor.CoarseGrainedExecutorBackend,之后会启动org.apache.spark.executor.Executor。
常用命令
1)部署
nohup spark-submit --class com.test.Main \
--master yarn \
--deploy-mode cluster \
--driver-memory 30g \
--executor-memory 15g \
--executor-cores 5 \
--name test \
--conf spark.executor.extraJavaOptions="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" \
--files log4j.properties \
Test.jar &
2)查看当前应用列表
yarn application -list
3)停掉某个应用
yarn application -kill application-id
4)查看日志
yarn logs -applicationId application_1560935858543_0901
yarn logs --containerId container_e18_1560935858543_3288_01_004589
日志查看与处理
目前知道的可以查看应用日志的方式有以下三种:
1)可以在WEB UI上查看:http://ip:8088/cluster/app/application_1560935858543_3288
2)可以在控制台查看:
yarn logs --applicationId ****
yarn logs --containerId ****
3)可以查看参数spark.yarn.app.container.log.dir的配置
如果不清楚去哪里查看该参数,可以进入界面http://ip:8088/cluster/app/application_1560935858543_3288-> ApplicationMaster->Enviroment中查找
找到该参数,就可以去配置地方查看日志。
使用中发现一个问题,如果应用被kill掉,那么就不能按照上述的方式1)、2)查看,方式3)也不方便查找,因为你不清楚任务在执行时具体是在哪一个机器上。这里提供一种思路:
使用log4j将日志写入syslog,syslog->logstash->elastic search->kibana。可以方便查看日志。log4j的配置文件如下:
log4j.rootCategory=WARN,console,syslog
#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
#输出到syslog
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.syslog.SyslogHost=your ip
log4j.appender.syslog.Port=514
log4j.appender.syslog.Facility=LOCAL1
log4j.appender.syslog.header=true
log4j.appender.syslog.Threshold=INFO
log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern=%m
log4j.appender.syslog.encoding=utf-8
参考资料
《Spark技术内幕 深入解析Spark内核架构设计与实现原理》
上一篇: 高性能WEB开发之Web性能测试工具推荐
下一篇: 高性能WEB开发之如何减少请求数
推荐阅读
-
Redis集群模式下的redis-py-cluster方式读写测试
-
MQ Cluster 的典型部署模式
-
Redis cluster集群模式的原理解析
-
spark2.2.1中spark.yarn.jars|spark.yarn.archive的正确配置
-
mysql的集群模式 galera-cluster部署详解
-
关于华为FusionInsight Manager安全模式下执行spark任务的一个坑--记录
-
spark2.2.1中spark.yarn.jars|spark.yarn.archive的正确配置
-
解析spark源码yarn-cluster模式任务提交
-
Spark on yarn模式的参数设置即调优
-
Spark Standalone Mode下的client mode和cluster mode