问题
SparkSQL/PySpark代码使用广播提示运行时间和/或故障比前数据错误消息耗时长
示例代码
df.join(broadcast(bigDf)).write.mode('overwrite').parquet("path")
错误消息 :
sql标签下ApachesparkUI显示故障发生时
因果
执行器侧播联播Databricks运行时间11.3LTS优化广播合并函数广播联播依赖spark驱动方法有效时提出了以下挑战:
- 单点故障驱动程序作为集群内所有查询的协调员,当用于所有并行查询广播时,JVM因内存误差而面临更大的失败风险。遇此情形,同时运行集群上的所有查询都可能受到影响并可能失效。
- 有限弹性增加默认广播连接阈值驱动器内存错误风险(由于同时广播)使得难以提高默认广播连接阈值(目前为10MB静态和30MB动态),因为这会增加驱动器内存压力并提升故障风险
EBJ增强处理这些挑战,将内存压力从驱动向执行程序转移这不仅消除单点故障,还允许提高默认广播全局合并阈值,因为全集群故障风险降低
不幸的是,EBJ启动后,使用明文广播提示的查询现在可能失效使用大数据集的可能性更大
问题与驱动端广播内存消耗管理方式相关内存驱动端广播受控spark.driver.maxResultSize.早先版本中,广播用内存没有明文跟踪并记账任务内存管理器这就意味着任务可能低估内存使用大型作业因内存错误随机失效,而其他作业则因运气成功
EBJ启动后,分配用于广播hash地图的存储器被精确跟踪并从任务存储器管理器可用存储器中扣除改进会降低内存泄漏和JVM出内存错误的风险大型广播处理方式可能不同,但可靠性提高
求解
跟踪EBJ内存用法对防止JVM内存错误至关重要,这可能导致节点上所有并发查询失效