簡體   English   中英

如何在 Spark 中強制每個執行程序只處理一個任務?

[英]How to enforce processing only one task per executor in Spark?

我正在使用 Spark 來處理我的數據。 我的 Spark 工作是僅 Map操作,我正在使用一些外部庫來處理我的數據。 這個外部庫有一個 memory 泄漏錯誤。 當執行程序啟動時,它會成功處理幾個文件/分區,但由於這個 memory 錯誤,它開始失敗。

我非常依賴這個外部庫,並且 memory 泄漏錯誤不會很快得到修復。 所以,我正在尋找替代選項來運行我的 spark 工作(以低性能為代價)

正如我之前提到的,每個執行程序都可以輕松處理幾個文件/分區,我認為,如果我可以將我的 Spark 應用程序配置為每個任務使用一個執行程序,即在處理分配的任務后殺死執行程序並為下一個任務創建新的執行程序,我也許可以勝任我的工作。

我想知道,是否有辦法配置 Spark 為每個可用任務創建新的執行程序?

我已經嘗試過使用spark.dynamicAllocation.executorIdleTimeout=0但這不會為每個任務創建新的執行程序。

確保設置spark.executor.cores=1 ,這樣每個執行程序 jvm 將只有 1 個任務(一次)。 但是,每個執行程序將有幾個任務按順序運行

不,這是不可能的,而且在架構上也沒有意義。

設計是假設事情會起作用,而不是會出現問題。 手冊中沒有提及此功能。

也許還有其他方法可以解決這個問題(除了修復庫)?

它是如何泄漏的? 例如,如果它在庫 object 中泄漏 memory,您可以嘗試為每個分區分配一個庫 object:

rdd.mapPartitions(iter => {
  val lib = new MyLibrary()
  iter.map(elem => lib.doSomething(elem))
})

如果它在某些 static 全局變量中造成泄漏,那么您可以嘗試為每個分區加載創建一個新的類加載器並使用這個類加載器加載一個庫。

您可以設置spark.task.cpus=n以強制n 個內核執行一項任務。

n = executor 中的 cores 時,每個 executor 可以運行 1 個任務。

暫無
暫無

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

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