Spark on ACK是ACK基於Spark on Kubernetes提供的解決方案,讓您能夠基於ACK提供的企業級容器應用管理能力,快速構建高效、靈活且可擴充的Spark巨量資料處理平台。
Spark on ACK介紹
Apache Spark是一種專門用於大規模資料處理的計算引擎,廣泛應用於資料分析和機器學習等情境。自 2.3 版本起,Spark支援將作業提交至 Kubernetes 叢集中(Running Spark on Kubernetes)。
Spark Operator是用於在Kubernetes叢集中運行Spark工作負載的Operator,支援以Kubernetes原生的方式自動化管理Spark作業的生命週期,包括作業配置、作業提交、作業重試等。
Spark on ACK解決方案對Spark Operator等相關組件進行了定製與最佳化,相容開源版本並進一步拓展了功能特性。通過與阿里雲產品生態的無縫整合,例如Log Service、Object Storage Service和可觀測性等,您可以基於Spark on ACK快速構建一個靈活、高效且可擴充的巨量資料處理平台。
功能優勢
簡化開發與營運
可移植性:支援將Spark應用及其依賴打包為標準化的容器鏡像,從而實現Spark作業在不同 Kubernetes叢集間的無縫遷移。
可觀測性:支援通過Spark History Server組件查看作業運行狀態,並整合阿里雲Log ServiceSLS和可觀測監控Prometheus版,進一步提升作業的可觀測性。
工作流程編排:通過工作流程編排引擎(例如Apache Airflow、Argo Workflows)編排 Spark 作業,能夠實現資料處理流水線的自動化、高效調度與跨環境一致性部署,提升營運效率並降低遷移成本。
多版本支援:支援在單個ACK叢集中同時運行多個不同版本的Spark作業。
作業調度與資源管理
作業隊列管理:與ack-kube-queue整合,提供靈活的作業隊列管理和資源配額管理,自動最佳化工作負載資源分派並提升叢集資源使用率。
多種調度策略:複用ACK調度器已有的調度能力,支援多種批調度策略,包括Gang Scheduling、Capacity Scheduling等。
多架構調度:支援混合使用x86和Arm架構的ECS資源,例如通過使用倚天Arm架構伺服器實現增效降本。
多叢集調度:通過ACK One多叢集艦隊將Spark作業在多叢集中進行調度和分發,提升多叢集資源使用率。
彈性算力供給:支援自訂彈性資源優先順序調度,混合使用多種彈性方案,包括節點自動調整、節點即時彈性等;也支援使用ECI、ACS算力,無需保有雲端服務器執行個體,按需使用,靈活擴縮。
在離線混部:與ack-koordinator整合,支援在離線混部,提高叢集資源使用率。
效能與穩定性最佳化
Shuffle效能最佳化:通過配置Spark作業使用Celeborn作為Remote Shuffle Service,實現存算分離,提升Shuffle效能和穩定性。
資料訪問加速:基於Fluid資料編排和訪問加速能力,加速Spark作業資料訪問,提升作業效能。
整體架構
在ACK叢集中部署Spark作業時,您可以通過Spark Operator快速提交作業,使用ACK與阿里雲產品整合帶來的可觀測、調度、資源彈性等能力。Spark on ACK的整體架構如下。
用戶端:通過kubectl、Arena等命令列工具將Spark作業提交至ACK叢集。
工作流程:通過Apache Airflow、Argo Workflows等工作流程架構來編排Spark作業並提交至ACK叢集。
可觀測:通過Spark History Server、阿里雲Log ServiceSLS、阿里雲可觀測監控 Prometheus 版搭建可觀測體系,包括查看作業運行狀態、收集和分析作業日誌和監控指標等。
Spark Operator:自動化管理Spark作業的生命週期,包括作業組態管理、作業提交和重試等。
Remote Shuffle Service(RSS):使用Apache Celeborn作為 RSS,提高Spark作業在Shuffle時的效能和穩定性。
緩衝:使用Fluid作為分布式緩衝系統實現資料接入和資料訪問加速。
雲基礎設施:作業運行過程中將使用到阿里雲提供的基礎設施,包括計算資源(ECS、ECI、ACS)、儲存資源(雲端硬碟、NAS、OSS)和網路資源(ENI、VPC、SLB)等。
計費說明
在ACK叢集中運行Spark作業時,相關組件的安裝是免費的。使用過程中,ACK叢集本身的費用(叢集管理費和相關雲產品費用)仍然正常收取,請參見計費概述。
如果您同時使用了其他雲產品,例如通過Log ServiceSLS收集Spark作業產生的日誌、Spark作業讀寫OSS/NAS中的資料等,產生的雲產品費用由各雲產品收取。您可以參見下文的操作文檔瞭解。
開始使用
在ACK叢集中運行Spark作業的大致流程如下,包括基礎使用、可觀測性和高階配置,供您按需選擇和配置。
基礎使用
流程 | 說明 |
構建Spark容器鏡像 | 您可以選擇直接使用開源社區提供的Spark容器鏡像,或者基於開源容器鏡像進行定製並推送到您自己的鏡像倉庫中。下面是一個Dockerfile樣本,您可以按需修改此Dockerfile,例如替換Spark基礎鏡像、加入依賴Jar包等,然後構建鏡像並推送到鏡像倉庫中。 |
建立專屬命名空間 | 為Spark作業建立一個或多個專屬的命名空間(本教程使用 |
使用Spark Operator運行Spark作業 | 部署ack-spark-operator組件,並配置 詳細內容,請參見使用Spark Operator運行Spark作業。 |
讀寫OSS資料 | Spark作業訪問阿里雲OSS資料有多種方式,包括Hadoop Aliyun SDK、Hadoop AWS SDK和JindoSDK等,根據選擇的SDK,您需要在Spark容器鏡像中包含相應的依賴並在Spark作業中配置Hadoop相關參數。 詳細內容,請參見Spark作業讀寫OSS資料。 |
可觀測性
流程 | 說明 |
部署Spark History Server | 在 接著,在提交Spark作業時掛載相同的NAS檔案系統並配置Spark將事件記錄寫入相同的路徑,後續您將可以從Spark History Server中查看該作業,下面是一個樣本作業。 詳細內容,請參見使用Spark History Server查看Spark作業資訊。 |
配置Log ServiceSLS收集Spark日誌 | 叢集中運行大量 Spark 作業時,建議使用阿里雲Log Service SLS 統一收集所有 Spark 作業日誌,以便查詢和分析Spark容器的 stdout、stderr 日誌。 詳細內容,請參見使用Log Service收集Spark作業日誌。 |
效能最佳化
流程 | 說明 |
通過RSS提升Shuffle效能 | Shuffle是分散式運算中的重要操作,其過程通常伴隨著大量磁碟IO、資料序列化和網路IO,容易引發OOM和資料擷取失敗(Fetch失敗)等問題。為了最佳化Shuffle的效能和穩定性,提升計算服務品質,您可以在Spark作業配置中使用Apache Celeborn作為Remote Shuffle Service(RSS)。 詳細內容,請參見Spark作業使用Celeborn作為RSS。 |
定義彈性資源調度優先順序 | 使用ECI Pod並配置合適的調度策略,可以按需建立並按資源實際用量付費,有效減少叢集資源閑置帶來的成本浪費。在ECS和ECI資源混用的情境下,還可以指定調度優先順序。 您無需在SparkApplication 中修改調度相關配置,ACK調度器會根據配置的彈性策略自動完成Pod調度。您可以按需靈活地定製多種彈性資源(例如ECS和ECI)的混用。 詳細內容,請參見使用ECI彈性資源運行Spark作業。 |
配置動態資源分派 | 動態資源分派(Dynamic Resource Allocation,簡稱DRA)可根據工作負載的大小動態調整作業所使用的計算資源。您可以為Spark作業啟用動態資源分派,避免因資源不足導致作業執行時間過長或因資源過剩導致資源浪費。 詳細內容,請參見Spark作業配置動態資源分派。 |
使用Fluid加速資料訪問 | 如果您的資料位元於線下IDC或在資料訪問時遇到效能瓶頸,可使用Fluid提供的資料接入和分布式緩衝編排能力加速資料訪問。 詳細內容,請參見Spark作業使用Fluid加速資料訪問。 |
相關文檔
您可以接入與配置阿里雲Prometheus監控,在應用監控 > 叢集Pod監控頁簽下監控Spark任務的監控指標。
如需對Spark作業進行隊列管理,最佳化資源分派,請參見使用任務隊列ack-kube-queue管理AI/ML工作負載。
您可以基於ElasticQuotaTree實現細粒度的資源配額管理,提升資源使用率,請參見通過ElasticQuotaTree與任務隊列提升資源使用率。
如果您有多個運行線上服務的ACK叢集,希望充分利用空閑資源,您可以使用多叢集Spark作業調度和分發功能,請參見基於實際剩餘資源的多叢集Spark作業調度與分發。