我调查了我的工作,并确定我确实有一个倾斜的任务。如何确定导致偏斜的此任务中的实际值是什么?
我的 Python 转换代码如下所示:
from transforms.api import Input, Output, transform
@transform(
...
)
def my_compute_function(...):
...
df = df.join(df_2, ["joint_col"])
...
我调查了我的工作,并确定我确实有一个倾斜的任务。如何确定导致偏斜的此任务中的实际值是什么?
我的 Python 转换代码如下所示:
from transforms.api import Input, Output, transform
@transform(
...
)
def my_compute_function(...):
...
df = df.join(df_2, ["joint_col"])
...
偏斜问题源于任何导致您的工作交换的问题。引起交流的事物包括但不限于:join
s、window
s、groupBy
s。
这些操作会根据在使用的 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 之间分布以下数据:
key_1
接收:来自 df1的 5 行key_1
接收:来自 df2的 4 行key_2
接收:来自 df1的 1 行key_2
接收:来自 df2的 1 行key_3
接收:来自 df2的 1 行因此,如果您查看每个任务的输入和输出行数,您会发现任务 1 的数据比其他任务多得多。 这个任务是有偏差的。
现在的问题变成了我们如何确定这key_1
是歪斜的罪魁祸首,因为这在 Spark(为连接提供动力的底层引擎)中不可见。
如果我们查看上面的示例,我们会发现我们需要知道的只是联合列的每个键的实际计数。这意味着我们可以:
最简单的方法是打开 Foundry 中的分析(轮廓)工具并执行以下分析:
作为输入添加df1
到第一条路径
添加Pivot Table
板,col_1
用作行和Row count
聚合
点击⇄ Switch to pivoted data
按钮
使用Multi-Column Editor
板只保留col_1
和COUNT
列。用 前缀它们中的每一个df1_
,从而导致路径的输出只有df1_col_1
和df1_COUNT
。
作为输入添加df2
到第二条路径
添加Pivot Table
板,再次col_1
用作行和Row count
聚合
点击⇄ Switch to pivoted data
按钮
使用Multi-Column Editor
板只保留col_1
和COUNT
列。用 前缀它们中的每一个df2_
,从而导致路径的输出只有df2_col_1
和df2_COUNT
。
使用第一条路径 (df1_col_1
和df1_COUNT1
)的结果创建第三条路径
添加一个Join
板,使连接的右侧成为第二条路径 (df2_col_1
和df2_col_1
) 的结果。确保连接类型是Full join
从右侧添加所有列(不需要添加前缀,所有列都是唯一的
配置加入板以加入df1_col_1
平等df2_col_1
添加一个Expression
板以创建一个新列,它将两列output_row_count
相乘COUNT
添加一个按降序Sort
排序的板output_row_count
如果您现在预览结果数据,您将获得来自连接两侧的导致偏斜的键的排序列表