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 RDD,reduceByKey vs groupByKeySpark
- Spark入門(五)--Spark的reduce和reduceByKeySpark
- Spark原始碼解析-Yarn部署流程(ApplicationMaster)Spark原始碼YarnAPPAST
- Spark Shuffle機制詳細原始碼解析Spark原始碼
- Spark效能優化:提高並行度、使用reduceByKeySpark優化並行
- Spark 原始碼系列(六)Shuffle 的過程解析Spark原始碼
- spark核心(下)——job任務提交原始碼解析Spark原始碼
- Spark SQL原始碼解析(四)Optimization和Physical Planning階段解析SparkSQL原始碼
- spark的基本運算元使用和原始碼解析Spark原始碼
- Spark 原始碼系列(九)Spark SQL 初體驗之解析過程詳解Spark原始碼SQL
- 通過WordCount解析Spark RDD內部原始碼機制Spark原始碼
- Spark 原始碼解析 : DAGScheduler中的DAG劃分與提交Spark原始碼
- Spark 原始碼分析系列Spark原始碼
- Spark SQL原始碼解析(五)SparkPlan準備和執行階段SparkSQL原始碼
- [原始碼解析] 深度學習分散式訓練框架 horovod (8) --- on spark原始碼深度學習分散式框架Spark
- Spark-2.4.0原始碼:sparkContextSpark原始碼Context
- spark核心原始碼深度剖析Spark原始碼
- [原始碼解析] 深度學習分散式訓練框架 horovod (10) --- run on spark原始碼深度學習分散式框架Spark
- Spark 原始碼系列(七)Spark on yarn 具體實現Spark原始碼Yarn
- [原始碼解析] 深度學習分散式訓練框架 horovod (11) --- on spark --- GLOO 方案原始碼深度學習分散式框架Spark
- [原始碼解析] 深度學習分散式訓練框架 horovod (9) --- 啟動 on spark原始碼深度學習分散式框架Spark
- Spark core篇 Rpc原始碼1SparkRPC原始碼
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- Java Timer原始碼解析(定時器原始碼解析)Java原始碼定時器
- 【spark筆記】在idea用maven匯入spark原始碼Spark筆記IdeaMaven原始碼
- spark 原始碼分析之十八 -- Spark儲存體系剖析Spark原始碼
- spark 原始碼分析之十五 -- Spark記憶體管理剖析Spark原始碼記憶體
- Spark RPC框架原始碼分析(三)Spark心跳機制分析SparkRPC框架原始碼
- ReactNative原始碼解析-初識原始碼React原始碼
- Hive原始碼解析Hive原始碼
- ArrayList原始碼解析原始碼
- ConcurrentHashMap原始碼解析HashMap原始碼
- LinkedBlockingQueue 原始碼解析BloC原始碼
- Axios原始碼解析iOS原始碼
- RecyclerView原始碼解析View原始碼
- MyBatis原始碼解析MyBatis原始碼
- CountDownLatch原始碼解析CountDownLatch原始碼
- Promise 原始碼解析Promise原始碼