Apache spark 如何知道何时使用不平衡的分区重新分区/合并RDD(不可能进行洗牌)?

Apache spark 如何知道何时使用不平衡的分区重新分区/合并RDD(不可能进行洗牌)?,apache-spark,Apache Spark,为了我的spark工作,我正在从s3加载数以万计的Gzip文件。这导致一些分区非常小(10个记录),而另一些分区非常大(10000个记录)。分区的大小在节点之间分布得很好,因此每个执行器似乎在处理相同数量的聚合数据。所以我不确定自己是否有问题 我怎么知道它是否值得重新划分或合并RDD?这两种方法中的任何一种都能在不洗牌数据的情况下平衡分区吗?此外,RDD不会被重用,只是映射到另一个RDD,然后连接到另一个RDD。有趣的问题,合并肯定会更好,因为它不会触发完全洗牌。通常,当跨分区(例如,在过滤器之

为了我的spark工作,我正在从s3加载数以万计的Gzip文件。这导致一些分区非常小(10个记录),而另一些分区非常大(10000个记录)。分区的大小在节点之间分布得很好,因此每个执行器似乎在处理相同数量的聚合数据。所以我不确定自己是否有问题

我怎么知道它是否值得重新划分或合并RDD?这两种方法中的任何一种都能在不洗牌数据的情况下平衡分区吗?此外,RDD不会被重用,只是映射到另一个RDD,然后连接到另一个RDD。

有趣的问题,合并肯定会更好,因为它不会触发完全洗牌。通常,当跨分区(例如,在过滤器之后)有稀疏数据时,建议合并。我认为这是一个类似的场景,但是直接从初始负载开始。然而,我真的认为合并对您来说可能是值得的,因为您在初始加载之后对RDD做了什么

当您将加入应用于加载的RDD时,数据被洗牌时,Spark会咨询洗牌管理器,以查看应该使用哪个洗牌实现(通过
Spark.shuffle.manager
配置)。洗牌管理器有两种实现:
hash
(版本<1.2.0的默认值)和
sort
(默认值>=1.2.0)

如果使用了
散列
实现,则每个输入分区将创建输出文件,以发送到发生连接的相应还原器。这会造成文件的大量膨胀,可以通过将
spark.shuffle.consolidateFiles
设置为true来缓解,但如果有大量分区作为输入,则最终会导致非常缓慢的连接。如果使用这个实现,合并肯定是值得的,因为大量的输入分区可能会产生大量的文件,以减少输出

如果使用了
sort
实现,那么每个分区只有一个输出文件(whew!),并且该文件被索引,这样还原程序就可以从各自的索引中获取它们的键。然而,对于许多输入分区,Spark仍将从所有输入分区读取数据,以收集每个可能的密钥。如果使用这种实现,合并可能仍然是值得的,因为将这种查找和读取应用到每个分区也可能会很昂贵


如果最终使用合并,那么可能需要调整要合并到的分区数量,因为合并将是执行计划中的一个步骤。但是,此步骤可能会为您节省非常昂贵的加入成本。另外,作为旁注,这对于解释洗牌背后的实现非常有帮助。

在参与join的两个大RDD中调用coalesce可以减少洗牌量吗?