標籤:
最近在看各種部落格,學習 spark 原始碼。
網上對原始碼的分析基本都是基於 0.7, 0.8, 1.0 的代碼,而現在的發行版已經是 1.5 了。所以有些代碼不大對的上。比如函數 RDD.map()
舊版本是:
def mapU: ClassTag: RDD[U] = new MappedRDD(this, sc.clean(f))
1.5 版本是:
def map[U: ClassTag](f: T => U): RDD[U] = withScope { val cleanF = sc.clean(f) new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))}
而且所有 RDD 的轉化方法都調用了 RDDOperationScope.withScope,於是我就很好奇這個函數有什麼作用。
它首先是根據堆棧資訊(Thread.currentThread.getStackTrace)找出調用者的名字,比如 map, textFile, reduceByKey 等等,然後在 SparkContext 的屬性 "spark.rdd.scope" 中建立了一個屬性 RDDOperationScope(name: String, parent: RDDOperationScope),用來記錄當前的運行 RDD 資訊。其中 parent 可以用來追溯到所有 RDD 操作資訊,即 RDDOperationScope。
這又啥用?於是我 git blame 了一下,找到了代碼的提交雜湊值為 fc8b5819,再 git show,於是有了詳細的介紹,第一行是
[SPARK-6943] [SPARK-6944] DAG visualization on SparkUI
原來是用來做 DAG 的可視化。再找到這個 SPARK-6943,有非常詳細的動機描述:現有的 Spark UI 中只有 stage 的執行情況,而 stage 與使用者代碼中 rdd 的聯絡不夠直接,如果代碼複雜,很難根據 UI 資訊瞭解到代碼的執行情況,於是想強化 UI 中的 RDD 可視化功能,所以把所有建立 RDD 的方法包裹起來,使用 RDDOperationScope 記錄 RDD 的操作曆史和關聯,就能達成目標。
RDD 可視化 —— RDDOperationScope.withScope