一个 spark 计算任务需要对两张大表做 join 操作,有什么解决方案么

2020-05-21 18:12:56 +08:00
 fdgdbr
比如说计算 sql 是 select * from table_a left join table_b on a.id=b.id
其中 table_a 和 table_b 的数据量都很大,几亿到几十亿的数量。直接把上面的 sql 扔给 spark 算的话,架构师跟我说内存会爆,即使用集群也会爆,那有什么解决方案吗
2972 次点击
所在节点    程序员
7 条回复
enrio
2020-05-21 18:46:22 +08:00
可以先将数据集进行切分,比如第一次只要"a"开头的 id,第二次只要"b"开头的,以此类推。你可以有各种各样的方法将数据缩小到一个集群能负担的量级。
再一个使用 id 作为 key,将数据分到各个结点上去,这样 Shuffle 也不严重,数据都是在节点内部进行 join 。
对 Spark SQL 不算太了解,不知道它内部会如何进行转化。
levelworm
2020-05-21 21:18:02 +08:00
我琢磨着把大的那张表拆分然后一点点和另外一张 join 可以吗?
bsidb
2020-05-22 08:41:15 +08:00
Spark 2.x 系列中 Spark SQL 的内部实现已经挺优化的,数据量特别大的情况下,如果内存不够会自动利用磁盘。如果数据量特别大,可以在程序中设置 SparkConf 的 spark.sql.shuffle.partitions 选项,将 partition 数量设置调高(默认是 200 ),这样每个 partition 的数据量就比较小,不会撑爆内存。
SmiteChow
2020-05-22 10:50:57 +08:00
驱动表优化
SmiteChow
2020-05-22 10:57:02 +08:00
如果没有优化的条件就自己手动创造,例如按照时间手动分批 join,用时间换空间
MarsBar
2020-05-22 11:07:13 +08:00
首先你 ab 两个表有多少字段 每个字段大概有多大
你的 join 结果需要全部的字段(*)吗 还是只需要一些
这些都会影响到你最后的性能

如同 @bsidb 所说 spark2.x 现在都优化过了 只要不是 cartesian join 正常的集群应该都是能 handle 的住的
sonice
2020-05-22 14:03:18 +08:00
不带时间窗口的吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674108

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX