一、第一部分
1、spark2.1與hadoop2.7.3集成,spark on yarn模式下,需要對hadoop的配置文件yarn-site.xml增加內容,如下:
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log.server.url</name> <value>http://node2:19888/jobhistory/logs</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property>
2、spark的conf/spark-defaults.conf配置
spark.yarn.historyServer.address=node2:18080 spark.history.ui.port=18080 spark.eventLog.enabled=true spark.eventLog.dir=hdfs:///tmp/spark/events spark.history.fs.logDirectory=hdfs:///tmp/spark/events
如果你是運行在yarn之上的話,就要告訴yarn,你spark的地址,當我在yarn上點擊一個任務,進去看history的時候,他會鏈接到18080里面,如果你配的是node1:18080,那么你就要在node1上啟動spark的history server(見后面注①)
最下面兩個配置是運行spark程序的時候配置的,一旦你運行spark,就會將日志等發送到那兩個目錄,有了這兩個目錄,spark的historyserver就可以讀取spark的運行狀態信息日志等讀取並展示
18080是spark的history server,會顯示出你最近spark跑過的一些程序,點擊execution后,點擊最右邊的日志(如果有的話),會重定向到19888(見后面注②),這個是mr的jobserver的地址(啟動命令:mr-jobhistory-daemon.sh start historyserver
)
spark.yarn.historyServer.address和spark.history.ui.port如果缺少其中一個,日志就看不到
綜上,1和2兩個配置齊全,才可以查看spark的stdout和stderr日志
二、第二部分
實際上,在spark程序運行的時候,會起一個driver程序和多個executor程序,他們都是跑在nodemanager之上的,在啟動程序的時候,如果我們在默認的配置項里面,配置了參數spark.eventLog.enabled=true,spark.eventLog.dir=地址,那么driver上就會把所有的事件全部給記錄下來,事件包括,executor的啟動,executor執行的task等發送給driver
每當寫日志的時候,都有一個寫日志的組件將日志寫進那個目錄里面,這個目錄下面每一個應用程序都會存在一個文件,然后將會由spark的history server(也就是配置在spark-default.conf里面),這個server會在18080啟動一個進程,去掃描日志目錄,並解析每一個文件,進行還原,就得到了整個應用的狀態
在hadoop-2.7.3/etc/hadoop/mapred-site.xml配置文件中
<property> <name>mapreduce.jobhistory.done-dir</name> <value>/user/history/done</value> </property> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>/user/history/done_intermediate</value> </property>
stdlog和err是每一個nodemanager上的每一個executor都會產生的,如果當程序完成后,在這個節點上,跟這個應用相關的所有信息全部會被清除掉,包括這些日志,這樣的話如果我們不把這個日志收集起來,那么后面在歷史信息(18080 executord模塊的stderr和out)里面就看不到這些日志
為了能夠看到這些日志,我們要做的事情是,讓nodemanager開啟一個日志聚合的功能,這個功能的作用是,當應用程序終止的時候,需要將這個應用程序產生的所有日志全部聚集到遠程hdfs上的一個目錄,聚集之后,還需要通過一個http的接口去查看這些日志,查看日志的這個角色就叫做mr的history server,通過她的web ui接口,當我們點擊std日志的時候,就會跳轉到mr job history server這個地址上19888上,然后去把這個日志展示出來
三、總結
總的來說,yarn-site.xml和conf/spark-defaults.conf這兩個配置文件中的地址比較關鍵
http://node2:19888/jobhistory/logs : 對應的是點擊strout的時候跳轉的地址
spark.yarn.historyServer.address=node2:18080 :對應的是在yarn里點擊history,跳轉的地址
注①:
1、進入yarn的web ui頁面,點擊左側FINISHED,可查看運行完的作業,點擊一個app id
2、進入下圖頁面,點擊History
3、重定向到conf/spark-defaults.conf配置的地址
注②:
具體步驟如下:
1、我先運行一個spark程序
bin/spark-shell --master local
2、登錄Spark History server的web ui
http://node1:18080/
3、如下圖,找到我剛才運行的程序
4、點擊紅框位置App ID,進入如下圖頁面
5、點擊紅框位置Executor,進入下圖頁面
6、右下角的stderr和stdout就是我們此行的目標了
<property>
<name>yarn.log.server.url</name>
<value>http://node2:19888/jobhistory/logs</value> </property>
當你點擊stderr或stdout,就會重定向到node2:19888,所以如果這里你配錯了,那這兩個日志你是看不了的
node2:19888是你的MapReduce job history server的啟動節點地址
進入頁面如下圖