Spark -- Monitoring(spark作業監控和測量)

Monitoring and Instrumentation (監控和測量)

有幾種方式去監控Spark applications,如web UIsmetricsexternal instrumentation

Web Interfaces(web界面)

Every SparkContext launches a web UI, by default on port 4040, that displays useful information about the application
每個SparkContext都會啓動一個web UI(一個SparkContext就對應着一個driver program),端口默認是4040,web界面會展示如下有用的信息:

  • schedule過程中stage和tasks的列表
  • RDD大小和內存使用情況的統計
  • 環境信息
  • 當前正在執行任務的executors信息

可以通過 http://<driver-node>:4040 來訪問web界面,如果有多個SparkContext在同一個機器上即一個機器上有多個driver program,它們會綁定連續的端口,從4040開始,如4041、4042等。
注意這個信息只能在application在運行時獲得,因爲application完成後driver program就完成了,就不會存在該driver program對應的web接口。所以爲了能在application完成後還能看到這個web UI,必須要在application開始前給該application設置 spark.eventLog.enabled=true,該property會使Spark Application將UI中顯示的信息編碼爲spark events並記錄spark events到持久化存儲裏。

Viewing After the Fact (事後查看)

如果application的spark events存在的話可以通過啓動spark history server來查看application對應的UI界面。可以通過 ./sbin/start-history-server.sh來啓動spark history server。該命令會在當前機器上啓動一個進程,可通過 http://<server-url>:18080 來訪問。
當使用 file-system provider class (即下面的配置參數spark.history.provider)時,必須要設置 spark.history.fs.logDirectory來指定logging directory
注意:spark application必須要配置來記錄spark events並將其記錄到指定目錄,例如,假設history服務端配置了參數spark.history.fs.logDirectory=hdfs://namenode/shared/spark-logs,那麼client端在提交任務時需要設置如下兩個參數

spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode/shared/spark-logs

命令如下

spark-submit --conf spark.eventLog.enabled=true \
--conf spark.eventLog.dir=hdfs://namenode/shared/spark-logs \
--master yarn --deploy-mode cluster \
--class org.apache.spark.examples.SparkPi \
/usr/local/src/spark/examples/jars/spark-examples_2.11-2.4.5.jar 100

spark history server可以配置如下參數信息

Environment Variables

環境變量,可在${SPARK_HOME}/conf/spark-env.sh文件裏修改

Environment Variable Meaning
SPARK_DAEMON_MEMORY 分配給history server的內存 (default: 1g).
SPARK_DAEMON_JAVA_OPTS history server的JVM參數 (default: none).
SPARK_DAEMON_CLASSPATH history server的classpath (default: none).
SPARK_PUBLIC_DNS history server的公共地址。如果沒設置默認使用服務的內部地址,有可能造成broken lines. (default: none).
SPARK_HISTORY_OPTS 專門爲history server設置的properties,如-Dx=y (default: none).

Spark History Server Configuration Options

spark history server的配置選項,可在${SPARK_HOME}/conf/spark-defaults.conf文件裏修改

Property Name Default Meaning
spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider 實現application history後臺的類的名稱,目前只有一個由Spark提供的實現,用於查找存儲在文件系統中的application log.
spark.history.fs.logDirectory file:/tmp/spark-events 對於文件系統history provider, 存放application event log的目錄的URL。可以是本地文件file://path, 也可以是HDFS路徑hdfs://namenode/shared/spark-logs, 也可以是Hadoop API支持的其他文件系統.
spark.history.fs.update.interval 10s 文件系統history provider檢查日誌目錄中新日誌或更新日誌的週期。更短的間隔可以更快地檢測到新的application,但代價是需要更多的服務器負載來重新讀取更新的application。一旦更新完成,已完成和未完成的applicaiton的列表將會改變。
spark.history.retainedApplications 50 在緩存中保留UI數據的application的數量。如果超過這個上限, 那麼最老的application將從緩存中刪除。如果application不在緩存中那麼從UI訪問它時則必須從磁盤加載它.
spark.history.ui.maxApplications Int.MaxValue 在history summary頁上顯示的application數量。即時applicaiton沒有顯示在history summary頁上, 仍然可以通過直接訪問它們的url來訪問。
spark.history.ui.port 18080 history server的web界面綁定的端口
spark.history.fs.cleaner.enabled false history server是否需要定期從存儲裏面刪除event log
spark.history.fs.cleaner.interval 1d 文件系統的history cleaner程序檢查哪些文件需要刪除的頻率。只有當文件時間大於spark.history.fs.cleaner.maxAge時纔會被刪除
spark.history.fs.cleaner.maxAge 7d 當文件系統的history cleaner程序運行時大於該值的文件會被刪除
spark.history.fs.endEventReparseChunkSize 1m How many bytes to parse at the end of log files looking for the end event. 通過跳過event log文件中非必要的部分來加速application的list的生成, 可以設置0來禁用它.
spark.history.fs.inProgressOptimization.enabled true 啓用對正在處理的日誌的優化處理。此選項可能會使完成的應用程序無法將其事件日誌重命名爲“進行中”。
spark.history.fs.numReplayThreads 25% of available cores history server用來處理event log的線程數
spark.history.store.maxDiskUsage 10g 存儲cache application歷史信息的本地目錄的最大磁盤使用量。
spark.history.store.path (none) Local directory where to cache application history data. If set, the history server will store application data on disk instead of keeping it in memory. The data written to disk will be re-used in the event of a history server restart.

