硬體配置

Spark 開發人員常會問到如何為其設定硬體。雖然適當的硬體會因情況而異,但我們提出以下建議。

儲存系統

由於大多數 Spark 工作可能必須從外部儲存系統(例如 Hadoop 檔案系統或 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 或網路限制。