【问题标题】:Join Partitions in Spark SQL for better performance在 Spark SQL 中加入分区以获得更好的性能
【发布时间】:2021-05-03 15:34:28
【问题描述】:

我是 Spark SQL 的新手。我对加入期间的分区使用有疑问

假设有一个名为test1 的表保存在10 分区(镶木地板)文件中。还假设spark.sql.shuffle.partitions = 200

问题: 如果 test1 用于 Join 到另一个表,Spark 将使用 10 分区(这是表所在的分区数)执行操作,还是会在 200 分区中重新分区表(根据 shuffle分区值)然后执行连接?在这种情况下,连接将产生更好的性能。如果答案是连接将使用10 分区执行,那么总是将连接表重新分区(CLUSTER BY)到更多的分区以提高连接性能不是更好吗?

在 Spark UI 中,我看到一些 stages 仅使用 10 tasks,而其他 stages 使用 200 任务。

谁能帮我理解一下。

谢谢

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    在大多数情况下,Spark 将使用 200 个分区(SortMergeJoin、ShuffleHashJoin),除非 spark 估计您的表对于 BroadcastHashJoin 来说足够小

    【讨论】:

      【解决方案2】:

      Spark 将读取 10 个任务的 10 个分区中的数据,类似地,它会读取连接中使用的其他数据帧分区,一旦它拥有所有数据,它将创建 200 个分区,这是随机分区的默认值。所以这就是为什么你在一个阶段看到 10 个任务,然后在不同阶段看到其他一些任务,最后在 shuffle 操作后看到 200 个任务。所以最后加入后你将默认拥有 200 个分区,除非你在 spark 配置中将其设置为不同的值。

      【讨论】:

      • 感谢您的回复。我想知道Spark UI 中是否有任何方法可以查看任何正在运行的特定stage 并将其绑定到我的 spark sql 代码并了解该代码的哪一部分正在运行?
      • @matthew 可以在 Spark UI 中看到这一点,但您需要更好地了解 Spark 架构。您将获得创建的作业的详细信息以及该作业中存在的阶段数等。要习惯它,请尝试使用小数据集或块,看看您是否开始计算这些东西。
      猜你喜欢
      • 2015-08-21
      • 2016-05-09
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2021-04-17
      • 2015-01-08
      • 1970-01-01
      • 2014-11-19
      相关资源
      最近更新 更多