Spark on YARN的cluster模式

目錄

 

YARN架構

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 3g \

    --num-executors 50 \

    --executor-memory 5g \

    --executor-cores 5 \

    --conf spark.default.parallelism=500 \

    --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

參考資料

YARN官網

《Spark技術內幕  深入解析Spark內核架構設計與實現原理》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章