【问题标题】:Iterative Broadcast Join in Spark SQLSpark SQL 中的迭代广播联接
【发布时间】:2020-12-29 10:11:59
【问题描述】:

我最近遇到了这个talk,关于通过使用“迭代”广播联接来处理 Spark SQL 中的倾斜问题,以在将大表与另一个不太小的表联接时提高查询性能。该演讲建议使用“迭代广播连接”来解决此类情况。不幸的是,演讲的深度不足以让我理解它的实现。

因此,我希望有人可以通过几个示例说明如何在 Spark SQL 中实现此迭代广播联接。如何使用带有 SQL-API 的 Spark SQL 查询来实现相同的功能?

注意:我使用的是 Spark SQL 查询 2.4

感谢任何帮助。谢谢

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    迭代广播连接:大可能值得考虑迭代获取较小(但不是那么小)表的切片,广播这些切片,与较大的表连接,然后合并结果的方法。

    为了解决这个问题,有一个概念叫做:

    i) Salting Technique: : 在这个方法中,我们将一个随机数添加到一个 key 中,并使数据在集群中均匀分布。让我们通过下面的例子来看看这个

    在上图中假设我们在大表和小表上执行连接,然后数据被分为三个执行器 x,y 和 z,如下所示,然后是联合,由于我们有数据倾斜,所有 X 将在一个执行器中,并且Y 在另一个执行程序中,z 在另一个执行程序中。 由于 Y 和 Z 数据相对较小,它将完成并等待 X-executor 完成,这需要时间。 所以为了提高性能,我们应该得到 X-executor 数据,均匀分布在所有 executor 上 由于数据卡在一个执行器上,我们将向所有键(大表和小表)添加一个随机数并执行我们的流程

    添加一个随机数:Key =explode(key, range(1,3)),这将给出key_1,key_2,key_3

    现在,如果您看到它是均匀分布在执行器之间的,因此可以提供更快的性能

    如果您需要更多帮助,请观看此视频:

    https://www.youtube.com/watch?v=d41_X78ojCg&ab_channel=TechIsland

    还有这个链接: https://dzone.com/articles/improving-the-performance-of-your-spark-job-on-ske#:~:text=Iterative%20(Chunked)%20Broadcast%20Join,table%2C%20then%20unioning%20the%20result.

    【讨论】:

    • 非常感谢您的回复。正如您在回答中指出的那样(在您的回答中)该表可以迭代地分解为切片和广播,您能否分享一个关于如何使用 sql 查询实现相同的示例?
    • 我上面展示的示例,因此在后端,您只需将随机数添加到密钥
    • 只有当其中一个表具有唯一键值时才会起作用。如果两个表中的单个键有多个记录怎么办
    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多