这可能听起来很基本。如果我做aggregateByKey或reduceByKey,我会聚合一个集合的特定实现。在聚合期间我是否需要使用线程安全集合? 这样好吗?
val sc: SparkContext = ???
val notAggregated = Seq(((1), 100),((1), 200),((1), 300),((2), 100),((2), 200))
sc.parallelize(notAggregated)
.aggregateByKey(mutable.HashSet.empty[Int])(
seqOp = (set, member) => set += member,
combOp = (set1, set2) => set1 ++= set2)
.foreach(println(_))
答案 0 :(得分:1)
它不必是线程安全的。
它在后台使用combineByKey,如果查看Spark源代码,则使用类PairDStreamFunctions.groupByKeyAndWindow。它使用ArrayBuffer作为组合器。还可以在评论中查看here,它说明了为什么它是线程安全的
为什么?
您没有直接设置零值 - 您编写创建组合器的函数。然后Spark在每个分区中创建组合器(克隆每个分区的值)。一个分区中的一个组合器像普通对象一样使用,没有来自应用程序中许多线程的并行访问,因为一个分区中的对象是按顺序处理的