我们正在运行一个执行以下操作的spark批处理作业:
对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)'
的洗牌