1

我调查了我的工作,并确定我确实有一个倾斜的任务。如何确定导致偏斜的此任务中的实际值是什么?

我的 Python 转换代码如下所示:

from transforms.api import Input, Output, transform


@transform(
  ...
)
def my_compute_function(...):
  ...
  df = df.join(df_2, ["joint_col"])
  ...

4

1 回答 1

1

理论

偏斜问题源于任何导致您的工作交换的问题。引起交流的事物包括但不限于:joins、windows、groupBys。

这些操作会根据在使用的 DataFrames 中找到的值跨 Executors 移动数据。这意味着,当使用的 DataFrame 在指示交换的列上有许多重复值时,这些行最终都在同一个任务中,从而增加了它的大小。

例子

让我们考虑以下连接的数据分布示例:

DataFrame 1 (df1)

| col_1 | col_2 |
|-------|-------|
| key_1 | 1     |
| key_1 | 2     |
| key_1 | 3     |
| key_1 | 1     |
| key_1 | 2     |
| key_2 | 1     |

DataFrame 2 (df2)

| col_1 | col_2 |
|-------|-------|
| key_1 | 1     |
| key_1 | 2     |
| key_1 | 3     |
| key_1 | 1     |
| key_2 | 2     |
| key_3 | 1     |

这些 DataFrame 连接在一起时,col_1将在 executor 之间分布以下数据:

  • 任务1:
    • key_1接收:来自 df1的 5 行
    • key_1接收:来自 df2的 4 行
    • 总输入:发送到 task_1 的 9 行数据
    • 结果:5 * 4 = 20 行输出数据
  • 任务 2:
    • key_2接收:来自 df1的 1 行
    • key_2接收:来自 df2的 1 行
    • 总输入:发送到 task_2 的 2 行数据
    • 结果:1 * 1 = 1 行输出数据
  • 任务 3:
    • key_3接收:来自 df2的 1 行
    • 总输入:发送到 task_3 的 1 行数据
    • 结果:1 * 0 = 0 行输出数据(丢失键;在 df1 中找不到键)

因此,如果您查看每个任务的输入和输出行数,您会发现任务 1 的数据比其他任务多得多。 这个任务是有偏差的

鉴别

现在的问题变成了我们如何确定这key_1是歪斜的罪魁祸首,因为这在 Spark(为连接提供动力的底层引擎)中不可见。

如果我们查看上面的示例,我们会发现我们需要知道的只是联合列的每个键的实际计数。这意味着我们可以:

  1. 在联合键上聚合连接的每一侧并计算每个键的行数
  2. 将连接的每一侧的计数相乘以确定输出行数

最简单的方法是打开 Foundry 中的分析(轮廓)工具并执行以下分析:

  1. 作为输入添加df1到第一条路径

  2. 添加Pivot Table板,col_1用作行和Row count聚合

    枢

  3. 点击⇄ Switch to pivoted data按钮

    转变

  4. 使用Multi-Column Editor板只保留col_1COUNT列。用 前缀它们中的每一个df1_,从而导致路径的输出只有df1_col_1df1_COUNT

  5. 作为输入添加df2到第二条路径

  6. 添加Pivot Table板,再次col_1用作行和Row count聚合

    枢

  7. 点击⇄ Switch to pivoted data按钮

    转变

  8. 使用Multi-Column Editor板只保留col_1COUNT列。用 前缀它们中的每一个df2_,从而导致路径的输出只有df2_col_1df2_COUNT

  9. 使用第一条路径 (df1_col_1df1_COUNT1)的结果创建第三条路径

  10. 添加一个Join板,使连接的右侧成为第二条路径 (df2_col_1df2_col_1) 的结果。确保连接类型是Full join

    加入

  11. 从右侧添加所有列(不需要添加前缀,所有列都是唯一的

  12. 配置加入板以加入df1_col_1平等df2_col_1

    加盟条件

  13. 添加一个Expression板以创建一个新列,它将两列output_row_count相乘COUNT

    乘

  14. 添加一个按降序Sort排序的板output_row_count

    种类

  15. 如果您现在预览结果数据,您将获得来自连接两侧的导致偏斜的键的排序列表

    预习

于 2022-02-16T21:08:54.377 回答