本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Apache Spark 2.3 搭配原生 Kubernetes 支援

Kubernetes 與大數據

在過去一年中,開放原始碼社群一直致力於在 Kubernetes 中啟用對資料處理、資料分析和機器學習工作負載的一流支援。Kubernetes 中的新擴充功能,例如 自訂資源自訂控制器,可用於建立與個別應用程式和框架的深度整合。

傳統上,資料處理工作負載已在專用設定中執行,例如 YARN/Hadoop 堆疊。但是,統一 Kubernetes 上所有工作負載的控制平面可簡化叢集管理,並可提高資源利用率。

「彭博社在機器學習和 NLP 方面投入了大量資金,以便在為客戶的投資決策提供動力的新聞和金融資訊方面,為他們提供競爭優勢。透過在 Kubernetes 之上建構我們的資料科學平台,我們正在以一致、易於使用的方式,讓公司 5,000 多名軟體工程師能夠存取最先進的資料科學工具,例如 Spark、TensorFlow 和我們龐大的 GPU 資源。」- Steven Bower,彭博社搜尋和資料科學基礎架構團隊負責人

介紹 Apache Spark + Kubernetes

具有原生 Kubernetes 支援的 Apache Spark 2.3 結合了兩個著名的開放原始碼專案的優點 — Apache Spark,一個用於大規模資料處理的框架;以及 Kubernetes。

Apache Spark 是資料科學家的重要工具,為各種應用程式提供穩健的平台,範圍從大規模資料轉換到分析再到機器學習。資料科學家正在大量採用容器,透過實現封裝相依性和建立可重現的成品等優點,來改進他們的工作流程。鑑於 Kubernetes 是管理容器化環境的事實標準,因此在 Spark 內支援 Kubernetes API 是自然而然的。

從 Spark 2.3 開始,使用者可以在現有的 Kubernetes 1.7+ 叢集中執行 Spark 工作負載,並利用 Apache Spark 管理分散式資料處理任務的能力。Apache Spark 工作負載可以直接使用 Kubernetes 叢集,透過 命名空間配額 進行多租戶和共用,以及管理功能,例如 可插拔授權記錄。最棒的是,它不需要對您的 Kubernetes 叢集進行任何變更或新安裝;只需 建立容器映像 並為您的 Spark 應用程式設定正確的 RBAC 角色,即可完成所有設定。

具體而言,Kubernetes 中的原生 Spark 應用程式充當 自訂控制器,它會建立 Kubernetes 資源以回應 Spark 排程器發出的請求。與 在 Kubernetes 中以獨立模式部署 Apache Spark 相反,原生方法提供對 Spark 應用程式的細緻管理、改進的彈性和與記錄和監控解決方案的無縫整合。社群也在探索進階使用案例,例如管理串流工作負載和利用服務網格,例如 Istio

若要在 Kubernetes 叢集上自行嘗試此操作,只需下載官方 Apache Spark 2.3 版本 的二進位檔案。例如,在下面,我們描述了執行一個簡單的 Spark 應用程式,以跨三個 Spark 執行器計算數學常數 Pi,每個執行器都在單獨的 Pod 中執行。請注意,這需要執行 Kubernetes 1.7 或更高版本的叢集、已設定為存取它的 kubectl 用戶端,以及預設命名空間和服務帳戶的必要 RBAC 規則

$ kubectl cluster-info  

Kubernetes master is running at https://xx.yy.zz.ww

$ bin/spark-submit

   --master k8s://https://xx.yy.zz.ww

   --deploy-mode cluster

   --name spark-pi

   --class org.apache.spark.examples.SparkPi

   --conf spark.executor.instances=5

   --conf spark.kubernetes.container.image=

   --conf spark.kubernetes.driver.pod.name=spark-pi-driver

   local:///opt/spark/examples/jars/spark-examples_2.11-2.3.0.jar

若要監看叢集上建立的 Spark 資源,您可以在單獨的終端機視窗中使用以下 kubectl 命令。

$ kubectl get pods -l 'spark-role in (driver, executor)' -w

NAME              READY STATUS  RESTARTS AGE

spark-pi-driver   1/1 Running  0 14s

spark-pi-da1968a859653d6bab93f8e6503935f2-exec-1   0/1 Pending 0 0s

結果可以在任務執行期間透過執行串流傳輸


$ kubectl logs -f spark-pi-driver

當應用程式完成時,您應該會在驅動程式記錄中看到計算出的 Pi 值。

在 Spark 2.3 中,我們首先支援以 Java 和 Scala 撰寫的 Spark 應用程式,並支援從各種資料來源 (包括 HTTP、GCS、HDFS 等) 進行資源本地化。我們也密切關注 Spark 執行器的失敗和復原語意,以便為未來奠定堅實的基礎。立即開始使用 開放原始碼文件

參與其中

在不久的將來,還有許多令人興奮的工作要做。我們正積極開發諸如動態資源配置、相依性的叢集內暫存、PySpark 和 SparkR 支援、Kerberized HDFS 叢集支援,以及用戶端模式和熱門筆記本的互動式執行環境等功能。對於那些愛上 Kubernetes 宣告式應用程式管理方式的人們,我們也一直在開發用於 spark-submit 的 Kubernetes Operator,它允許使用者宣告式地指定和提交 Spark 應用程式。

而我們才剛剛開始!我們很樂意您參與其中,並幫助我們進一步發展該專案。

非常感謝 Apache Spark 和 Kubernetes 貢獻者,他們分佈在多個組織中,花費了數百小時來完成這項工作。我們期待看到更多人為該專案做出貢獻,並幫助它進一步發展。