閱讀254 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《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(https://<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 (https://<driver-node>:4040) 上查看Spark混洗跨網絡傳輸了多少數據量。

CPU Cores

Spark在單機幾十個CPU的機器上也能表現良好,因為Spark盡量減少了線程間共享的數據。但一般你至少需要單機8~16個CPU cores。當然,根據具體的計算量你可能需要更多的CPU,但是:一旦數據加載進內存,絕大多數應用的瓶頸要麼是CPU,要麼是網絡。

 轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 16:02:04

  上一篇:go  《Spark 官方文檔》Spark安全性
  下一篇:go  《用戶至上:用戶研究方法與實踐》導讀