天天看點

《Spark 官方文檔》監控和工具監控和工具Web界面度量進階工具

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

每個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是運作于mesos或者yarn上的話,那麼你需要開啟spark的history server,開啟event log。開啟history server需要如下指令:

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

環境變量

含義

<code>spark_daemon_memory</code>

history server配置設定多少記憶體(預設: 1g)

<code>spark_daemon_java_opts</code>

history server的 jvm參數(預設:none)

<code>spark_public_dns</code>

history server的外部通路位址,如果不配置,那麼history server有可能會綁定server的内部位址,這可能會導緻外部不能通路(預設:none)

<code>spark_history_opts</code>

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

history server對應的kerberos keytab檔案路徑

spark.history.ui.acls.enable

指定是否啟用acl以控制使用者通路驗證。如果啟用,那麼不管某個應用是否設定了 spark.ui.acls.enabled,通路控制都将檢查使用者是否有權限。spark應用的owner始終有檢視的權限,而其他使用者則需要通過 spark.ui.view.acls 配置其通路權限。如果禁用,則不會檢查通路權限。

spark.history.fs.cleaner.enabled

指定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上了。

度量資訊除了可以在ui上檢視之外,還可以以json格式通路。這能使開發人員很容易建構新的spark可視化和監控工具。json格式的度量資訊對運作中的spark應用和history server中的曆史作業均有效。其通路端點挂載在 /api/v1 路徑下。例如,對于history server,一般你可以通過 http://&lt;server-url&gt;:18080/api/v1 來通路,而對于運作中的應用,可以通過 http://localhost:4040/api/v1 來通路。

端點

<code>/applications</code>

所有應用的清單

<code>/applications/[app-id]/jobs</code>

給定應用的全部作業清單

<code>/applications/[app-id]/jobs/[job-id]</code>

給定作業的細節

<code>/applications/[app-id]/stages</code>

給定應用的stage清單

<code>/applications/[app-id]/stages/[stage-id]</code>

給定stage的所有attempt清單

<code>/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]</code>

給定attempt的詳細資訊

<code>/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/tasksummary</code>

指定attempt對應的所有task的概要度量資訊

<code>/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/tasklist</code>

指定的attempt的所有task的清單

<code>/applications/[app-id]/executors</code>

給定應用的所有執行器

<code>/applications/[app-id]/storage/rdd</code>

給定應用的已儲存的rdd清單

<code>/applications/[app-id]/storage/rdd/[rdd-id]</code>

給定的rdd的存儲詳細資訊

<code>/applications/[app-id]/logs</code>

将給定應用的所有attempt對應的event log以zip格式打包下載下傳

<code>/applications/[app-id]/[attempt-id]/logs</code>

将給定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。雖然麻煩點,但這能保證兩種模式下通路路徑的一緻性。

<code>master</code>: 對應spark獨立部署時的master程序。

<code>applications</code>: master程序中的一個元件,專門彙報各個spark應用的度量資訊。

<code>worker</code>: 對應spark獨立部署時的worker程序。

<code>executor</code>: 對應spark執行器。

<code>driver</code>: 對應spark驅動器程序(即建立sparkcontext對象的程序)。

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

<code>consolesink</code>:将度量資訊列印到控制台。

<code>csvsink</code>: 以特定的間隔,将度量資訊輸出到csv檔案。

<code>jmxsink</code>: 将度量資訊注冊到jmx控制台。

<code>metricsservlet</code>: 在已有的spark ui中增加一個servlet,對外提供json格式的度量資料。

<code>graphitesink</code>: 将度量資料發到graphite 節點。

<code>slf4jsink</code>: 将度量資料發送給slf4j 打成日志。

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

<code>gangliasink</code>: 将度量資訊發送給一個ganglia節點或者多點傳播組。

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

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

jvm工具可以幫助你分析jvm虛拟機,如:jstack可以提供調用棧資訊,jmap可以轉儲堆記憶體資料,jstat可以彙報時序統計資訊,jconsole可以直覺的探索各種jvm屬性,這對于熟悉jvm内部機制非常有用。