本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
支援原生 Kubernetes 的 Apache Spark 2.3
Kubernetes 與大資料
在過去一年中,開源社群一直致力於為 Kubernetes 中的資料處理、資料分析和機器學習工作負載提供一流的支援。Kubernetes 中的新擴充套件功能,例如自定義資源和自定義控制器,可用於與單個應用程式和框架建立深度整合。
傳統上,資料處理工作負載一直在 YARN/Hadoop 棧等專用設定中執行。然而,統一 Kubernetes 上所有工作負載的控制平面簡化了叢集管理,並可以提高資源利用率。
"彭博社在機器學習和自然語言處理方面投入巨資,以在新聞和金融資訊方面為我們的客戶提供競爭優勢,這些新聞和金融資訊為他們的投資決策提供動力。透過在 Kubernetes 之上構建我們的資料科學平臺,我們正在以一致、易於使用的方式,讓公司 5000 多名軟體工程師能夠訪問 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 應用程式充當自定義控制器,響應 Spark 排程程式發出的請求建立 Kubernetes 資源。與在 Kubernetes 中以獨立模式部署 Apache Spark 相比,原生方法提供了對 Spark 應用程式的精細管理、改進的彈性以及與日誌記錄和監控解決方案的無縫整合。社群還在探索高階用例,例如管理流式工作負載和利用 Istio 等服務網格。
要在 Kubernetes 叢集上親自嘗試,只需下載官方 Apache Spark 2.3 版本的二進位制檔案。例如,下面我們描述了執行一個簡單的 Spark 應用程式來計算數學常數 Pi,該應用程式跨三個 Spark 執行器執行,每個執行器都在一個單獨的 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 的貢獻者們,他們來自多個組織,為此付出了數百小時的努力。我們期待看到更多人參與該專案,幫助其進一步發展。