Apache spark Spark中的蓄能器和collect()之间的性能差异是什么?

Apache spark Spark中的蓄能器和collect()之间的性能差异是什么?,apache-spark,Apache Spark,累加器基本上是spark中的共享变量,由执行器更新,但仅由驱动程序读取。 spark中的Collect()用于从执行器将所有数据输入驱动程序 所以,在这两种情况下,当我最终只在驱动程序中获取数据时。那么,当我们使用累加器或collect()将大型RDD转换为列表时,在性能上有什么区别 使用累加器将数据帧转换为列表的代码 val queryOutput = spark.sql(query) val acc = spark.sparkContext.collectionAccumulator[Map

累加器基本上是spark中的共享变量,由执行器更新,但仅由驱动程序读取。 spark中的
Collect()
用于从执行器将所有数据输入驱动程序

所以,在这两种情况下,当我最终只在驱动程序中获取数据时。那么,当我们使用累加器或
collect()
将大型RDD转换为列表时,在性能上有什么区别

使用累加器将数据帧转换为列表的代码

val queryOutput = spark.sql(query)
val acc = spark.sparkContext.collectionAccumulator[Map[String,Any]]("JsonCollector")
val jsonString = queryOutput.foreach(a=>acc.add(convertRowToJSON(a)))
acc.value.asScala.toList


def convertRowToJSON(row: Row): Map[String,Any] = {
    val m = row.getValuesMap(row.schema.fieldNames)
    println(m)
    JSONObject(m).obj
  }
使用collect()将数据帧转换为列表的代码

将大型RDD转换为列表

这不是一个好主意。collect将数据从所有执行器移动到驱动程序内存。如果内存不足,则会抛出内存不足(OOM)异常。若你们的数据适合于单机内存,那个么你们可能不需要spark

Spark本机支持数字类型的累加器,程序员可以添加对新类型的支持。它们可用于实现计数器(如MapReduce)或求和。累加器的OUT参数应该是一种可以原子读取(例如Int、Long)或线程安全读取(例如synchronized collections)的类型,因为它将从其他线程读取

CollectionAccumulator
.value
返回列表(ArrayList实现),如果大小大于驱动程序内存,它将抛出OOM

将大型RDD转换为列表

这不是一个好主意。collect将数据从所有执行器移动到驱动程序内存。如果内存不足,则会抛出内存不足(OOM)异常。若你们的数据适合于单机内存,那个么你们可能不需要spark

Spark本机支持数字类型的累加器,程序员可以添加对新类型的支持。它们可用于实现计数器(如MapReduce)或求和。累加器的OUT参数应该是一种可以原子读取(例如Int、Long)或线程安全读取(例如synchronized collections)的类型,因为它将从其他线程读取


CollectionAccumulator
.value
返回列表(ArrayList实现),如果大小大于驱动程序内存,它将抛出OOM。

我们可以使用累加器将数据从大型RDD转换为列表,就像我已经做的那样。我唯一不明白的是,how collect()给出了OOM问题,但累加器没有。@KaranManchanda:你能把它添加到问题中吗?也就是说,你使用的代码与累加器一起工作。这将使分析差异变得更容易。我们可以使用累加器将数据从大型RDD转换为列表,就像我已经做的那样。我唯一不明白的是,how collect()给出了OOM问题,但累加器没有。@KaranManchanda:你能把它添加到问题中吗?也就是说,你使用的代码与累加器一起工作。这将使分析差异变得更容易。你能为Accumperor添加代码吗?我用代码更新了原始问题。你能为Accumperor添加代码吗?我用代码更新了原始问题。
val queryOutput = spark.sql(query)
queryOutput.toJSON.collectAsList()