Spark 大表之间的join

最近在处理两份大表之间的join优化。

表1 数据量是 8.1G

表2 数据量是 24.1G

spark.sql.shuffle.partitions 800

5个Executor,每个Executor 10G内存,每个Executor CPU的cores是 4

制定了3中优化措施。

1:表2 直接 left join 表1.

2:表2 union 表1 ,然后groupBy

3:表1 和 表2 的读取结果 根据 join的key 做hash,然后partitionBy 写入到hdfs上,然后读取hash值的每个文件路径,最后合并。

经过测试后 发现 情况2的测试效果反而是最好,

但是最后 一个stage 读取 这个shuffle后的结果还是要将近 20min。

stage-14 中读取了24.1G 的数据,中间有一部分数据需要过滤,过滤 scan_site_id在 一张小表中的数据,之前的做法是将这份小表 broadcast后 注册 udf函数,然后 通过udf进行过滤,后来的做法是 直接将小表cache,然后进行broadcast join后,速度快了30s,不多。

stage-15 读取了24G的shuffle数据,后面有负责的逻辑处理,都是调用spark的内置函数。

最后 将这一切的复杂逻辑操作 全部放入到 MapPartitions中进行操作,速度快了10min,与之前相比,执行速度快了50%。

现在看来似乎是 通过自己的java代码实现的 执行速度 远远大于 spark调用内置函数的数据,奇怪,理论上应该spark中调用内置函数应该更快。

你可能感兴趣的:(Spark 大表之间的join)