Spark版本:1.1.1
本文系從官方文檔翻譯而來,轉載請尊重譯者的工作,注明以下鏈接:
http://www.cnblogs.com/zhangningbo/p/4135912.html
目錄
- 存儲系統
- 本地磁盤
- 內存
- 網絡
- CPU核數
Spark開發人員收到的最常見的問題就是如何為Spark做硬件配置。然而恰當的硬件配置取決於你的應用環境,所以我們推薦考慮如下幾個要素。
存儲系統
因為大部分Spark作業很可能要從外部存儲系統(如HDFS、HBase)讀取數據,所以,把Spark平台盡可能地部署在靠近這類存儲系統的地方是很重要的。我們推薦從以下幾個方面考慮Spark的部署:
- 如果有可能,那么就把Spark與HDFS運行在相同的節點上。最簡單的方法就是在HDFS的節點上直接創建Spark Standalone集群,同時分別配置Spark和Hadoop對於內存和CPU的使用量以避免相互干擾(對於Hadoop,相關選項如:
mapred.child.java.opts用於設置每個任務需要分配的內存量,mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum)。要不然,你還可以在通用集群管理器(比如Mesos或Hadoop YARN)上運行Hadoop和Spark。用於設置任務總數 - 如果不可能,那么就在HDFS所在的局域網內的其他節點上運行Spark。
- 對於HBase這樣的低延遲數據庫存儲系統,最好是在存儲系統以外的其他節點上運行計算作業,以避免干擾。
本地磁盤
當Spark在內存中執行大量的計算作業時,實際上它仍然會使用本地磁盤來存儲那些不適合放入RAM中的數據,還有那些在各個stage之間保存的臨時輸出數據。我們推薦每個節點配備4-8個磁盤,且不要設置為RAID模式(僅僅是作為單獨的裝載點)。在Linux系統下,以noatime命令行選項裝載磁盤可以減少不必要的讀磁盤操作。在Spark中,把變量spark.local.dir配置為以逗號分隔的本地磁盤列表。如果你正在運行着HDFS,那么,最好和HDFS使用相同的磁盤。
內存
通常,在內存容量為8GB到數百GB的主機上,Spark都能很好地運行。在任何情況下,我們都推薦最多只把物理主機上75%的內存分配給Spark;剩下的留給操作系統和緩存。
你需要多少內存取決於你的應用程序。要確定你的應用程序在某個數據集上執行時需要多少內存,可以在Spark RDD中加載一部分數據集,並借用Spark 監控UI(http://<driver-node>:4040)上的存儲表格(Storage tab)來查看其內存用量。要注意的是內存用量受存儲級別和序列化格式的影響極大——解決方法詳見Spark調優一文。
最后,請注意,配置了200GB以上內存的Java 虛擬機並不能總是正常工作。如果你購買的主機配備的內存超過了這個數值,那么可以在每個主機上啟動多個worker JVM來解決這個問題。在Spark Standalone集群上,你可以使用配置文件conf/spark-env.sh中的變量SPARK_WORKER_INSTANCES來設置每個節點上的worker數量,用變量SPARK_WORKER_CORES來設置每個worker上分配的CPU核數。
網絡
我們的經驗表明,當數據加載到內存時,大多數Spark應用程序都將受制於網絡。最好的辦法就是使用10Gbps或更高帶寬的網絡來加快應用的執行速度。這個辦法對於那些分布式reduce應用程序(如group-bys,reduce-bys,及SQL joins)特別有用。在任何一個應用程序中,你都可以從其監控UI(http://<driver-node>:4040)上看到Spark通過網絡傳輸了多少數據量。
CPU核數
Spark可以在每個主機上很好地縮放數十個CPU核,因為它在線程間極少共享信息。你很可能會在每台主機上最少配置8-16個CPU核。根據你的工作負載所需的CPU成本,你可能還需要更多的CPU核:因為一旦把數據都加載到內存,那么大多數應用程序的瓶頸要么在於CPU,要么在於網絡。
