即使键的数据非常庞大,spark会在"groupByKey"之后保留单个分区中特定键的RDD [K,V]的所有元素吗?

Tom*_*ian 5 apache-spark rdd

考虑我有一个PairedRDD,例如10个分区.但是密钥并不是均匀分布的,即所有9个拥有数据的分区都属于单个密钥,a而其余的密钥只表示b,c在最后一个分区中.这由下图表示: 在此输入图像描述

现在,如果我做了groupByKey这个rdd,从我的理解为相同的密钥的所有数据最终将不同分区或相同的密钥没有数据将不会在多个分区.如果我错了,请纠正我.

如果是这种情况,那么密钥的分区a可能大小可能不适合工作人员的RAM.在那种情况下,火花会做什么?我的假设是它会将数据泄漏到工作者的磁盘上.那是对的吗?或者火花如何处理这种情况

zer*_*323 6

spark会在之后的单个分区中保留特定键的所有元素(...) groupByKey

是的,它确实.这是洗牌的一个重点.

密钥a的分区大小可能不适合工作人员的RAM.在那种情况下,火花会做什么

特定分区的大小不是这里最大的问题.分区使用惰性表示Iterators,可以轻松存储超出可用内存量的数据.主要问题是在分组过程中生成的非惰性本地数据结构.

特定键的所有值都存储在内存中,CompactBuffer因此单个大组可以生成OOM.即使每个记录分别适合内存,您仍可能遇到严重的GC问题.

一般来说:

  • 在分配给分区的数据量超过可用内存量的情况下重新分区数据是安全的,尽管不是最佳性能.
  • PairRDDFunctions.groupByKey在相同的情况下使用是不安全的.

注意:您不应该将其推断为不同的实现groupByKey.特别是Spark DatasetPySpark RDD.groupByKey使用更复杂的机制.