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.3RC2 正在投票支持下一个版本)。

从 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 是不是包含针对连接的表流优化?的主要内容,如果未能解决你的问题,请参考以下文章

针对MySQL大表优化方案

优化 spark sql 笛卡尔连接

spark sql:如何优化多个巨大的配置单元表连接

在 Spark SQL 中将多个小表与大表连接的最佳方法

如何针对 db2 数据库优化 SQL/Python 选择查询?

每日一学数据仓库之全量表增量表拉链表流水表