Spark SQL 是不是包含针对连接的表流优化?
Posted
技术标签:
【中文标题】Spark SQL 是不是包含针对连接的表流优化?【英文标题】:Does Spark SQL include a table streaming optimization for joins?Spark SQL 是否包含针对连接的表流优化? 【发布时间】:2015-08-20 20:15:53 【问题描述】:Spark SQL 是否包含针对连接的表流式优化,如果包含,它如何决定要流式传输哪个表?
在进行连接时,Hive 假定最后一个表是最大的表。作为一种连接优化,它将尝试缓冲较小的连接表并将最后一个连接表流过。如果连接列表中的最后一个表不是最大的,Hive 有 /*+ STREAMTABLE(tbl) */
提示,告诉它应该流式传输的表。从 v1.4.1 开始,Spark SQL 不支持 STEAMTABLE 提示。
已针对 Spark SQL 之外的正常 RDD 处理提出此问题,here。答案不适用于开发人员无法控制显式缓存操作的 Spark SQL。
【问题讨论】:
【参考方案1】:前段时间我已经在寻找这个问题的答案,我所能想到的只是设置一个spark.sql.autoBroadcastJoinThreshold 参数,默认为 10 MB。然后它将尝试自动广播所有大小小于您设置的限制的表。加入顺序在此设置中不起作用。
如果您有兴趣进一步提高连接性能,我强烈推荐this presentation。
【讨论】:
【参考方案2】:这是即将推出的 Spark 2.3(RC2 正在投票支持下一个版本)。
从 v1.4.1 开始,Spark SQL 不支持 STREAMTABLE 提示。
它也没有出现在最新的(并且投票将很快发布)Spark 2.3 中。
不支持 STREAMTABLE 提示,但考虑到最近的更改(在 SPARK-20857 Generic resolved hint node 中)构建一个应该相当容易编写的提示框架。
您必须编写一些支持 STREAMTABLE 的 Spark 优化和可能的物理计划(这似乎需要做很多工作),但这是可能的。工具就在那里。
关于连接优化,在即将到来的 Spark 2.3 中有两个主要的逻辑优化:
-
ReorderJoin
CostBasedJoinReorder(专门用于基于成本的优化)
【讨论】:
以上是关于Spark SQL 是不是包含针对连接的表流优化?的主要内容,如果未能解决你的问题,请参考以下文章