硬體配置
Spark 開發人員常會問到如何為其設定硬體。雖然適當的硬體會因情況而異,但我們提出以下建議。
儲存系統
由於大多數 Spark 工作可能必須從外部儲存系統(例如 Hadoop 檔案系統或 HBase)讀取輸入資料,因此將其放置在盡可能靠近此系統非常重要。我們建議如下
-
如果可能,請在與 HDFS 相同的節點上執行 Spark。最簡單的方法是在相同的節點上設定 Spark 獨立模式叢集,並設定 Spark 和 Hadoop 的記憶體和 CPU 使用率,以避免干擾(對於 Hadoop,相關選項為
mapred.child.java.opts
,用於每個工作記憶體,以及mapreduce.tasktracker.map.tasks.maximum
和mapreduce.tasktracker.reduce.tasks.maximum
,用於工作數)。或者,您可以在 Mesos 或 Hadoop YARN 等常見叢集管理員上執行 Hadoop 和 Spark。 -
如果無法執行此操作,請在與 HDFS 相同的區域網路中的不同節點上執行 Spark。
-
對於像 HBase 這類低延遲資料儲存,最好在不同節點上執行運算作業,以避免與儲存系統產生干擾。
本機磁碟
雖然 Spark 可以將許多運算執行於記憶體中,但它仍會使用本機磁碟儲存無法放入 RAM 的資料,以及保留各階段之間的暫存輸出。我們建議每個節點有 4-8 個磁碟,並以不使用 RAID 的方式設定(僅作為個別掛載點)。在 Linux 中,使用 noatime
選項掛載磁碟,以減少不必要的寫入。在 Spark 中,設定 spark.local.dir
變數,使其成為本機磁碟的逗號分隔清單。如果您正在執行 HDFS,可以使用與 HDFS 相同的磁碟。
記憶體
一般來說,Spark 可以順利執行於每部機器 8 GiB 到數百 gigabytes 的記憶體。在所有情況下,我們建議僅為 Spark 分配最多 75% 的記憶體;其餘部分留給作業系統和緩衝快取。
您需要的記憶體容量將取決於您的應用程式。若要判斷您的應用程式對特定資料集大小的使用量,請在 Spark RDD 中載入部分資料集,並使用 Spark 監控 UI 的儲存標籤 (http://<driver-node>:4040
) 查看其在記憶體中的大小。請注意,儲存層級和序列化格式會對記憶體使用量造成極大影響,請參閱 調整指南,以取得如何減少使用量的秘訣。
最後,請注意 Java VM 在超過 200 GiB 的 RAM 時,並不總是表現良好。如果您購買的機器 RAM 超過此值,您可以在單一節點中啟動多個執行器。在 Spark 的 獨立模式 中,工作器負責根據其可用記憶體和核心啟動多個執行器,每個執行器將在個別 Java VM 中啟動。
網路
根據我們的經驗,當資料在記憶體中時,許多 Spark 應用程式會受到網路限制。使用 10 Gigabit 或更高網路是讓這些應用程式更快的最佳方式。對於群組化、縮減化和 SQL 聯結等「分散式縮減」應用程式來說,這尤其正確。在任何給定的應用程式中,您都可以從應用程式的監控 UI (http://<driver-node>:4040
) 中看到 Spark 在網路上交換多少資料。
CPU 核心
Spark 可以順利擴充到每部機器數十個 CPU 核心,因為它在執行緒之間進行的共用最少。您可能應該為每部機器提供至少 8-16 個核心。根據工作負載的 CPU 成本,您可能還需要更多:一旦資料在記憶體中,大多數應用程式都會受到 CPU 或網路限制。