1. 程式人生 > >《Spark 官方文件》監控和工具

《Spark 官方文件》監控和工具

spark-1.6.0 原文地址

監控和工具

監控Spark應用有很多種方式:web UI,metrics 以及外部工具。

Web介面

每個SparkContext都會啟動一個web UI,其預設埠為4040,並且這個web UI能展示很多有用的Spark應用相關資訊。包括:

  • 一個stage和task的排程列表
  • 一個關於RDD大小以及記憶體佔用的概覽
  • 執行環境相關資訊
  • 執行中的執行器相關資訊

你只需開啟瀏覽器,輸入 http://<driver-node>:4040 即可訪問該web介面。如果有多個SparkContext在同時執行中,那麼它們會從4040開始,按順序依次繫結埠(4041,4042,等)。

注意,預設情況下,這些資訊只有在Spark應用執行期內才可用。如果需要在Spark應用退出後仍然能在web UI上檢視這些資訊,則需要在應用啟動前,將 spark.eventLog.enabled 設為 true。這項配置將會把Spark事件日誌都記錄到持久化儲存中。

事後檢視

Spark獨立部署時,其對應的叢集管理器也有其對應的 web UI。如果Spark應用將其執行期事件日誌保留下來了,那麼獨立部署叢集管理器對應的web UI將會根據這些日誌自動展示已經結束的Spark應用。

如果Spark是運行於Mesos或者YARN上的話,那麼你需要開啟Spark的history server,開啟event log。開啟history server需要如下指令:

./sbin/start-history-server.sh

如果使用file-system provider class(參考下面的 spark.history.provider),那麼日誌目錄將會基於 spark.history.fs.logDirectory 配置項,並且在表達Spark應用的事件日誌路徑時,應該帶上子目錄。history server對應的web介面預設在這裡 http://<server-url>:18080。同時,history server有一些可用的配置如下:

環境變數 含義
SPARK_DAEMON_MEMORY history server分配多少記憶體(預設: 1g)
SPARK_DAEMON_JAVA_OPTS history server的 JVM引數(預設:none)
SPARK_PUBLIC_DNS history server的外部訪問地址,如果不配置,那麼history server有可能會繫結server的內部地址,這可能會導致外部不能訪問(預設:none)
SPARK_HISTORY_OPTS history server配置項(預設:none):spark.history.*
屬性名稱 預設值 含義
spark.history.provider org.apache.spark.deploy
.history.FsHistoryProvider
Spark應用歷史後臺實現的類名。目前可用的只有spark自帶的一個實現,支援在本地檔案系統中查詢應用日誌。
spark.history.fs.logDirectory file:/tmp/spark-events history server載入應用日誌的目錄
spark.history.fs.update.interval 10s history server更新資訊的時間間隔。每次更新將會檢查磁碟上的日誌是否有更新。
spark.history.retainedApplications 50 UI上保留的spark應用歷史個數。超出的將按時間排序,刪除最老的。
spark.history.ui.port 18080 history server繫結的埠
spark.history.kerberos.enabled false history server是否啟用kerberos驗證登陸。如果history server需要訪問一個需要安全保證的hadoop叢集,則需要開啟這個功能。該配置設為true以後,需要同時配置 spark.history.kerberos.principal 和 spark.history.kerberos.keytab
spark.history.kerberos.principal (none) 登陸history server的kerberos 主體名稱
spark.history.kerberos.keytab (none) history server對應的kerberos keytab檔案路徑
spark.history.ui.acls.enable false 指定是否啟用ACL以控制使用者訪問驗證。如果啟用,那麼不管某個應用是否設定了 spark.ui.acls.enabled,訪問控制都將檢查使用者是否有許可權。Spark應用的owner始終有檢視的許可權,而其他使用者則需要通過 spark.ui.view.acls 配置其訪問許可權。如果禁用,則不會檢查訪問許可權。
spark.history.fs.cleaner.enabled false 指定history server是否週期性清理磁碟上的event log
spark.history.fs.cleaner.interval 1d history server清理磁碟檔案的時間間隔。只會清理比 spark.history.fs.cleaner.maxAge 時間長的磁碟檔案。
spark.history.fs.cleaner.maxAge 7d 如果啟用了history server週期性清理,比這個時間長的Spark作業歷史檔案將會被清理掉

注意,所有web介面上的 table 都可以點選其表頭來排序,這樣可以幫助使用者做一些簡單分析,如:發現跑的最慢的任務、資料傾斜等。

