目錄
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
參考資料
《Spark技術內幕 深入解析Spark內核架構設計與實現原理》