Spark在rdd上合并,导致分区少于预期

时间:2018-01-03 17:55:13

标签: apache-spark-sql partitioning coalesce

我们正在运行一个执行以下操作的spark批处理作业:

  1. 通过从hive表中读取
  2. 来创建数据框
  3. 将数据框转换为rdd
  4. 将rdd存储到列表中
  5. 对2个不同的表执行上述步骤,并设置一个变量(称为minNumberPartitions),该变量保存所创建的2个RDD中的最小分区数。

    当作业开始时,合并值初始化为常量值。仅当该值小于minNumberPartitions(在上面的步骤中设置)时,此值才用于合并上面创建的RDD。但是,如果合并值大于minNumberPartitions,则将其重新设置为minNumberPartitions(即coalesceValue = minNumberPartitions),然后对使用此值创建的两个RDD进行合并。

    在我们的场景中,当合并值大于minNumberPartitions时,我们在后来的情况下面临问题。所以场景有点像这样:

    CoalesceValue初始化为20000,从hivetable1读取后从Dataframe1创建的RDD1分区数为187,从hivetable2读取后从Dataframe2创建的RDD2分区数为10.因此minNumberPartitions设置为10.

    因此coalesceValue重置为10,并且各个RDD的合并发生的值为10,即RDD1.coalesce(10,false,null)和RDD2.coalesce(10,false,null)[此处将coalesce中的shuffle设置为false和ordering设置为null]。

    根据共识,RDD1的分区数应从187减少到10,RDD2应保持相同,即10.在这种情况下,RDD1的分区数从187减少到10,但对于RDD2数分区的数量从10减少到9.由于这种行为,一些操作受到阻碍,最终的火花工作失败了。

    当合并值与RDD的分区数相同时,请帮助我们了解合并是否在RDD上的工作方式不同。

    更新: 我为同一个问题找到了一个Open Jira Ticket(SPARK-13365),但它没有定论。此外,我不理解上述Jira票中声明的含义

      

    '我见过这种情况的一个案例实际上就是当用户合并时(1000)   没有真正变成合并(100)'

    的洗牌

0 个答案:

没有答案