欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spark on YARN的cluster模式

程序员文章站 2022-04-29 10:54:44
...

目录

 

YARN架构

Spark on YARN的cluster模式

常用命令

日志查看与处理

参考资料


YARN架构

Spark on YARN的cluster模式

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的简单运行状况。

Spark on YARN的cluster模式

客户端提交的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

Spark on YARN的cluster模式

2)可以在控制台查看:

yarn logs --applicationId ****

yarn logs --containerId ****

3)可以查看参数spark.yarn.app.container.log.dir的配置

如果不清楚去哪里查看该参数,可以进入界面http://ip:8088/cluster/app/application_1560935858543_3288-> ApplicationMaster->Enviroment中查找

Spark on YARN的cluster模式

找到该参数,就可以去配置地方查看日志。

使用中发现一个问题,如果应用被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

参考资料

YARN官网

《Spark技术内幕  深入解析Spark内核架构设计与实现原理》