在apache spark的官方文檔中,https://spark.apache.org/docs/latest/monitoring.html#rest-api,列舉了spark程序的rest入口是 http://localhost:4040/api/v1.
當spark程序跑在yarn上的時候,類似 localhost:4040這種地址實際上被yarn的resource manager代理了,所以入口地址通常是 http://<active-rm-address>:8088/proxy/application_<id>/api/v1,其中active-rm-address即處於active狀態的resource manager的主機名。那么根據上面spark的monitoring.html文檔中給出的rest api路徑,比如查找streaming程序的統計量,那么可以附加 /applications/<application-id>/streaming/statistics,拼接成url。
application-id可以通過yarn application -list 命令查看,或者yarn的resource manager的web ui頁面查看。
示例:
GET請求: http://<active-rm-address>:8088/proxy/application_1591086111954_6422/api/v1/applications/application_1591086111954_6422/streaming/statistics (curl <url>即可對url請求GET)。
返回結果如下所示:
{
"startTime": "2020-09-05T20:00:43.722GMT",
"batchDuration": 3000,
"numReceivers": 1,
"numActiveReceivers": 1,
"numInactiveReceivers": 0,
"numTotalCompletedBatches": 102909,
"numRetainedCompletedBatches": 1000,
"numActiveBatches": 1,
"numProcessedRecords": 35581455,
"numReceivedRecords": 35581802,
"avgInputRate": 113.99567099567113,
"avgSchedulingDelay": 114,
"avgProcessingTime": 2436,
"avgTotalDelay": 2551
}
需要注意的是,雖然通過yarn的web ui界面查看spark streaming程序的信息,進入application manager頁面的時候,都有Streaming這個Tab,但是對於 /applications/<app-id>/streaming/statistics 這個接口地址,好像在spark 2.1.0的時候還沒有,從spark 2.2.0開始就有了(挑幾個版本大致看了下各版本文檔中關於monitoring的描述,不一定准確)。
改進:
更直接的方法,通過yarn application -list 命令搞定即可。我們知道,該命令的輸出內容是若干列:
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
第一列我們可以獲得Application-Id, 最后一列我們可以獲得 Tracking-URL。這個Tracking-URL實際上是一個跳轉地址,在瀏覽器中輸入該地址訪問,會跳轉為
http://<active-rm-address>:8088/proxy/redirect/application_1591086111954_6422 類似的地址,而這個地址和 http://<active-rm-address>:8088/proxy/application_1591086111954_6422 (注意url中/proxy后面沒有redirect了)是一樣的,
所以可以直接使用Tracking-URL這列的地址組合 /api/v1/<application-id>/streaming/statistics 之類的路徑,構成GET請求的目標url。這樣避免確定active-rm-address的過程(尤其是對於做了rm ha的集群而言)——其實后來也發現即使做了rm ha的集群,使用處於standby狀態的rm的地址放在上面的url,也是可以的,會自動跳轉到active狀態的rm的地址。當然了,使用Tracking-URL還是最簡單的,根本不需要預先知道rm的地址。對於這種使用跳轉的地址方法,curl 命令需要加 -L 參數,否則返回的是包含跳轉后地址的網頁。
提醒:
targeturl中,如果把api/v1改成app/v1,好像也是能訪問的,不過返回的是網頁,不是json數據。我是手誤碰到這種情況,讓我迷惑了很久。
參考:"How to get Spark Metrics as JSON using Spark REST API in YARN Cluster mode"