Dataproc 強化版彈性模式 (EFM) 會管理重組資料,讓執行中叢集的節點移除作業造成的工作進度延遲降到最低。EFM 會將資料寫入主要工作站,藉此卸載重組資料。工作站會在縮減階段從這些遠端節點提取資料。這個模式僅適用於 Spark 工作。
由於 EFM 不會在次要工作站上儲存中繼資料重組資料,因此 EFM 非常適合使用可先占的 VM,或是只自動調度資源次要工作站群組的叢集。
Dataproc 2.0.31+
、2.1.6+
、2.2.50+
和更新後的映像檔版本支援 EFM。
- Apache Hadoop YARN 工作如果不支援 AppMaster 重新安置,可能會在 Enhanced Flexibility Mode 中失敗 (請參閱「何時等待 AppMaster 完成」)。
- 不建議使用強化版彈性模式:
- 在只有主要工作站的叢集中
- 在串流工作上,因為工作完成後最多可能需要 30 分鐘才能清理中繼重組資料。
- 在執行 Notebook 的叢集中,因為在工作階段期間可能不會清理洗牌資料。
- 在啟用安全停用程序的叢集中執行 Spark 工作時。安全停用和 EFM 可能會互相衝突,因為 YARN 安全停用機制會保留 DECOMMISSIONING 節點,直到所有相關應用程式完成為止。
- 在同時執行 Spark 和非 Spark 工作的叢集中。
- 不支援強化版彈性模式:
- 啟用主要工作者自動調度資源功能時。在大多數情況下,主要工作者會繼續儲存未自動遷移的隨機資料。將主要工作站群組縮減會導致 EFM 無法發揮效益。
使用強化版彈性模式
建立叢集時,將 dataproc:efm.spark.shuffle
叢集屬性 設為 primary-worker
,即可啟用強化版彈性模式。
範例:
gcloud dataproc clusters create cluster-name \ --region=region \ --properties=dataproc:efm.spark.shuffle=primary-worker \ other flags ...
Apache Spark 範例
- 使用 EFM 叢集中的 Spark 範例 JAR 檔案,針對公開的莎士比亞文本執行 WordCount 工作。
gcloud dataproc jobs submit spark \ --cluster=cluster-name \ --region=region \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ --class=org.apache.spark.examples.JavaWordCount \ -- gs://apache-beam-samples/shakespeare/macbeth.txt
設定本機 SSD
由於 EFM 會將中繼洗牌資料寫入 VM 已附加的磁碟,因此可從本機 SSD 提供的額外總處理量和 IOPS 中受益。為便於資源分配,請在設定主要工作站機器時,以每 4 個 vCPU 約 1 個本機 SSD 區隔為目標。
如要連結本機 SSD,請將 --num-worker-local-ssds
標記傳送至 gcloud Dataproc clusters create 指令。
一般來說,您不需要在次要工作者上使用本機 SSD。將本機 SSD 新增至叢集的次要工作站 (使用 --num-secondary-worker-local-ssds
標記) 通常不太重要,因為次要工作站不會在本機寫入 shuffle 資料。不過,由於本機 SSD 可提升本機磁碟效能,如果您希望工作因本機磁碟使用量而受到 I/O 限制 (I/O 受限),您可以選擇將本機 SSD 新增至次要工作者:工作會使用大量本機磁碟做為暫存空間,或是分區太大而無法放入記憶體,因此會溢出至磁碟。
次要工作站比率
由於次要工作站會將 shuffle 資料寫入主要工作站,因此叢集必須包含足夠數量的 CPU、記憶體和磁碟資源,以便因應工作站的 shuffle 負載。對於自動調度資源叢集,為避免主要群組調度並造成不必要的行為,請將 minInstances
設為主要工作站群組的自動調度資源政策中的 maxInstances
值。
如果次要工作站與主要工作站的比率偏高 (例如 10:1),請監控主要工作站的 CPU 使用率、網路和磁碟用量,判斷是否超載。現在說明一下操作方式:
按一下主要工作站左側的核取方塊。
按一下「監控」分頁標籤,即可查看主要 worker 的 CPU 使用率、磁碟 IOPS、網路位元組和其他指標。
如果主要工作站過載,請考慮手動擴充主要工作站。
調整主要工作站群組的大小
主要工作站群組可安全地擴大,但縮小主要工作站群組可能會對工作進度造成負面影響。將主要工作群組縮減的作業應使用安全停用程序,您可以透過設定 --graceful-decommission-timeout
標記來啟用這項功能。
自動調度資源叢集:在採用自動調度資源政策的 EFM 叢集中,主要工作站群組的調度資源功能會停用。如要調整自動調整叢集中的主要工作站群組大小,請按照下列步驟操作:
停用自動調度資源功能。
gcloud dataproc clusters update \ --cluster=cluster-name \ --region=region \ --disable-autoscaling
調整主要群組。
gcloud dataproc clusters update \ --cluster=cluster-name \ --region=region \ --num-workers=num-primary-workers \ --graceful-decommission-timeout=graceful-decommission-timeout # (if downscaling)
重新啟用自動調度資源:
gcloud dataproc clusters update \ --cluster=cluster-name \ --region=region \ --autoscaling-policy=autoscaling-policy
監控主要工作站磁碟用量
主要工作站必須有足夠的磁碟空間,才能處理叢集的排序資料。您可以透過 remaining HDFS capacity
指標間接監控這項指標。本機磁碟空間用盡後,HDFS 就無法使用空間,剩餘容量也會減少。
根據預設,當主要工作站的本機磁碟使用量超過 90% 的容量時,節點會在 YARN 節點 UI 中標示為「UNHEALTHY」。如果發生磁碟容量問題,您可以從 HDFS 刪除未使用的資料,或擴充主要工作站集區。
進階設定
分區和平行處理
提交 Spark 工作時,請設定適當的分割層級。決定洗牌階段的輸入和輸出區塊數量時,需要權衡不同效能特徵。建議您嘗試使用適合工作單元格式的值。
輸入分區
Spark 和 MapReduce 輸入分區是由輸入資料集決定。從 Cloud Storage 讀取檔案時,每個工作會處理約一個「區塊大小」的資料。
對於 Spark SQL 工作,最大分區大小由
spark.sql.files.maxPartitionBytes
控制。建議將其增加至 1 GB:spark.sql.files.maxPartitionBytes=1073741824
。對於 Spark RDD,分區大小通常會由
fs.gs.block.size
控制,預設為 128 MB。建議將其調高至 1 GB。範例:--properties spark.hadoop.fs.gs.block.size=1073741824
輸出分區
後續階段的工作數量由多個屬性控管。如果是處理超過 1 TB 的大型工作,建議每個分區至少有 1 GB。
對於 Spark SQL,輸出區塊的數量由
spark.sql.shuffle.partitions
控制。對於使用 RDD API 的 Spark 工作,您可以指定輸出區分的數量,或設定
spark.default.parallelism
。
主要工作站重組的重組調整
最重要的屬性是 --properties yarn:spark.shuffle.io.serverThreads=<num-threads>
。請注意,這是叢集層級的 YARN 屬性,因為 Spark 排序伺服器會在節點管理員中執行。預設值為機器上的核心數乘以 2 (例如 n1-highmem-8 上的 16 個執行緒)。如果「Shuffle Read Blocked Time」超過 1 秒,且主要工作站未達網路、CPU 或磁碟限制,請考慮增加 Shuffle 伺服器執行緒的數量。
在較大的機器類型中,請考慮增加 spark.shuffle.io.numConnectionsPerPeer
,預設值為 1。(例如,將其設為每對主機 5 個連線)。
增加重試次數
如要設定應用程式主控項、工作和階段的嘗試次數上限,請設定下列屬性:
yarn:yarn.resourcemanager.am.max-attempts spark:spark.task.maxFailures spark:spark.stage.maxConsecutiveAttempts
在使用大量可搶佔的 VM 或自動調度資源而未採用安全停用程序的叢集中,應用程式主控項和工作會更頻繁地終止,因此在這些叢集中提高上述屬性的值可能有助於解決問題 (請注意,不支援在 Spark 中使用 EFM 和安全停用程序)。
在 EFM 叢集中安全停用 YARN
YARN 安全停用程序可用於快速移除節點,並盡量減少對執行中應用程式的影響。對於自動調度資源叢集,優雅停用逾時可在附加至 EFM 叢集的 AutoscalingPolicy 中設定。
安全停用功能的 EFM 強化功能
由於中繼資料會儲存在分散式檔案系統中,因此只要在這些節點上執行的所有容器都完成,即可從 EFM 叢集中移除節點。相較之下,在標準 Dataproc 叢集中,節點必須等到應用程式完成後才會移除。
移除節點時,系統不會等待在節點上執行的應用程式主程式完成。應用程式主容器終止後,會在未停用的其他節點上重新排程。不會遺失工作進度:新應用程式主控項會讀取工作記錄,快速從先前的應用程式主控項復原狀態。