如果我理解正確,每個Spark執行器都作爲Yarn容器運行。
是的。這就是任何應用程序部署到YARN,Spark包括的情況。 Spark對YARN沒有任何特殊的意義。
那麼,如果我添加更多NM,執行器的數量會增加嗎?
不,YARN NodeManagers和Spark的執行者之間沒有關係。
從Dynamic Resource Allocation:
星火提供了一種機制,動態地調整你的應用程序佔用根據工作負載的資源。這意味着如果您的應用程序不再使用,並且在有需求時再次請求它們,那麼您的應用程序可能會將資源返回給羣集。
正如您現在可能已經猜到的那樣,您的羣集中有多少個NM並且Spark在決定是否要求新執行程序或刪除某些程序時由工作負載無關。
如果我在Spark應用程序正在運行時刪除NM,則該應用程序會發生什麼情況?
是的,但只有當Spark使用該NM爲執行者。畢竟,NodeManager將資源(CPU和內存)提供給YARN集羣管理器,然後將這些資源交給Spark應用程序等應用程序。如果你把它們放回去,說關閉節點,那麼資源將不再可用,並且Spark執行程序的進程就會消失(因爲沒有資源可以運行的任何其他進程)。
我可以根據其他指標添加/刪除執行程序嗎?
是的,但通常它是Spark工作(沒有雙關語意)做計算和請求新的執行者。
您可以使用SparkContext
來管理執行者,方法是使用killExecutors,requestExecutors和requestTotalExecutors方法。
killExecutor(executorId:字符串):布爾請求,該集羣管理器殺指定的執行者。
requestExecutors(numAdditionalExecutors的:int):布爾請求從集羣管理器執行器的附加數量。
requestTotalExecutors(numExecutors:詮釋,localityAwareTasks:詮釋,hostToLocalTaskCount:地圖[字符串,INT]):布爾更新我們的調度需求的集羣管理器。