北風網spark學習筆記
對於Spark作業的監控,Spark給我們提供了很多種方式:Spark Web UI,Spark History Web UI,RESTFUL API以及Metrics
。
SparkWebUI以及監控實驗
- 每提交一個Spark作業,並且啓動
SparkContext
之後,都會啓動一個對應的Spark Web UI
服務。默認情況下Spark Web UI
的訪問地址是driver
進程所在節點的4040端口。在Spark Web UI
上會展示作業相關的詳細信息,非常有用,是Spark作業監控的最主要的手段。
Spark Web UI包括了以下信息:
- stage和task列表
- RDD大小以及內存使用的概覽
- 環境信息
- 作業對應的executor的信息
- 可以通過在瀏覽器中訪問
http://<driver-node>:4040
地址,來進入Spark Web UI界面。如果多個driver在一個機器上運行,它們會自動綁定到不同的端口上。默認從4040
端口開始,如果發現已經被綁定了,那麼會選擇4041、4042
等端口,以此類推。 - 要注意的是,這些信息默認情況下僅僅在作業運行期間有效並且可以看到。一旦作業完畢,那麼driver進程以及對應的web ui服務也會停止,我們就無法看到已經完成的作業的信息了。如果要在作業完成之後,也可以看到其
Spark Web UI
以及詳細信息,那麼就需要啓用Spark的History Server
。
監控實驗
- 通過
spark-shell
以standalone
模式執行一個wordcount
作業,通過直接訪問4040端口以及從8080端口兩種方式進入web ui。 - 在作業運行完畢之後,再嘗試看看作業的
Web UI
。 - 通過
spark-shell以yarn
模式執行一個wordcount
作業,並重覆上述過程。
standalone模式下查看歷史作業的WebUI
默認情況下,一個作業運行完成之後,就再也無法看到其web ui以及執行信息了,在生產環境中,這對調試以及故障定位有影響。
如果要在作業執行完之後,還能看到其web ui,那麼必須將作業的spark.eventLog.enabled
屬性設置爲true
,這個屬性會告訴spark去記錄該作業的所有要在web ui上展示的事件以及信息。
如果spark記錄下了一個作業生命週期內的所有事件,那麼就會在該作業執行完成之後,我們進入其web ui時,自動用記錄的數據重新繪製作業的web ui
。
有3個屬性我們可以設置
spark.eventLog.enabled
,必須設置爲truespark.eventLog.dir
,默認是/tmp/spark-events
,建議自己手動調整爲其他目錄,比如/usr/local/spark-event
或是hdfs
目錄,必須手動創建spark.eventLog.compress
,是否壓縮數據,默認爲false
,建議可以開啓壓縮以減少磁盤空間佔用
- 這些屬性可以在提交一個作業的時候設置
- 如果想要對所有作業都啓用該機制,那麼可以在
spark-defaults.conf
文件中配置這三個屬性
實驗
- 先看看之前的已經執行完成的作業,是否可以進入
spark web ui
界面 - 關閉現有的
master和worke
r進程 - 修改
spark-defaults.conf
文件,配置上述三個屬性,啓用standalone
模式下的作業歷史信息記錄,手動創建hdfs目錄 - 重新啓動
spark
集羣 - 使用
spark-shell
提交一個作業,然後再次嘗試進入spark web ui
界面
注意:如果要讓spark完成作業的事件記錄,那麼必須最後以
sc.stop()
結尾。
啓動HistoryServer查看歷史作業的Web UI
修改spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://192.168.75.101:9000/event_log_dir
spark.eventLog.compress true
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=50 -Dspark.history.fs.logDirectory=hdfs://192.168.75.101:9000/event_log_dir"
務必預先創建好hdfs://192.168.75.101:9000/spark-events
目錄
而且要注意,spark.eventLog.dir與spark.history.fs.logDirectory
指向的必須是同一個目錄
因爲spark.eventLog.dir
會指定作業事件記錄在哪裏,spark.history.fs.logDirectory
會指定從哪個目錄中去讀取作業數據
- 啓動
HistoryServer:
./sbin/start-history-server.sh
- 訪問地址:
192.168.75.101:18080
實驗
- 停止集羣
- 配置
spark-env.sh
- 重啓集羣
- 啓動
history server
- 運行
spark-shell
,在standalone
模式下和yarn
模式下,分別執行一個作業 - 通過
192.168.75.101:18080
的HistoryServer UI
可以看到所有運行後的作業信息
使用curl+REST API進行作業監控
除了查看ui上的統計來監控作業,還可以通過Spark提供的REST API來獲取作業信息,並進行作業監控。REST API就給我們自己開發Spark的一些監控系統或平臺提供了可能。REST API是通過http協議發送的,並給我們返回JSON格式的數據。因此無論你是用java,還是python,亦或是php,都可以獲取Spark的監控信息。
運行中的作業以及history server
中的歷史作業,都可以獲取到信息
- 如果是要獲取運行中的作業的信息,可以通過
http://host:4040/api/v1/...
的方式來獲取 - 如果是要獲取歷史作業的信息,可以通過
http://host:18080/api/v1/...
的方式來獲取
比如說,http://192.168.75.101:18080/api/v1/applications
,就可以獲取到所有歷史作業的基本信息
以下是所有API的說明
API | 說明 |
---|---|
/applications | 獲取作業列表 |
/applications/[app-id]/jobs | 指定作業的job列表 |
/applications/[app-id]/jobs/[job-id] | 指定job的信息 |
/applications/[app-id]/stages | 指定作業的stage列表 |
/applications/[app-id]/stages/[stage-id] | 指定stage的所有attempt列表 |
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id] | 指定stage attempt的信息 |
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary | 指定stage attempt所有task的metrics統計信息 |
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList | 指定stage attempt的task列表 |
/applications/[app-id]/executors | 指定作業的executor列表 |
/applications/[app-id]/storage/rdd | 指定作業的持久化rdd列表 |
/applications/[app-id]/storage/rdd/[rdd-id] | 指定持久化rdd的信息 |
/applications/[app-id]/logs | 下載指定作業的所有日誌的壓縮包 |
/applications/[app-id]/[attempt-id]/logs | 下載指定作業的某次attempt的所有日誌的壓縮包 |
- 當作業運行在yarn中時,每個作業都可能會嘗試多次運行,所以上述的所有
[app-id]
都必須替換爲[app-id]/[attempt-id]
- 這些API都非常便於讓我們去基於它們開發各種監控系統或應用。特別是,spark保證以下幾點:
- API永遠不會因爲版本的變更而更改
- JSON中的字段用於不會被移除
- 新的API接口可能會被增加
- 已有API接口中可能會增加新的字段
- API的新版本可能會作爲新接口被添加進來。新版本的接口不要求向後兼容。
- API版本可能會被刪除掉,但是肯定是在一個相關的新API版本發佈之後。
- 要注意的是,當查看運行中作業的UI時,
applications/[app-id]
還是需要提供的,儘管此時在那個4040端口上可能只有一個作業在運行。比如說,要查看正在運行的作業的job列表,可能需要使用以下API: http://host:4040/api/v1/applications/[app-id]/jobs
- 這主要是爲了儘可能地複用API接口
實驗
- 安裝curl工具,來發送http請求:
yum install -y curl
- 試一試以上的幾個API,去獲取standalone模式和yarn模式運行中的作業,以及歷史作業的信息
Spark Metrics系統以及自定義Metrics Sink
Spark有一套可配置的metrics系統,是基於Coda Hale Metrics
類庫實現的。該metrics系統允許用戶將Spark的metrics統計指標上報到多種目標源(sink)中,包括http,jmx和csv文件。這個metrics系統是通過一個配置文件進行配置的,在$SPARK_HOME
目錄的conf
目錄下,用一個metrics.properties
文件來配置。可以通過在spark-defaults.conf
中配置spark.metrics.conf
屬性來配置自定義的文件路徑。spark metrics依據不同的spark組件劃分爲了不同的實例。在每一個實例中,你都可以配置一系列的sink來指定該實例的metrics要上報到哪裏去。
以下實例是目前被支持的
master: spark standalone master進程
applications: master中的組件,可以上報所有application的metrics
worker: spark standalone worker進程
executor: spark executor進程
driver: spark driver進程
每個實例都可以上報metrics
到0個或多個sink中。sink
被包含在了org.apache.spark.metrics.sink
包下。
-
ConsoleSink
: 日誌metrics
,打印到控制檯 -
CSVSink
: 以固定的頻率將metrics
數據導出到CSV文件中 -
JmxSink
: 註冊metrics
到JMX console
中 -
MetricsServlet
: 在Spark UI中添加一個servlet來通過JSON數據提供metrics數據(之前的REST API就是通過該方式進行的) -
Slf4jSink
: 以日誌的形式發送metrics
到slf4j
-
GraphiteSink
: 發送metrics
到Graphite
節點 -
GangliaSink
: 發送metrics
到Ganglia
節點。Spark
也支持Ganglia sink
,但是沒有包含在默認的打包內,因爲有版權的問題。要安裝
GangliaSink
,就需要自己編譯一個spark。要注意,必須要提供必要的授權信息。
metrics系統的意義
metrics
只能在spark web ui
上看到,或者是history server
上看歷史作業的web ui
。- 如果你希望將
metrics
數據,結構化處理以後導入到,比如mysql
裏面,然後進行一個存儲,開發一個系統對外開放 - spark集羣運行分析系統
- 自定義
metrics sin
k,將所有的metrics
全部寫入外部的你指定的存儲文件中,然後定時導入到你的mysql
中
實驗: 自定義metrics sink
- 停止集羣
- 配置
metrics.properties
文件,啓用CSVSink
- 重啓集羣
- 運行一個作業,查看指定目錄下的csv文件