Apache Spark 作為高效能的分散式運算框架,其資源管理與部署模式是發揮潛力的核心。在企業級大數據架構中,YARN 已成為標準的叢集資源管理器,而 Spark on YARN 的整合機制至關重要。本文深入探討其兩種主要部署模式:yarn-cluster 與 yarn-client。這兩種模式在 Driver 程序的生命週期管理、資源分配與日誌追蹤方面有根本差異,直接影響應用的穩定性與開發效率。本文透過在 Docker 容器中模擬 CDH 環境,不僅能隔離開發與生產環境,更能標準化部署流程,展示如何在受控的虛擬化叢集中,實踐 Spark 應用的提交、監控與管理,為建構穩健的大數據處理管道提供理論基礎。
Apache Spark 部署與 YARN 模式實踐
本章節將引導您完成 Apache Spark 的部署與運行,特別是利用 Docker 搭建 CDH (Cloudera Distribution including Apache Hadoop) 環境,並在 YARN 集群管理器下,以 yarn-cluster 和 yarn-client 模式提交 Spark 應用。
環境準備與 Docker 容器啟動
在開始之前,確保您已具備必要的軟體,包括 Docker Engine(建議版本 1.8 或以上)以及 CDH Docker 映像檔。
連接至 EC2 實例: 使用 SSH 客戶端連接到您的 Amazon EC2 實例。您需要提供私鑰文件(例如
docker.pem)和實例的公共 IP 地址。ssh -i "docker.pem" ec2-user@<EC2_Public_IP_Address>請將
<EC2_Public_IP_Address>替換為您 EC2 實例的實際公共 IP。啟動 Docker 服務: 在 EC2 實例上,啟動 Docker 服務並檢查其運行狀態。
sudo service docker start sudo service docker status確保 Docker 服務已成功啟動。
下載 CDH Docker 映像檔: 如果之前沒有下載過
svds/cdh映像檔,請執行以下命令下載。sudo docker pull svds/cdh下載完成後,您將看到映像檔的相關信息。
啟動 CDH Docker 容器: 啟動一個名為
cdh的 Docker 容器,並將 Spark Master 的端口 8088 映射到主機。-d選項使容器在後台運行。sudo docker run -p 8088 -d --name cdh svds/cdh驗證容器運行: 使用
docker ps命令列出所有正在運行的容器。您應該能看到名為cdh的容器,其中包含了 CDH 的各項服務,包括 Apache Spark。進入容器交互式終端: 為了執行 Spark 命令,需要進入
cdh容器的交互式終端。sudo docker exec -it cdh bash成功後,您將看到容器內的命令行提示符。
在 YARN 模式下運行 Spark 應用
Apache Spark 在 YARN (Yet Another Resource Negotiator) 集群管理器下運行時,主要有兩種提交模式:yarn-cluster 和 yarn-client。
yarn-cluster模式: 在此模式下,Spark 應用程序的 Driver 程序將運行在 YARN 的 Application Master 進程中。Application Master 由 YARN 管理,負責協調 Spark 應用程序的執行。這種模式適用於生產環境,因為 Driver 進程的生命週期與 YARN 集群綁定。yarn-client模式: 在此模式下,Spark Driver 程序運行在提交命令的客戶端進程中(即您當前所在的交互式終端),而 Application Master 僅用於向 YARN 請求資源。Driver 進程的日誌會直接輸出到客戶端控制台。這種模式適合開發和調試。
我們將使用內建的 org.apache.spark.examples.SparkPi 應用程序來演示這兩種模式。
- 運行
yarn-cluster模式: 在cdh容器的交互式終端中,執行spark-submit命令,並指定--master yarn-cluster。我們將設置 1000 次迭代來計算 Pi 的值。此命令將 SparkPi 應用提交到 YARN 集群執行。您可以在 YARN 的 Web UI(通常通過spark-submit --master yarn-cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/lib/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar 1000http://<EC2_Public_IP_Address>:8088訪問)中查看應用程序的運行狀態。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
object "EC2 Instance (Host)" as EC2_HOST
object "Docker Engine" as DOCKER_ENGINE
object "CDH Docker Image (svds/cdh)" as CDH_IMAGE
object "CDH Container (cdh)" as CDH_CONTAINER
object "Spark Application (SparkPi)" as SPARK_APP
object "YARN Cluster Manager" as YARN_MANAGER
object "Host Terminal" as HOST_TERM
partition "Environment Setup" {
EC2_HOST --> DOCKER_ENGINE : SSH Connection
DOCKER_ENGINE --> CDH_IMAGE : Pull Image ('docker pull')
DOCKER_ENGINE --> CDH_CONTAINER : Run Container ('docker run -p 8088 ...')
DOCKER_ENGINE --> HOST_TERM : List Containers ('docker ps')
HOST_TERM --> CDH_CONTAINER : Execute 'docker exec -it'
CDH_CONTAINER --> HOST_TERM : Provide Bash Prompt
note right of CDH_CONTAINER
CDH services including Spark and YARN are running.
end note
}
partition "YARN Cluster Mode Submission" {
HOST_TERM --> SPARK_APP : Execute 'spark-submit'
SPARK_APP --> YARN_MANAGER : Submit Application (master=yarn-cluster)
YARN_MANAGER --> SPARK_APP : Allocate Resources (Driver in App Master)
SPARK_APP --> YARN_MANAGER : Execute Tasks
YARN_MANAGER --> SPARK_APP : Report Status
note left of YARN_MANAGER
Driver runs within YARN Application Master.
Logs are managed by YARN.
end note
}
partition "Accessing YARN UI" {
EC2_HOST --> HOST_BROWSER : Navigate to YARN RM UI
HOST_BROWSER --> YARN_MANAGER : Display Cluster Status
note right of HOST_BROWSER
URL: http://<EC2_Public_IP_Address>:8088
end note
}
@enduml看圖說話:
此圖示詳細描繪了在 Docker 環境中,使用 YARN 集群管理器運行 Apache Spark 應用程式的 yarn-cluster 模式。圖的左側部分展示了從連接 EC2 實例開始,下載 CDH Docker 映像檔,啟動 CDH 容器,並通過 docker exec 命令進入容器的交互式終端。這為後續的 Spark 操作奠定了基礎。中間部分著重於 yarn-cluster 模式的提交過程,說明了當使用 spark-submit 並設置 --master yarn-cluster 時,Spark 應用程式的 Driver 程序會被部署到 YARN 的 Application Master 進程中運行,由 YARN 負責管理。Spark 應用程式隨後向 YARN 請求資源並執行任務。右側部分則指示了如何通過訪問 YARN 的資源管理器 Web UI(通常是 http://<EC2_Public_IP_Address>:8088)來監控 Spark 應用程序的運行狀態和資源分配情況。整個流程圖清晰地展示了 Spark 在 YARN 集群模式下的部署與執行機制。
Apache Spark 應用:YARN 集群模式下的任務提交與日誌分析
本節將深入探討如何在 YARN 集群管理器下,使用 yarn-cluster 模式提交 Apache Spark 應用程式,並分析其執行過程與結果。
執行 yarn-cluster 模式的 Spark 應用
在 CDH Docker 容器的交互式終端中,我們使用 spark-submit 命令來啟動 SparkPi 應用程式,並將其配置為在 yarn-cluster 模式下運行。
提交 SparkPi 應用: 執行以下命令,指定應用程式類別 (
--class)、Spark 應用程式 JAR 包的路徑,以及計算 Pi 所需的迭代次數(1000 次)。spark-submit --master yarn-cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/lib/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar 1000該命令將 SparkPi 應用程式的 Driver 程序打包並提交給 YARN 的 Application Master 進行管理和執行。
分析
spark-submit的輸出日誌: 執行上述命令後,您會在終端看到大量的日誌輸出,這代表了 Spark 應用程式與 YARN 集群之間的交互過程。關鍵信息包括:- 警告 (WARN):
Unable to load native-hadoop library...表明系統正在使用內建的 Java 類庫替代原生 Hadoop 庫,這在某些環境下是正常的。 - 信息 (INFO):
Connecting to ResourceManager at /0.0.0.0:8032: Spark Driver 正在嘗試連接到 YARN 的 ResourceManager。Requesting a new application from cluster...: Spark 正在向 YARN 請求創建一個新的應用程式。Will allocate AM container, with 896 MB memory...: YARN 為 Spark 的 Application Master 分配了容器資源,包括內存和額外開銷。Uploading resource ...: Spark 將應用程式的 JAR 包上傳到 HDFS(在此 Docker 環境中通常是本地 HDFS 模擬),以便 YARN 可以訪問。Submitted application application_...: Spark 成功向 ResourceManager 提交了應用程式,並獲得了一個唯一的應用程式 ID。Application report for application_... (state: ACCEPTED): YARN 已接受應用程式的請求,但尚未開始執行。Application report for application_... (state: RUNNING): Spark Application Master 已啟動並正在運行。日誌中會顯示 ApplicationMaster 的主機名和 RPC 端口。Application report for application_... (state: FINISHED): Spark 應用程式執行完畢。final status: SUCCEEDED表示應用程式成功執行。
- 警告 (WARN):
獲取應用程式結果: 在
yarn-cluster模式下,Spark 應用程式的最終計算結果(例如,SparkPi 計算出的 Pi 值)不會直接輸出到提交命令的終端。這是因為 Driver 程序運行在 YARN 的 Application Master 中,其標準輸出被 YARN 管理。要查看詳細的執行日誌和結果,您需要通過 YARN 的 ResourceManager Web UI 來追蹤應用程式。- 訪問 YARN ResourceManager UI:
在您的主機瀏覽器中,訪問
http://<EC2_Public_IP_Address>:8088。 - 查找應用程式:
在 ResourceManager UI 中,找到您剛剛提交的 SparkPi 應用程式(通常以應用程式 ID 識別,例如
application_1445627521793_0001)。 - 查看日誌: 點擊應用程式的「Tracking UI」或相關鏈接,可以導向到 Spark UI,其中包含了任務執行詳情。您也可以在 YARN UI 中直接找到查看 Application Master 日誌的選項,從那裡可以找到 SparkPi 的計算結果。
- 訪問 YARN ResourceManager UI:
在您的主機瀏覽器中,訪問
yarn-cluster 模式的特點
- 優點:
- Driver 程序與 YARN 集群生命週期綁定,便於集群管理。
- 適合生產環境部署,Driver 進程的穩定性依賴於 YARN。
- 缺點:
- 調試相對不便,因為 Driver 的日誌和輸出不在本地終端。
- 需要通過 YARN UI 或日誌聚合系統來獲取應用程式的詳細信息和結果。
在下一節,我們將探討 yarn-client 模式,它提供了更直接的調試體驗。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
object "Spark Submit Client" as SPARK_SUBMIT
object "YARN ResourceManager" as YARN_RM
object "YARN Application Master (AM)" as YARN_AM
object "Spark Driver" as SPARK_DRIVER
object "Spark Executors" as SPARK_EXECUTORS
object "YARN NodeManagers" as YARN_NM
object "YARN UI" as YARN_UI
object "Host Browser" as HOST_BROWSER
partition "Application Submission (yarn-cluster)" {
SPARK_SUBMIT --> YARN_RM : Request New Application
YARN_RM --> YARN_AM : Allocate Container for AM
YARN_AM --> SPARK_DRIVER : Launch Driver (within AM)
SPARK_DRIVER --> YARN_RM : Request Executor Resources
YARN_RM --> YARN_NM : Allocate Containers for Executors
YARN_NM --> SPARK_EXECUTORS : Launch Executors
SPARK_EXECUTORS --> SPARK_DRIVER : Execute Tasks & Send Results
SPARK_DRIVER --> YARN_AM : Aggregate Results
YARN_AM --> YARN_RM : Report Application Status
note right of SPARK_DRIVER
Driver runs inside the YARN Application Master.
Application output is not directly to the submission terminal.
end note
}
partition "Monitoring and Result Retrieval" {
YARN_RM --> YARN_UI : Provide Application Status
HOST_BROWSER --> YARN_UI : Access YARN ResourceManager Web UI
YARN_UI --> HOST_BROWSER : Display Application Details & Logs
note left of YARN_UI
Track application progress, view logs, and retrieve results.
URL: http://<EC2_Public_IP_Address>:8088
end note
}
@enduml看圖說話:
此圖示詳細闡述了 Apache Spark 在 YARN 集群模式下,使用 yarn-cluster 提交應用程式的執行流程。圖的左側部分展示了從 Spark Submit 客戶端發起到 YARN ResourceManager 的請求開始,ResourceManager 分配容器給 Application Master,然後 Application Master 啟動 Spark Driver。Driver 進程隨後向 ResourceManager 請求 Executor 資源,ResourceManager 再指示 NodeManagers 啟動 Executor。Executor 執行任務並將結果返回給 Driver,Driver 匯總後,Application Master 向 ResourceManager 回報應用程式的整體狀態。此圖示強調了在 yarn-cluster 模式下,Spark Driver 是運行在 YARN 的 Application Master 進程內的,因此應用程式的輸出和日誌不會直接顯示在提交命令的終端,而是需要通過 YARN UI 來訪問。右側部分則展示了如何通過瀏覽器訪問 YARN ResourceManager Web UI,以監控應用程式的運行狀態、查看詳細日誌以及獲取最終的計算結果。
縱觀現代數據平台的演進趨勢,將 Spark 叢集管理與 Docker 容器化技術整合,已不僅是技術選項,更是提升資源利用率與部署敏捷性的關鍵策略。此方法的核心價值,在於將傳統需耗費數日建置的 Hadoop 生態系,壓縮至數分鐘內即可啟動的標準化環境,根本性地解決了開發與生產環境不一致的長期痛點。然而,其挑戰也隨之浮現:yarn-cluster 與 yarn-client 模式的選擇,實質上是「生產級穩定性」與「開發期偵錯效率」之間的權衡。高階技術管理者必須意識到,這項決策直接影響團隊的開發迭代速度與最終上線應用的可靠性,是資源配置與風險管理的核心環節。
展望未來,這種容器化部署模式將進一步與 Kubernetes 等雲原生編排工具深度融合,形成更具彈性與自動化能力的「數據即服務 (Data-as-a-Service)」基礎設施。Spark on Kubernetes 已是明確的發展軌跡,預示著大數據架構正全面擁抱雲原生思維。
玄貓認為,對於追求高效能數據團隊的組織而言,採納此 Docker 化 YARN 部署方案是實現 DevOps for Big Data 的重要一步。技術領導者應優先建立標準化的容器映像檔,並針對不同應用場景制定明確的提交模式規範,才能將此架構的敏捷性與穩定性效益發揮至最大。