簡體   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