Spark on k8s 試用步驟

背景:
Spark 2.3.0 開始支持使用k8s 作爲資源管理原生調度spark。使用k8s原生調度的spark主要有以下好處:

採用k8s原生調度,不再需要二級調度,直接使用k8s原生的調度模塊,實現與其他應用的混布;
資源隔離:任務可以提交到指定的namespace,這樣可以複用k8s原生的qouta限制,實現任務資源的限制;
資源分配:可以指定每個spark任務的指定資源限制,任務之間更加隔離;
用戶自定義:用戶可以在spark基礎鏡像中打上自己的application, 更加靈活和方便;
試用條件:
一個k8s 1.7版本以上的集羣,由於spark on k8s 任務提交後實際上在集羣中是以custom resources和custom controller的形式,故你需要一個1.7+版本的k8s集羣,同時需要啓動k8s dns和RBAC。
下載spark2.3.0版本https://www.apache.org/dyn/closer.lua/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgz
試用步驟:
製作鏡像:
以下爲基礎鏡像,包含了spark和官方exemples,本文的試用使用的是該官方的exemple。

cd /path/to/spark-2.3.0-bin-hadoop2.7
docker build -t <your.image.hub/yourns>/spark:2.3.0 -f kubernetes/dockerfiles/spark/Dockerfile .
docker push <your.image.hub/yourns>/spark:2.3.0

用戶可以將自己的application和該基礎鏡像打在一起,並設置啓動main class以及application的路徑就可以實現用戶application的任務提交。

任務提交:

bin/spark-submit \
    --master k8s://<k8s apiserver address> \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.executor.instances=5 \
    --conf spark.kubernetes.container.image=<your.image.hub/yourns>/spark:2.3.0 \
    local:///opt/spark/examples/jars/spark-examples_2.11-2.3.0.jar

更多默認的參數配置請參考:1.spark running on k8s
注意以下坑:

spark 自帶的exemples是用jdk1.8編譯的,如果啓動過程中提示Unsupported major.minor version 52.0請更換jdk版本;
spark-submit默認會去~/.kube/config去加載集羣配置,故請將k8s集羣config放在該目錄下;
spark driver 啓動的時候報錯Error: Could not find or load main class org.apache.spark.examples.SparkPi
spark 啓動參數的local://後面應該跟你自己的spark application在容器裏的路徑;
spark driver 啓動拋異常Caused by: java.net.UnknownHostException: kubernetes.default.svc: Try again, 請保證 k8d let節點間網絡互通;
spark driver 啓動拋異常system: serviceaccount: default: default" cannot get pods in the namespace "default, 權限問題,執行一下兩條命令:
kubectl create rolebinding default-view --clusterrole=view --serviceaccount=default:default --namespace=defalut 和
kubectl create rolebinding default-admin --clusterrole=admin --serviceaccount=default:default --namespace=default 後就可以了
任務執行:
spark demo跑了起來後,可以看到spark-submit相當於起了一個controller, 用於管理單個spark任務,首先會創建該任務的service和driver,待driver運行後,會啓動exeuctor,個數爲--conf spark.executor.instances=5 指定的參數,待執行完畢後,submit會自動刪除exeuctor, driver會用默認的gc機制清理。

Reference:
spark running on k8s 
issue #34377

本文轉自CSDN-Spark on k8s 試用步驟

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章