經驗之談,在做大數據項目的時候spark資源應該如何設置

經驗之談,在做大數據項目的時候spark資源應該如何設置

如何配置yarn集群的資源,如何配置saprk executor數目及內存和cpu,這些是很多同學在上大數據、架構公開課時會提出來的問題,對於這些問題,我們今天就簡單的和大家聊一聊。

資源調優

Spark和YARN管理的兩個主要資源是CPU和內存。磁盤和網絡I / O也會影響Spark性能,但Spark和YARN都不會主動管理它們。

應用程序中的每個Spark executor都具有相同的固定數量的核心和相同的固定堆大小。使用--executor-cores命令行參數或通過設置spark.executor.cores屬性指定核心數。同樣,使用--executor-memory參數或spark.executor.memory屬性配置堆大小。 cores屬性控制執行程序可以運行的併發任務數。例如,為每個執行程序設置--executor-cores 5,同時運行最多五個任務。 memory屬性控制Spark可以緩存的數據量,以及用於分組,聚合和join的shuffle數據結構的內存的最大大小。

還要考慮Spark請求的資源如何適應YARN可用的資源。相關的YARN屬性是:

1、yarn.nodemanager.resource.memory-mb控制每個主機上container使用的最大內存總和。

2、yarn.nodemanager.resource.cpu-vcores控制每個主機上container使用的最大內核總數。

申請五個executor核心意思就是向YARN請求五個核心。 YARN請求的內存更復雜,原因有兩個:

1、--executor-memory / spark.executor.memory屬性控制executor堆大小,但executor也可能使用堆外內存,例如Java NIO直接緩衝區。 spark.yarn.executor.memoryOverhead屬性值將添加到executor內存中,以確定每個executor對YARN的完整內存請求。默認為max(384,.07 * spark.executor.memory)。

2、YARN請求的內存會稍微向上舍入。 yarn.scheduler.minimum-allocation-mb和yarn.scheduler.increment-allocation-mb屬性分別控制最小和增量請求值。

下圖(不按默認值縮放)顯示Spark和YARN中內存屬性的層次結構:

經驗之談,在做大數據項目的時候spark資源應該如何設置

調整Spark executor的內存大小時,請記住以下幾點:

1、ApplicationMaster是一個可以從yarn上申請container,但自身不會運行executor,它需要佔用內存和CPU。在客戶端部署模式下,它們默認為1024 MB和一個核心。在集群部署模式下,ApplicationMaster運行驅動程序,因此可考慮使用--driver-memory和--driver-cores配置其資源。

2、運行具有太多內存的executor通常會導致過多的垃圾收集延遲。對於單個執行程序,請使用64 GB作為上限。

3、HDFS客戶端難以處理許多併發線程。每個executor最多有五個任務可以實現完全寫入吞吐量,因此請將每個執行程序的核心數保持在該數量之下。

4、運行微型executor(例如,使用單個核心和運行單個任務所需的足夠內存)會抵消在單個JVM中運行多個任務的好處。例如,廣播變量必須在每個執行程序上覆制一次,因此許多小執行程序會導致更多的數據副本。

資源調優示例 假設一個集群有六臺機器運行nodemanager,每個主機配備16個內核和64 GB內存。

NodeManager容量yarn.nodemanager.resource.memory-mb和yarn.nodemanager.resource.cpu-vcores應分別設置為63 * 1024 = 64512(兆字節)和15。避免將100%的資源分配給YARN容器,因為主機需要一些資源來運行操作系統和Hadoop守護程序。在這種情況下,為這些系統進程留下一個GB和一個核心,對於有hbase共存的需要預留更多的內存和cpu。

可以考慮使用--num-executors 6 --executor-cores 15 --executor-memory 63G。但是,這種方法不行的:

1、63 GB加上executor內存開銷超出了NodeManagers的63 GB容量。

2、ApplicationMaster在其中一個主機上佔用一個核心,因此該主機上沒有15核執行器的空間。

3、每個執行程序15個核心可能導致較差的HDFS I / O吞吐量。

相反,使用--num-executors 17 --executor-cores 5 --executor-memory 19G:

1、這導致所有主機上有三個executor,除了具有兩個執行程序的ApplicationMaster。

2、--executor-memory計算為(63/3 executor /每臺主機):

21 * 0.07 = 1.47GB。 21 - 1.47~19GB。

其實,這些資源配置調優在工作一定時間或者對代碼有一定的見解之後會有更加清楚的認識。尤其是自己對集群,分佈式,數據量,業務及自己代碼的理解更為重要,然後多加測試,這樣形成自己的經驗認知。

希望對大家有幫助。

大家如果想了解更多的大數據spark知識可以點擊文章末尾“瞭解更多”查看,或者需要相關學習資料按一下方式獲取!!!

經驗之談,在做大數據項目的時候spark資源應該如何設置


分享到:


相關文章: