发生灾难的原因
sql(sqlText = "select tel_number from TableA")
.filter("tel_number not in (select tel_number from tableB)")
.agg(count($"serv_number"))
.show()
说明:
select tel_number from TableA 大约三亿条数据
select serv_number from tableB 大约四百万条数据
这一条sparksql直接发生了两起让人崩溃的bug:
- Bug 一:
ERROR scheduler.TaskSetManager: Total size of serialized results of 611 tasks (1915.0 MB) is bigger than spark.driver.maxResultSize (1024.0MB)
这个Bug一看感觉很容易就解决,只是一个配置的问题,于是我进行了如下配置:
--conf spark.driver.maxResultSize=10240
本来设置这么大应该没有问题了,谁知道Bug二出现了:
- Bug 二:
java.io.EOFException: Premature EOF: no length prefix available
这个问题的解决办法网上并不多可以参考
发生这场灾难的最根本原因就是这条sql语句中使用了:
三亿条数据 not in(四百万条数据)
换个思路写sql
sql(sqlText = "select tel_number from TableA")
.join(sql(sqlText = "select tel_number,user_id from TableB"),
usingColumns = Seq("serv_number"), joinType = "left_outer")
.where("user_id is null")
.agg(count($"serv_number")).show()
这样就没有问题了
本文通过一次灾难性的SparkSQL操作,深入探讨了大数据处理中出现的两大常见问题及解决方案。文章详细分析了如何避免因结果集过大导致的内存溢出错误,以及如何处理数据连接时的异常情况。通过对比不同SQL写法,展示了有效的调优策略,为SparkSQL的高效运行提供了宝贵经验。
1万+

被折叠的 条评论
为什么被折叠?



