背景
主要介紹針對平臺的spark應用程式,在不修改用戶程式的情況下 如何采集其資源和性能指標為后續分析使用,如性能優化,資源使用計價等.
分析挑戰
在應用程式級別關聯大量行程的指標
在分布式環境中,多個 Spark 應用程式運行在同一臺服務器上,每個 Spark 應用程式都有大量的行程(例如數千個執行程式)在許多服務器上運行.

-
需要一個解決方案,該解決方案可以為每個行程收集指標,并將它們關聯到每個應用程式的流程中
-
我們不知道這些流程何時啟動以及需要多長時間,為了能夠在這種環境中收集指標,分析器需要隨每個行程自動啟動,
使指標收集對任意用戶代碼無干擾
為了跟上資料基礎設施的不斷增長,我們需要能夠隨時測量任何應用程式,而無需更改代碼,
例如,如果我們在 Hadoop 分布式檔案系統 (HDFS) NameNode 上遇到高延遲,我們希望檢查從每個 Spark 應用程式觀察到的延遲,以確保這些問題沒有被復制,由于 NameNode 客戶端代碼嵌入在我們的 Spark 庫中,因此修改其源代碼以添加此特定指標很麻煩,
JVM Profiler 引入
主要受 https://github.com/etsy/statsd-jvm-profiler 啟發構建了更多功能的分析器
JVM Profiler 由三個關鍵功能組成,可以更輕松地收集性能和資源使用指標,然后將這些指標(例如 Apache Kafka)提供給其他系統進行進一步分析:
-
java agent: 通過將 Java agent 合并到我們的分析器中,用戶可以以分布式方式收集 JVM 行程的各種指標(例如 CPU/記憶體使用情況)和堆疊跟蹤
-
高級分析功能:JVM Profiler 允許我們跟蹤用戶代碼中的任意 Java 方法和引數,而無需進行任何實際代碼更改,此功能可用于跟蹤 Spark 應用程式的 HDFS NameNode RPC 呼叫延遲并識別慢速方法呼叫,它還可以跟蹤每個 Spark 應用程式讀取或寫入的 HDFS 檔案路徑,以識別熱檔案以進行進一步優化,
-
資料分析報告:在 Uber,我們使用分析器向 Kafka topic和 Apache Hive 表報告指標,使資料分析更快更容易,
JVM Profiler 使用場景
-
大小合適的 executor:使用 JVM Profiler 的記憶體指標來跟蹤每個 executor 的實際記憶體使用情況,以便我們可以為 Spark“executor-memory”引數設定正確的值,
-
監控 HDFS NameNode RPC 延遲:我們分析Spark 應用程式中org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB類上的方法,并識別 NameNode 呼叫的長時間延遲
-
監控驅動程式丟棄事件: 分析像org.apache.spark.scheduler.LiveListenerBus.onDropEvent這樣的方法來跟蹤 Spark 驅動程式事件佇列變得太長并丟棄事件的情況,
-
跟蹤資料:在org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getBlockLocations和org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock方法上分析檔案路徑引數,以跟蹤 Spark 讀取和寫入的檔案應用
實作細節及可擴展性
為了使實作盡可能無縫,JVM Profiler 具有非常簡單且可擴展的設計,人們可以輕松添加額外的分析器實作來收集更多指標,還可以部署自己的自定義報告器,將指標發送到不同的系統進行資料分析,

一旦行程啟動,JVM Profiler 代碼就會通過Java agent 引數加載到 Java 行程中,它由三個主要部分組成:
-
Class File Transformer:在行程內檢測 Java 方法位元組碼以分析任意用戶代碼并將指標保存在內部指標緩沖區中,
-
Metric Profilers
- CPU/Memory Profiler:通過JMX收集 CPU/記憶體使用指標并將其發送給報告者,
- Method Duration Profiler:從指標緩沖區讀取方法持續時間(延遲)指標并發送給報告者,
- Method Argument Profiler: 從指標緩沖區讀取方法引數值并將其發送給報告者,
-
Reporters
- Console Reporter: 在控制臺輸出中寫入指標
- Kafka Reporter :將指標發送到 Kafka topic中
如何自定義reporter發送指標
用戶可以實作自己的報告器并使用 -javaagent 選項指定它:
-javaagent:jvm-profiler-0.0.5.jar= reporter=com.uber.profiling.reporters.CustomReporter
JVM Profiler 在Uber資料基礎設施集成

基礎設施集成實作:
- 集群范圍的資料分析:指標首先發送到 Kafka 并攝取到 HDFS,然后用戶使用 Hive/Presto/Spark 進行查詢,
- 實時 Spark 應用程式除錯:使用 Flink 實時聚合單個應用程式的資料并寫入MySQL 資料庫,然后用戶可以通過基于 Web 的界面查看指標,
如何落地的
擴展設計

整體流程:
-
spark應用在啟動的時候指定jvm-profiler jar, 運行時收集記憶體,cpu,gc.io等指標,定制實作的profile
-
使用自定的reproter,主要將指標通過http 發送到接收服務
-
接收服務負責將資料寫入kafka
-
kafka經flink 消費清洗分別寫入influxdb以及hive中,用于后續展示和分析
-
hive 一樣執行時,指定相關引數
-
通過決議/.staging/下job.xml 獲取queryId 及sql相關資訊
-
后續流程一樣
部署
spark: 上傳jvm-profiler jar 包到 hdfs上,提交任務時引數指定
hive: 部署jar到 hiveserver2 節點對應libs下面
總結
本文主要介紹了下Uber的開源專案jvm-profiler的產生背景,設計原理以及架構, 后面也設計了一套落地方案,用于采集spark、hive任務的資源消耗相關指標,可用于后續分析以及資源調優.
參考
https://eng.uber.com/jvm-profiler/
https://github.com/uber-common/jvm-profiler
本文作者: chaplinthink, 關注領域:大資料、基礎架構、系統設計, 一個熱愛學習、分享的大資料工程師轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/413153.html
標籤:大數據
