最近在处理两份大表之间的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中调用内置函数应该更快。