如何在Kubernetes上運行Apache Spark
譯文【51CTO.com快譯】Empathy公司平臺工程技術負責人Ramiro Alvarez Fernandez對于如何在Kubernetes上使用Spark以擺脫對云計算提供商的依賴,以及在Kubernetes上運行Apache Spark進行了介紹,并分享了這一過程的挑戰、架構和解決方案等詳細信息。
面臨的挑戰
對于Empathy公司來說,生產中運行的所有代碼都必須與云計算無關。Empathy公司通過使用Spark解決方案克服了之前對云計算提供商提供的解決方案的依賴:例如,EMR(AWS場景)、Dataproc(GCP場景)和HDInsight(Azure場景)。
這些云計算提供商的不同解決方案提供了一種在云上部署Spark的簡單方法。但是,當企業在擴大規模時會面臨一些限制,從而需要解決以下這些問題:
- 如何編排作業?
- 如何分配Spark作業?
- 如何安排夜間工作?
- 工作代碼配置在哪里?
- 如何傳播更改?
- 可以重復使用作業定義嗎?模板是什么?
- 能否通過代碼引用作業?
- 可以從本地主機測試嗎?
這些是在實施Spark作業時面臨的常見問題。使用Kubernetes解決這些問題可以節省工作人員的時間和精力,并提供更好的體驗。
在Kubernetes上運行Apache Spark可以提供以下好處:
- 可擴展性:新解決方案應可擴展以滿足任何需求。
- 可靠性:新解決方案應該監控計算節點,并在出現故障時自動終止和替換實例。
- 可遷移性:新解決方案應該可以部署在任何云計算解決方案中,避免對特定云計算提供商的依賴。總體而言,這種方法可以節省考慮與不同云計算服務提供商協調、分發和調度Spark作業的時間。
- 成本效益:企業不需要采用云計算提供商的服務,因此可以節省這些成本。
- 監控:新解決方案應該包括特別監測。
- Kubernetes生態系統:與其他工作負載一樣使用通用生態系統,并提供持續部署、RBAC、專用節點池、自動縮放等。
其好處與Empathy公司針對Kubernetes上運行的Apache Flink的解決方案相同。
在Kubernetes運行上的Apache Spark
Apache Spark是用于大數據處理的統一分析引擎,特別適用于分布式處理。Spark用于機器學習,是目前最大的技術趨勢之一。
Apache Spark架構
Spark Submit可用于將Spark應用程序直接提交到Kubernetes集群。其流程如下:
(1)Spark Submit從客戶端發送到主節點中的Kubernetes API服務器。
(2)Kubernetes將調度一個新的Spark Driver pod。
(3)Spark Driver pod將與Kubernetes通信以請求Spark executor pod。
(4)新的executor pod將由Kubernetes調度。
(5)一旦新的executor pod開始運行,Kubernetes會通知Spark Driver pod新的Spark executor pod已經準備就緒。
(6)Spark Driver pod將在新的Spark executor pod上調度任務。
Spark提交流程圖
可以使用SparkSubmit(普通方式)或使用Spark Operator來安排Spark應用程序。
Spark Submit
Spark Submit是用于提交Spark應用程序并在Spark集群上啟動應用程序的腳本。其具有的一些出色的功能包括:
- Kubernetes版本:不依賴于Kubernetes版本。
- Native Spark:它包含在Spark映像中。
- 非聲明性設置:需要計劃如何編排作業。
- 定義所需的K8s資源:掛載配置映射、卷、設置反關聯、節點選擇器等。
- 不需要CRD:不需要Kubernetes自定義資源。
Spark Operator
Spark Operator項目由谷歌公司開發,現在是一個開源項目。它使用Kubernetes自定義資源來指定、運行和顯示Spark應用程序的狀態。其具有的一些出色的功能包括:
- 聲明性:應用程序規范和通過自定義資源管理應用程序。
- 計劃重啟:可配置的重啟策略。
- Kubernetes資源自動定義:支持掛載configmaps和volumes,設置pod關聯性等。
- 依賴項注入:直接注入依賴項。
- 指標:支持收集應用程序級指標和驅動程序/執行程序指標并將其導出到Prometheus。
- 開源社區:每個人都可以做出貢獻。
Spark Submit vs Spark Operator的主要命令
上圖顯示了Spark Submit與Spark Operator的主要命令。
Empathy公司的解決方案更喜歡采用Spark Operator,因為它允許比Spark Submit更快的迭代,在Spark Submit中,必須為每個用例創建自定義Kubernetes清單。
解決方案的詳細信息
為了解決挑戰部分提出的問題,ArgoCD和Argo Workflows可以提供幫助,同時還有CNCF項目的支持。例如,可以從Kubernete調度最喜歡的Spark應用程序工作負載,以創建Argo Workflows并定義順序作業。
流程圖如下:
- 在git上定義更改。
- ArgoCD將git更改同步到Kubernetes集群(例如,創建一個Argo工作流模板)。
- Argo Workflows模板允許為多個Spark作業自定義輸入和重用配置,并基于Argo Workflows創建夜間作業。
解決方案流程圖
ArgoCD
ArgoCD是Kubernetes的GitOps持續交付工具。其主要好處是:
- GitOps:使用git存儲庫作為定義所需應用程序狀態的真實來源。
- 聲明式設置:git上的一切。
- 可追溯性和自動化:應用程序部署可以跟蹤分支、標簽等的更新。應用程序部署將根據特定的目標環境實現自動化。
- WebUI:用于檢查部署的工作負載的外觀良好的用戶界面。
- Kubernetes體現了Kustomize、Helm、ksonnet、jsonnet等。可以進行選擇。
更詳細的信息可以在其官方文檔中找到。
Argo Workflows
Argo Workflows是Kubernetes的工作流解決方案。主要好處是:
- 作業編排:這允許按順序編排作業或創建自定義DAG。
- 調度工作流:Cron native.。
- Spark應用程序:在任何Kubernetes集群上輕松編排Spark應用程序。
- 工作流模板:針對不同用例重復使用模板。輸入可以參數化。
- WebUI:用于檢查工作流程進度的出色視覺用戶界面。
更詳細的信息可以在其官方文檔中找到。
監測
一旦Prometheus掌握了這些指標,就需要一些Grafana儀表板進行監測。Apache Spark的自定義Grafana儀表板基于以下社區儀表板:
- ArgoCD儀表板
- Argo Workflow儀表板
- Apache Spark操作員儀表板
- Apache Spark應用程序儀表板
結語
Empathy公司選擇Spark Operator、ArgoCD和Argo Workflows在Kubernetes上創建Spark應用程序工作流解決方案,并使用GitOps傳播更改。本文所展示的設置已經在生產環境中使用了大約一個月的時間,并且反饋很好。每個用戶都對工作流程感到滿意,而擁有一個適用于任何云提供商的單一工作流程,可以擺脫了單個云計算提供商的鎖定。
如果親自進行測試,需要按照這些實際操作示例并享受從本地主機部署一些Spark應用程序的樂趣,以及本指南中描述的所有設置:Hands-on Empathy Repo。
雖然還有很長的路要走,但會有更多的收獲。希望這一創新能幫助企業變得更加與云無關。
原文標題:Running Apache Spark on Kubernetes,作者:Ramiro Alvarez Fernandez
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】


































