1. 程式人生 > >《Spark 官方文件》硬體配置

《Spark 官方文件》硬體配置

硬體配置

Spark開發者們常常被問到的一個問題就是:如何為Spark配置硬體。我們通常會給出以下的建議,但具體的硬體配置還依賴於實際的使用情況。

儲存系統

因為絕大多數Spark作業都很可能是從外部儲存系統載入輸入資料(如:HDFS或者HBase),所以最好把Spark部署在離這些儲存比較近的地方。建議如下:

  • 只要有可能,就儘量在HDFS相同的節點上部署Spark。最簡單的方式就是,在HDFS相同的節點上獨立部署Spark(standalone mode cluster),並配置好Spark和Hadoop的記憶體和CPU佔用,以避免互相干擾(對Hadoop來說,相關的選項有 mapred.child.java.opts – 配置單個任務的記憶體,mapred.tasktracker.map.tasks.maximun和mapred.tasktracker.reduce.tasks.maximum – 配置任務個數)。當然,你也可以在一些通用的叢集管理器上同時執行Hadoop和Spark,如:
    Mesos
     或 Hadoop YARN
  • 如果不能將Spark和HDFS放在一起,那麼至少要將它們部署到同一區域網的節點中。
  • 對於像HBase這類低延遲資料儲存來說,比起一味地避免儲存系統的互相干擾,更需要關注的是將計算分佈到不同節點上去。

本地磁碟

雖然大部分情況下,Spark都是在記憶體裡做計算,但它仍會使用本地磁碟儲存資料,如:儲存無法裝載進記憶體的RDD資料,儲存各個階段(stage)輸出的臨時檔案。因此,我們建議每個節點上用4~8塊磁碟,非磁碟陣列方式掛載(只需分開使用單獨掛載點即可)。在Linux中,掛載磁碟時使用 noatime option 可以減少不必要的寫操作。在Spark中,配置(

configure)spark.local.dir 屬性可指定Spark使用的本地磁碟目錄,其值可以是逗號分隔的列表以指定多個磁碟目錄。如果該節點上也有HDFS目錄,可以和HDFS共用同一個塊磁碟。

記憶體

一般來說,Spark可以在8GB~幾百GB記憶體的機器上執行得很好。不過,我們還是建議最多給Spark分配75%的記憶體,剩下的記憶體留給作業系統和系統快取。

每次計算具體需要多少記憶體,取決於你的應用程式。如需評估你的應用程式在使用某個資料集時會佔用多少記憶體,可以嘗試先載入一部分資料集,然後在Spark的監控UI(http://<driver-node>:4040)上檢視其佔用記憶體大小。需要注意的是,記憶體佔用很大程度受儲存級別和序列化格式影響 – 更多記憶體優化建議,請參考調優指南(

tuning guide)。

最後,還需要注意的是,Java虛擬機器在200GB以上記憶體的機器上並非總是表現良好。如果你的單機記憶體大於200GB,建議在單個節點上啟動多個worker JVM。在Spark獨立部署模式下(standalone mode),你可在conf/spark-env.sh 中設定 SPARK_WORKER_INSTANCES 來配置單節點上worker個數,而且在該檔案中你還可以通過 SPARK_WORKER_CORES 設定單個worker佔用的CPU core個數。

網路

以我們的經驗來說,如果資料能載入進記憶體,那麼多數Spark應用的瓶頸都是網路頻寬。對這類應用,使用萬兆網(10 Gigabit)或者更強的網路是最好的優化方式。對於一些包含有分散式歸約相關運算元(distributed reduce相關運算元,如:group-by系列,reduce-by系列以及SQL join系列)的應用尤其是如此。對於任何一個應用,你可以在監控UI (http://<driver-node>:4040) 上檢視Spark混洗跨網路傳輸了多少資料量。

CPU Cores

Spark在單機幾十個CPU的機器上也能表現良好,因為Spark儘量減少了執行緒間共享的資料。但一般你至少需要單機8~16個CPU cores。當然,根據具體的計算量你可能需要更多的CPU,但是:一旦資料載入進記憶體,絕大多數應用的瓶頸要麼是CPU,要麼是網路。