repartition导致的广播失败,关于错误Failed to get broadcast_544_piece0 of broadcast_544
今天一个生产环境任务出现了性能问题,,经过仔细检查发现是在一个join操作时,原设定广播右表数据广播失败,导致后续步骤进行缓慢,,报错信息
java.io.IOException: org.apache.spark.SparkException:Failed to get broadcast_544_piece0 of broadcast_544
源代码大概是这个样子(变量全部用xx、yy代替了,不影响整个结构)
val Site = draftedSite.join(broadcast(toSite), Seq("joinCon")) .withColumn("xxx", distanceUDF($"yy", $"yy", $"yy", $"yy")) .withColumn("xxx", defineSiteDistanceUDF($"yy", $"yy", $"yy", $"yy")) .filter("xx> 0 and xx< yy") .withColumn("deleteSite", expr( """ |case |when xx!= xx then if (xx< xx, xx, xx) |when xx!= xx then if(xx< xx, xx, xx) |else if(xx> xx, xx, xx) |end """.stripMargin)).repartition(xx).cache()
一开始查询网上,大致都是一种说法,类似https://issues.apache.org/jira/browse/SPARK-5594中的sparkContect中的残留信息数据导致不成功,这明显不是我这个问题,我每次都是新起动一个sparkContect的。
后来公司的大神看了这段代码之后,指出 可能是repartition导致的广播失败,去掉repartition(xx),之后任务成功执行。
在key值不够的情况下,强制repartition可能会导致生成一部分空分区,空分区导致了广播的失败。
另外在数据量不定的情况下不建议使用强制广播,建议将tosite注册为临时表之后cache,有spark根据数据量自动判断是否广播
最终修改之后结果如下:
toSite.createOrReplaceTempView("temp") spark.catalog.cacheTable("temp") val temp= spark.sql("select * from temp") val Site = draftedSite.join(toSite, Seq("joinCon")) .withColumn("xxx", distanceUDF($"yy", $"yy", $"yy", $"yy")) .withColumn("xxx", defineSiteDistanceUDF($"yy", $"yy", $"yy", $"yy")) .filter("xx> 0 and xx< yy") .withColumn("deleteSite", expr( """ |case |when xx!= xx then if (xx< xx, xx, xx) |when xx!= xx then if(xx< xx, xx, xx) |else if(xx> xx, xx, xx) |end """.stripMargin)).cache()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本