REST API

具體信息可參考官網 REST API

Executor Task Metrics

具體信息可參考官網 Executor Task Metrics

配置例子

存儲在本地文件系統

以application event log存儲在本地文件系統爲例,可以聯想MapReduce Job History Server的配置。
需要在所有的計算節點(如果是spark on yarn模式那就是所有的nodemanager節點),配置好相應的spark-env.shspark-defaults.conf文件。

spark-env.sh文件內容如下

HADOOP_HOME=/usr/local/src/hadoop
SPARK_HOME=/usr/local/src/spark
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_PID_DIR=${SPARK_HOME}/pids

spark-defaults.conf文件內容如下,注意/tmp/spark_logs目錄需要提前創建

spark.history.fs.logDirectory file:///tmp/spark_logs

在所有的節點安裝好spark,修改好對應的文件,提前創建好目錄後,就可以在每個計算節點啓動spark history server
啓動 ./sbin/start-history-server.sh
關閉 ./sbin/stop-history-server.sh

我們將spark提供的例子提交到yarn上,命令如下

spark-submit --conf spark.eventLog.enabled=true \
--conf spark.eventLog.dir=hdfs://namenode/shared/spark-logs \
--master yarn --deploy-mode cluster \
--class org.apache.spark.examples.SparkPi \
/usr/local/src/spark/examples/jars/spark-examples_2.11-2.4.5.jar 100

當application完成後然後可以在對應的歷史任務上看到
在這裏插入圖片描述

存儲在HDFS文件系統

如果將application event log存儲在HDFS文件系統,那麼只需要將上面的 file:///tmp/spark_logs 改爲hdfs路徑如hdfs://master:9000/tmp/spark_logs,同樣地hdfs上的路徑/tmp/spark_logs需要預先創建好。
同時用spark-submit提交任務時改爲--conf spark.eventLog.dir=hdfs://master:9000/tmp/spark_logs即可。
這樣的話就只用啓動一個Spark History server了,不要像存儲在本地文件系統一樣需要在每個計算節點都啓動相應的服務。
在這裏插入圖片描述

history server日誌會很大的問題

查看history server的啓動腳本可知,history server 啓動的時候使用了默認的 log4j.properties 文件裏面的配置,用的是org.apache.log4j.ConsoleAppender,導致每次只有重啓 HistoryServer 的時候纔會重新生成一個新的日誌文件而且滾動文件最多隻有5個(看spark-daemon.sh腳本的spark_rotate_log),如果不重啓 HistoryServer,日誌文件會無限制的增長下去,久而久之導致存放 HistoryServer 日誌的文件夾越來越大。
解決方案就是啓用新的log4j.properties文件,改成org.apache.log4j.RollingFileAppender,內容如下

# 設置historyserver的日誌大小
log4j.logger.org.apache.spark.deploy.history=info,historyserver
# 這樣信息就不會輸出到父logger
log4j.additivity.org.apache.spark.deploy.history=false
log4j.appender.historyserver=org.apache.log4j.RollingFileAppender
log4j.appender.historyserver.layout=org.apache.log4j.PatternLayout
log4j.appender.historyserver.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
log4j.appender.historyserver.MaxFileSize=1GB
log4j.appender.historyserver.MaxBackupIndex=7
log4j.appender.historyserver.File=/usr/local/src/spark/logs/historyserver.log

在這裏插入圖片描述

參考網址

Spark Monitoring
spark history server日誌文件過大報警

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