SparkSql引起的一场灾难

本文通过一次灾难性的SparkSQL操作,深入探讨了大数据处理中出现的两大常见问题及解决方案。文章详细分析了如何避免因结果集过大导致的内存溢出错误,以及如何处理数据连接时的异常情况。通过对比不同SQL写法,展示了有效的调优策略,为SparkSQL的高效运行提供了宝贵经验。

发生灾难的原因

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()

这样就没有问题了

后记

Spark调优可以参考
基础调优
高级调优
但是SparkSql调优,还得接下来研究研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值