1. 程式人生 > >深入淺出Spark2.1.0度量系統——Source繼承體系

深入淺出Spark2.1.0度量系統——Source繼承體系

閱讀提示:閱讀本文前,最好請閱讀《Spark2.1.0——深入淺出度量系統》一文。

         任何監控都離不開度量資料的採集,離線的資料採集很容易做到和被採集模組之間的解耦,但是對於實時度量資料,尤其是那些記憶體中資料的採集就很難解耦。這就類似於網頁監控資料的埋點一樣,你要在網頁中加入一段額外的js程式碼(例如Google分析,即便你只是引入一個js檔案,這很難讓前端工程師感到開心)。還有一類監控,比如在Java Web中增加一個負責監控的Servlet或者一個基於Spring3.0的攔截器,這種方式雖然將耦合度從程式碼級別降低到配置級別,但卻無法有效的對記憶體中的資料結構進行監控。Spark的度量系統對系統功能來說是在程式碼層面耦合的,這種犧牲對於能夠換取對實時的、處於記憶體中的資料進行更有效的監控是值得的。

         Spark將度量來源抽象為Source,其定義見程式碼清單1。

程式碼清單1         度量源的定義

private[spark] trait Source {
  def sourceName: String
  def metricRegistry: MetricRegistry
}

從程式碼清單1,可以看到Source是一個特質,其中定義了兩個方法:

  • sourceName:度量源的名稱;
  • metricRegistry:當前度量源的登錄檔。MetricRegistry是Metrics庫提供的API,在《附錄D Metrics簡介》中有更詳細的介紹。

Spark中有很多Source的具體實現,可以通過圖1來了解。

Source的繼承體系
圖1     Source的繼承體系

為了說明Source該如何實現,我們選擇ApplicationSource(也是因為其實現簡單明瞭,足以說明問題)為例,其實現見程式碼清單2。

程式碼清單2         ApplicationSource的實現

private[master] class ApplicationSource(val application: ApplicationInfo) extends Source {
  override val metricRegistry = new MetricRegistry()
  override val sourceName = "%s.%s.%s".format("application", application.desc.name,
    System.currentTimeMillis())

  metricRegistry.register(MetricRegistry.name("status"), new Gauge[String] {
    override def getValue: String = application.state.toString
  })

  metricRegistry.register(MetricRegistry.name("runtime_ms"), new Gauge[Long] {
    override def getValue: Long = application.duration
  })

  metricRegistry.register(MetricRegistry.name("cores"), new Gauge[Int] {
    override def getValue: Int = application.coresGranted
  })

}

望文生義,ApplicationSource用於採集Spark應用程式相關的度量。程式碼清單2中ApplicationSource過載了metricRegistry和sourceName,並且向自身的登錄檔註冊了status(即應用狀態,包括:WAITING, RUNNING, FINISHED, FAILED, KILLED, UNKNOWN)、runtime_ms(執行持續時長)、cores(授權的核心數)等度量。這三個度量的取值分別來自於ApplicationInfo的state、duration和coresGranted三個屬性。這三個度量都由Gauge的匿名內部類實現,Gauge是Metrics提供的用於估計度量值的特質。有關Gauge、MetricRegistry、MetricRegistry註冊度量的方法register及命名方法name的更詳細介紹請閱讀《附錄D Metrics簡介》。

關於《Spark核心設計的藝術 架構設計與實現》

經過近一年的準備,《Spark核心設計的藝術 架構設計與實現》一書現已出版發行,圖書如圖:

紙質版售賣連結如下: