Spark

Kubernetes 從 v1.8 開始支持 原生的 Apache Spark 應用(需要 Spark 支持 Kubernetes,比如 v2.3),可以通過 spark-submit 命令直接提交 Kubernetes 任務。比如計算圓周率

bin/spark-submit \
  --deploy-mode cluster \
  --class org.apache.spark.examples.SparkPi \
  --master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \
  --kubernetes-namespace default \
  --conf spark.executor.instances=5 \
  --conf spark.app.name=spark-pi \
  --conf spark.kubernetes.driver.docker.image=kubespark/spark-driver:v2.2.0-kubernetes-0.4.0 \
  --conf spark.kubernetes.executor.docker.image=kubespark/spark-executor:v2.2.0-kubernetes-0.4.0 \
  local:///opt/spark/examples/jars/spark-examples_2.11-2.2.0-k8s-0.4.0.jar

或者使用 Python 版本

Spark on Kubernetes 部署

Kubernetes 示例 github 上提供了一個詳細的 spark 部署方法,由於步驟複雜,這裏簡化一些部分讓大家安裝的時候不用去多設定一些東西。

部署條件

  • 一個 kubernetes 群集, 可參考 集群部署

  • kube-dns 正常運作

創建一個命名空間

namespace-spark-cluster.yaml

這邊原文提到需要將 kubectl 的執行環境轉到 spark-cluster, 這邊爲了方便我們不這樣做, 而是將之後的佈署命名空間都加入 spark-cluster

部署 Master Service

建立一個 replication controller, 來運行 Spark Master 服務

創建 master 服務

spark-master-service.yaml

檢查 Master 是否正常運行

若 master 已經被建立與運行, 我們可以透過 Spark 開發的 webUI 來察看我們 spark 的群集狀況, 我們將佈署 specialized proxy

spark-ui-proxy-controller.yaml

提供一個 service 做存取, 這邊原文是使用 LoadBalancer type, 這邊我們改成 NodePort, 如果你的 kubernetes 運行環境是在 cloud provider, 也可以參考原文作法

spark-ui-proxy-service.yaml

部署完後你可以利用 kubecrl proxy 來察看你的 Spark 群集狀態

可以透過 http://localhost:8001/api/v1/proxy/namespaces/spark-cluster/services/spark-master:8080/ 察看, 若 kubectl 中斷就無法這樣觀察了, 但我們再先前有設定 nodeport 所以也可以透過任意臺 node 的端口 30080 去察看(例如 http://10.201.2.34:30080)。

部署 Spark workers

要先確定 Matser 是再運行的狀態

spark-worker-controller.yaml

透過指令察看運行狀況

也可以透過上面建立的 WebUI 服務去察看

基本上到這邊 Spark 的群集已經建立完成了

創建 Zeppelin UI

我們可以利用 Zeppelin UI 經由 web notebook 直接去執行我們的任務, 詳情可以看 Zeppelin UISpark architecture

zeppelin-controller.yaml

然後一樣佈署 Service

zeppelin-service.yaml

可以看到我們把 NodePort 設再 30081, 一樣可以透過任意臺 node 的 30081 port 訪問 zeppelin UI。

通過命令行訪問 pyspark(記得把 pod 名字換成你自己的):

接着就能使用 Spark 的服務了, 如有錯誤歡迎更正。

zeppelin 常見問題

  • zeppelin 的鏡像非常大, 所以再 pull 時會花上一些時間, 而 size 大小的問題現在也正在解決中, 詳情可參考 issue #17231

  • 在 GKE 的平臺上, kubectl post-forward 可能有些不穩定, 如果你看現 zeppelin 的狀態爲 Disconnected,port-forward 可能已經失敗你需要去重新啓動它, 詳情可參考 #12179

參考文檔

Last updated