spark reduceByKey原始碼解析
使用關聯和可交換的歸約函式合併每個key的value。 在將結果傳送給reducer之前,這還將在每個Mapper上本地執行合併,類似於MapReduce中的“ combiner”。
def reduceByKey(partitioner: Partitioner, func: (V, V) => V): RDD[(K, V)] = self.withScope {
combineByKeyWithClassTag[V]((v: V) => v, func, func, partitioner)
}
呼叫了combineByKeyWithClassTag
,繼續檢視
::實驗::通用函式,使用一組自定義的聚合函式來組合每個鍵的元素。
對於“組合型別” C,將RDD [(K,V)]轉換為RDD [(K,C)]型別的結果
使用者提供三個功能:
createCombiner,它將V變成C(例如,建立一個元素列表)
mergeValue,將V合併為C(例如,將其新增到列表的末尾)
mergeCombiners,將兩個C合併為一個。
此外,使用者可以控制輸出RDD的分割槽,以及是否執行map側聚合(如果一個對映器可以使用相同的鍵產生多個專案)。
注意:
V和C可以不同-例如,可以將型別(Int,Int)的RDD分組為型別(Int,Seq [Int])的RDD。
def combineByKeyWithClassTag[C](
createCombiner: V => C,
mergeValue: (C, V) => C,
mergeCombiners: (C, C) => C,
partitioner: Partitioner,
mapSideCombine: Boolean = true,
serializer: Serializer = null)(implicit ct: ClassTag[C]): RDD[(K, C)] = self.withScope {
require(mergeCombiners != null, "mergeCombiners must be defined") // required as of Spark 0.9.0
if (keyClass.isArray) {
if (mapSideCombine) {
throw new SparkException("Cannot use map-side combining with array keys.")
}
if (partitioner.isInstanceOf[HashPartitioner]) {
throw new SparkException("HashPartitioner cannot partition array keys.")
}
}
val aggregator = new Aggregator[K, V, C](
self.context.clean(createCombiner),
self.context.clean(mergeValue),
self.context.clean(mergeCombiners))
if (self.partitioner == Some(partitioner)) {
self.mapPartitions(iter => {
val context = TaskContext.get()
new InterruptibleIterator(context, aggregator.combineValuesByKey(iter, context))
}, preservesPartitioning = true)
} else {
new ShuffledRDD[K, V, C](self, partitioner)
.setSerializer(serializer)
.setAggregator(aggregator)
.setMapSideCombine(mapSideCombine)
}
}
相關文章
- Spark原始碼-SparkContext原始碼解析Spark原始碼Context
- Spark入門(五)--Spark的reduce和reduceByKeySpark
- spark RDD,reduceByKey vs groupByKeySpark
- Spark 原始碼解析之SparkContextSpark原始碼Context
- Spark原始碼解析之Shuffle WriterSpark原始碼
- Spark原始碼解析之Storage模組Spark原始碼
- Spark Shuffle機制詳細原始碼解析Spark原始碼
- Spark原始碼解析-Yarn部署流程(ApplicationMaster)Spark原始碼YarnAPPAST
- Spark 原始碼系列(六)Shuffle 的過程解析Spark原始碼
- spark核心(下)——job任務提交原始碼解析Spark原始碼
- Spark效能優化:提高並行度、使用reduceByKeySpark優化並行
- spark的基本運算元使用和原始碼解析Spark原始碼
- Spark SQL原始碼解析(四)Optimization和Physical Planning階段解析SparkSQL原始碼
- Spark 原始碼系列(九)Spark SQL 初體驗之解析過程詳解Spark原始碼SQL
- Spark 原始碼解析 : DAGScheduler中的DAG劃分與提交Spark原始碼
- 通過WordCount解析Spark RDD內部原始碼機制Spark原始碼
- Spark 原始碼分析系列Spark原始碼
- Apache Spark原始碼剖析ApacheSpark原始碼
- 除錯spark原始碼除錯Spark原始碼
- Spark SQL原始碼解析(五)SparkPlan準備和執行階段SparkSQL原始碼
- [原始碼解析] 深度學習分散式訓練框架 horovod (8) --- on spark原始碼深度學習分散式框架Spark
- spark核心原始碼深度剖析Spark原始碼
- Spark原始碼分析之MemoryManagerSpark原始碼
- Spark原始碼分析之BlockStoreSpark原始碼BloC
- [原始碼解析] 深度學習分散式訓練框架 horovod (10) --- run on spark原始碼深度學習分散式框架Spark
- Spark 原始碼系列(七)Spark on yarn 具體實現Spark原始碼Yarn
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- Spark-2.4.0原始碼:sparkContextSpark原始碼Context
- Spark job分配流程原始碼分析Spark原始碼
- [原始碼解析] 深度學習分散式訓練框架 horovod (9) --- 啟動 on spark原始碼深度學習分散式框架Spark
- [原始碼解析] 深度學習分散式訓練框架 horovod (11) --- on spark --- GLOO 方案原始碼深度學習分散式框架Spark
- spark 原始碼分析之十八 -- Spark儲存體系剖析Spark原始碼
- spark 原始碼分析之十五 -- Spark記憶體管理剖析Spark原始碼記憶體
- CountDownLatch原始碼解析CountDownLatch原始碼
- LeakCanary原始碼解析原始碼
- vuex原始碼解析Vue原始碼
- ArrayBlockQueue原始碼解析BloC原始碼
- AsyncTask原始碼解析原始碼