簡體   English   中英

加入后,Spark Job 卡在各個階段之間

[英]Spark Job stuck between stages after join

我有一個火花作業,它連接 2 個數據集,執行一些轉換並減少數據以提供 output。 現在的輸入大小非常小(每個 200MB 數據集),但是在加入之后,正如您在 DAG 中看到的那樣,該作業被卡住並且永遠不會繼續進行階段 4。 我試着等了幾個小時,它給了 OOM 並顯示了第 4 階段的失敗任務。

火花用戶界面 DAG 任務摘要

  1. 為什么 spark 在第 3 階段(加入階段)之后不顯示第 4 階段(數據轉換階段)處於活動狀態? 它是否陷入了第 3 階段和第 4 階段之間的洗牌?
  2. 我可以做些什么來提高我的 Spark 作業的性能? 我嘗試增加隨機分區,結果仍然相同。

職位代碼:


joinedDataset.groupBy("group_field")
    .agg(collect_set("name").as("names")).select("names").as[List[String]]
      .rdd.                                     //converting to rdd since I need to use reduceByKey                                  
      .flatMap(entry => generatePairs(entry))   // this line generates pairs of words out of input text, so data size increases here
      .map(pair => ((pair._1, pair._2), 1))
      .reduceByKey(_+_)
      .sortBy(entry => entry._2, ascending = false)
      .coalesce(1)

僅供參考,我的集群有 3 個 16 核和 100GB RAM 的工作節點,3 個 16 核的執行器(為簡單起見,與機器的比例為 1:1)和 64GB memory 分配。

更新:原來我工作中生成的數據非常龐大。 我做了一些優化(戰略性地減少輸入數據並從處理中刪除了一些重復的字符串),現在工作在 3 小時內完成。 第 4 階段的輸入為 200MB,output 本身為 200GB。 它正確地使用了並行性,但它在洗牌時很糟糕。 我在這項工作中的 shuffle 溢出是 1825 GB(內存)和 181 GB(磁盤)。 有人可以幫助我減少洗牌溢出和工作持續時間嗎? 謝謝。

嘗試對 executor 進行初始排序,然后對它們進行歸約 + 排序

joinedDataset.groupBy("group_field")
    .agg(collect_set("name").as("names")).select("names").as[List[String]]
      .rdd.                                     //converting to rdd since I need to use reduceByKey                                  
      .flatMap(entry => generatePairs(entry))   // this line generates pairs of words out of input text, so data size increases here
      .map(pair => ((pair._1, pair._2), 1))
      .sortBy(entry => entry._2, ascending = false) // Do a initial sort on executors
      .reduceByKey(_+_)
      .sortBy(entry => entry._2, ascending = false) 
      .coalesce(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM