簡體   English   中英

一個執行器中有多少並發任務,Spark 如何處理一個執行器中的任務之間的多線程?

[英]How many concurrent tasks in one executor and how Spark handles multithreading among tasks in one executor?

在 Spark 中,一次並行執行多少個任務? 在 Spark 中如何將階段拆分為任務? 以及DAG 在 RDD 中是如何工作的?

但我沒有找到明確的結論。

考慮以下場景(假設spark.task.cpus = 1 ,為簡單起見忽略vcore概念):

  • 10 個執行器(2 個核心/執行器),10 個分區 => 我認為一次並發任務的數量是10
  • 10個執行器(2個核心/執行器),2個分區=>我認為一次並發任務的數量是2
  • 10 個執行器(2 個核心/執行器),20 個分區 => 我認為一次並發任務的數量是20
  • 10個執行器( 1個核心/執行器),20個分區=>我認為一次並發任務的數量是10

我對么? 關於第三種情況,在一個執行程序中考慮多線程(即 2 個線程,因為有 2 個內核)會是20個嗎?


更新1

如果第三種情況是正確的,則意味着:

  • 當執行器中的空閑內核可用時,Spark 可以自動決定觸發該執行器中的多線程
  • 當執行器中只有一個核心時,該執行器中不會發生多線程。

如果這是真的,那么 Spark 在 executor 中的行為是不是有點不確定(單線程 vs 多線程)?

請注意,從驅動程序發送到執行程序的代碼可能沒有考慮使用例如同步關鍵字的自動性問題。

Spark如何處理這個問題?

我認為您是對的,這取決於您的執行程序編號和內核,一個分區創建一個在一個內核上運行的任務。

我認為所有 4 種情況都是正確的,第 4 種情況在現實中是有意義的(“超額預訂”核心)。 我們通常應該為 nb 考慮 2 到 4 的系數。 分區數,即 nb。 分區數等於 nb 的 2 到 4 倍。 集群中的總 CPU 核心數。

關於線程,一個 executor 中的 2 個任務同時運行不應該有關於多線程的問題,因為每個任務都在處理自己的一組RDD

如果設置spark.task.cpus = 2 ,這意味着每個任務有 2 個 cpu 核心,那么 IMO 可能存在競爭條件問題(如果有var ),但通常我們正在處理像RDD這樣的不可變值,所以應該只有問題。

暫無
暫無

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

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