【问题标题】:DataSkew after doing salting technique - Spark and Scala盐渍技术后的 DataSkew - Spark 和 Scala
【发布时间】:2021-09-26 22:47:08
【问题描述】:

我想问一下我在 spark 工作中遇到的数据倾斜问题。 我知道如果你的数据有偏差,最佳实践技巧之一就是做盐腌技术。 在我的 Spark 工作中,我必须在两个数据帧之间进行连接(其中一个大小约为 5 GB)。

此外,我通常通过数字和用于连接的字段重新分区,以便在连接之前尽可能多地控制分区。因此,我将使用 shuffle 的连接转换为具有窄依赖关系的映射连接。

df.repartition(numRep, colJoin: _*).sortWithinPartitions(colJoin: _*)

场景是:

  • 我有 24 个执行器,每个执行器有 4 个核心
  • 我将 shufflePartitions 设置为 96
  • 我避免用spark.conf.set("spark.sql.autoBroadcastJoinThreshold", -1)自动广播
  • 连接前的重新分区数为 192 (2*96)(线程的两倍)。因此,我每个执行程序有 8 个任务/分区

问题是在加盐之后,我还没有数据倾斜,连接需要很长时间。

所以,我的问题是:我该怎么办?增加腌制次数?腌制两次或更多次?增加重新分区的数量?有什么函数可以知道哪个分区的数据偏斜吗?

【问题讨论】:

    标签: scala performance apache-spark optimization


    【解决方案1】:

    如果您正在执行左外连接,那么在左数据帧中包含大量具有空连接键的记录可能会导致倾斜,因为 spark 会将所有这些记录打乱到单个分区中。在这种情况下,您可以在进行联接之前过滤掉具有空键的记录。

    在尝试加盐之前,我会做的另一种方法是通过对关键列执行 group by 来执行数据分析,以查看偏差的严重程度并更好地了解数据偏差。

    从 Spark Web UI,您可以转到某个阶段并通过按任务持续时间对其进行排序来识别哪个任务(或分区)存在偏差(Spark Web UI -> Stages -> 按持续时间排序 -> Description -> Tasks )

    或者,如果阶段运行成功,则通过查看每个阶段的摘要指标。以下是数据倾斜的示例:
    sample stage with a data skew

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 2011-04-03
      • 2021-10-02
      • 2011-08-07
      • 2016-07-28
      • 1970-01-01
      相关资源
      最近更新 更多