繁体   English   中英

我如何确定我的 Foundry 工作中偏斜任务的价值?

[英]How do I identify the value of a skewed task of my Foundry job?

我调查了我的工作, 发现我确实有一项有偏差的任务 我如何确定导致偏斜的任务中的实际值是多少?

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

from transforms.api import Input, Output, transform


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

理论

偏斜问题源于任何导致您工作交换的事情。 引起交换的东西包括但不限于: joinwindowgroupBy

这些操作会导致数据根据所使用的 DataFrame 中找到的值在 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     |

这些数据帧在col_1上连接在一起时,将在执行程序中分布以下数据:

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

因此,如果您查看每个任务的输入计数和 output 行,您会发现任务 1 的数据远多于其他任务。 这个任务是倾斜的

鉴别

现在的问题是我们如何确定key_1是偏差的罪魁祸首,因为这在 Spark(支持连接的底层引擎)中是不可见的。

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

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

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

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

  2. 添加Pivot Table board,使用col_1作为行, Row count作为聚合

    枢

  3. 单击⇄ Switch to pivoted data按钮

    转变

  4. 使用Multi-Column Editor板只保留col_1COUNT列。 为它们中的每一个添加前缀df1_ ,从只有df1_col_1和 df1_COUNT 的路径中产生df1_COUNT

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

  6. 添加Pivot Table board,再次使用col_1作为行, Row count作为聚合

    枢

  7. 单击⇄ Switch to pivoted data按钮

    转变

  8. 使用Multi-Column Editor板只保留col_1COUNT列。 df2_为它们中的每一个添加前缀,从只有df2_col_1和 df2_COUNT 的路径中产生df2_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. 添加一个按output_row_count降序排序的Sort

    种类

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

    预习

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM