《Spark 官方文檔》監控和工具
監控和工具
監控Spark應用有很多種方式:web UI,metrics 以及外部工具。
Web界麵
每個SparkContext都會啟動一個web UI,其默認端口為4040,並且這個web UI能展示很多有用的Spark應用相關信息。包括:
- 一個stage和task的調度列表
- 一個關於RDD大小以及內存占用的概覽
- 運行環境相關信息
- 運行中的執行器相關信息
你隻需打開瀏覽器,輸入 https://<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界麵默認在這裏 https://<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,一般你可以通過 https://<server-url>:18080/api/v1 來訪問,而對於運行中的應用,可以通過 https://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] 這部分路徑仍然是必須的。例如,你需要查看運行中應用的作業列表時,你需要輸入 https://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限製。
- 操作係統分析工具,如:dstat, iostat, 以及 iotop ,可以提供單個節點上細粒度的分析剖麵。
- JVM工具可以幫助你分析JVM虛擬機,如:jstack可以提供調用棧信息,jmap可以轉儲堆內存數據,jstat可以匯報時序統計信息,jconsole可以直觀的探索各種JVM屬性,這對於熟悉JVM內部機製非常有用。
- 轉載自 並發編程網 - ifeve.com
最後更新:2017-05-19 16:38:16