注意history server 只展示已經結束的Spark作業。一種通知Spark作業結束的方法是,顯式地關閉SparkContext(通過呼叫 sc.stop(),或者在 使用 SparkContext() 處理其 setup 和 tear down 事件(適用於python),然後作業歷史就會出現在web UI上了。

REST API

度量資訊除了可以在UI上檢視之外,還可以以JSON格式訪問。這能使開發人員很容易構建新的Spark視覺化和監控工具。JSON格式的度量資訊對執行中的Spark應用和history server中的歷史作業均有效。其訪問端點掛載在 /api/v1 路徑下。例如,對於history server,一般你可以通過 http://<server-url>:18080/api/v1 來訪問,而對於執行中的應用,可以通過 http://localhost:4040/api/v1 來訪問。

端點 含義
/applications 所有應用的列表
/applications/[app-id]/jobs 給定應用的全部作業列表
/applications/[app-id]/jobs/[job-id] 給定作業的細節
/applications/[app-id]/stages 給定應用的stage列表
/applications/[app-id]/stages/[stage-id] 給定stage的所有attempt列表
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id] 給定attempt的詳細資訊
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary 指定attempt對應的所有task的概要度量資訊
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList 指定的attempt的所有task的列表
/applications/[app-id]/executors 給定應用的所有執行器
/applications/[app-id]/storage/rdd 給定應用的已儲存的RDD列表
/applications/[app-id]/storage/rdd/[rdd-id] 給定的RDD的儲存詳細資訊
/applications/[app-id]/logs 將給定應用的所有attempt對應的event log以zip格式打包下載
/applications/[app-id]/[attempt-id]/logs 將給定attempt的所有attempt對應的event log以zip格式打包下載

如果在YARN上執行,每個應用都由多個attempts,所以 [app-id] 實際上是 [app-id]/[attempt-id]。

這些API端點都有版本號,所以基於這些API開發程式就比較容易。Spark將保證:

  • 端點一旦新增進來,就不會刪除
  • 某個端點支援的欄位永不刪除
  • 未來可能會增加新的端點
  • 已有端點可能會增加新的欄位
  • 未來可能會增加新的API版本,但會使用不同的端點(如:api/v2 )。但新版本不保證向後相容。
  • API版本可能會整個丟棄掉,但在丟棄前,一定會和新版本API共存至少一個小版本。

注意,在UI上檢查執行中的應用時,雖然每次只能檢視一個應用, 但applicatoins/[app-id] 這部分路徑仍然是必須的。例如,你需要檢視執行中應用的作業列表時,你需要輸入 http://localhost:4040/api/v1/applications/[app-id]/jobs。雖然麻煩點,但這能保證兩種模式下訪問路徑的一致性。

度量

Spark的度量子系統是可配置的,其功能是基於Coda Hale Metrics Library開發的。這套度量子系統允許使用者以多種形式的彙報槽(sink)彙報Spark度量資訊,包括:HTTP、JMX和CSV檔案等。其對應的配置檔案路徑為:${SPARK_HOME}/conf/metrics.properties。當然,你可以通過spark.metrics.conf 這個Spark屬性來自定義配置檔案路徑(詳見configuration property)。Spark的各個元件都有其對應的度量例項,且這些度量例項之間是解耦的。這些度量例項中,你都可以配置一系列不同的彙報槽來彙報度量資訊。以下是目前支援的度量例項:

  • master: 對應Spark獨立部署時的master程序。
  • applications: master程序中的一個元件,專門彙報各個Spark應用的度量資訊。
  • worker: 對應Spark獨立部署時的worker程序。
  • executor: 對應Spark執行器。
  • driver: 對應Spark驅動器程序(即建立SparkContext物件的程序)。

每個度量例項可以彙報給0~n個槽。以下是目前 org.apache.spark.metrics.sink 包中包含的幾種彙報槽(sink):

  • ConsoleSink:將度量資訊列印到控制檯。
  • CSVSink: 以特定的間隔,將度量資訊輸出到CSV檔案。
  • JmxSink: 將度量資訊註冊到JMX控制檯。
  • MetricsServlet: 在已有的Spark UI中增加一個servlet,對外提供JSON格式的度量資料。
  • GraphiteSink: 將度量資料發到Graphite 節點。
  • Slf4jSink: 將度量資料傳送給slf4j 打成日誌。

Spark同樣也支援Ganglia,但因為license限制的原因沒有包含在預設的釋出包中:

  • GangliaSink: 將度量資訊傳送給一個Ganglia節點或者多播組。

如果需要支援GangliaSink的話,你需要自定義Spark構建包。注意,如果你包含了GangliaSink程式碼包的話,就必須同時將 LGPL-licensed 協議包含進你的Spark包中。對於sbt使用者,只需要在編譯打包前設定好環境變數:SPARK_GANGLIA_LGPL即可。對於maven使用者,啟用 -Pspark-ganglia-lgpl 即可。另外,除了修改叢集的Spark之外,使用者程式還需要連結 spark-ganglia-lgpl 工件。

度量系統配置檔案語法可以參考這個配置檔案示例:${SPARK_HOME}/conf/metrics.properties.template

高階工具

以下是幾個可以用以分析Spark效能的外部工具:

  • 叢集整體監控工具,如:Ganglia,可以提供叢集整體的使用率和資源瓶頸檢視。比如,Ganglia的儀表盤可以迅速揭示出整個叢集的工作負載是否達到磁碟、網路或CPU限制。
  • 作業系統分析工具,如:dstatiostat, 以及 iotop ,可以提供單個節點上細粒度的分析剖面。
  • JVM工具可以幫助你分析JVM虛擬機器,如:jstack可以提供呼叫棧資訊,jmap可以轉儲堆記憶體資料,jstat可以彙報時序統計資訊,jconsole可以直觀的探索各種JVM屬性,這對於熟悉JVM內部機制非常有用。