[英]Spark/k8s: How to run spark submit on Kubernetes with client mode
我正在嘗試在 kubernetes pod 中使用帶有client
模式的spark-submit
向 EMR 提交作業(由於其他一些基礎設施問題,我們不允許cluster
模式)。 默認情況下, spark-submit
使用 pod 的hostname
作為spark.driver.host
並且hostname
是 pod 的主機名,因此spark executor
無法解析它。 並且spark.driver.port
也位於 pod(容器)本地。
我知道一種將一些 confs 傳遞給spark-submit
以便spark executor
可以與driver
交談,這些配置是:
--conf spark.driver.bindAddress=0.0.0.0 --conf spark.driver.host=$HOST_IP_OF_K8S_WORKER --conf spark.driver.port=32000 --conf spark.driver.blockManager.port=32001
並在 kubernetes 中創建一個服務,以便spark executor
可以與driver
交談:
apiVersion: v1
kind: Service
metadata:
name: spark-block-manager
namespace: my-app
spec:
selector:
app: my-app
type: NodePort
ports:
- name: port-0
nodePort: 32000
port: 32000
protocol: TCP
targetPort: 32000
- name: port-1
nodePort: 32001
port: 32001
protocol: TCP
targetPort: 32001
- name: port-2
nodePort: 32002
port: 32002
protocol: TCP
targetPort: 32002
但問題是在一個 k8s 工作器上可以運行 1 個以上的 pod,一個 pod 中甚至可以有 1 個以上的spark-submit
作業。 所以在啟動 pod 之前,我們需要動態選擇 k8s 節點中的幾個可用端口並創建一個服務來進行端口映射,然后在啟動 pod 的過程中,將這些端口傳遞給 pod 以告訴spark-submit
使用它們。 我覺得這有點復雜。
使用hostNetwork: true
可能會解決這個問題,但它在我們的基礎設施中引入了許多其他問題,所以這不是一個選擇。
如果spark-submit
可以支持bindPort
概念就像driver.bindAddress
和driver.host
或支持proxy
,這將是清潔劑來解決這一問題。
有人有類似情況嗎? 請分享一些見解。
謝謝。
附加上下文: spark version
: 2.4
Spark submit 可以采用額外的參數,例如--conf spark.driver.bindAddress, --conf spark.driver.host, --conf spark.driver.port, --conf spark.driver.blockManager.port, --conf spark.port.maxRetries
。 spark.driver.host
和driver.port
用於告訴 Spark Executor 使用此主機和端口連接回 Spark 提交。
我們使用hostPort
和containerPort
來暴露containerPort
內部的端口,將端口范圍和hostIP
作為環境變量注入到 Pod 中,以便 spark-submit 知道使用什么。 所以那些額外的參數是:
--conf spark.driver.bindAddress=0.0.0.0` # has to be `0.0.0.0` so that it is accessible outside pod
--conf spark.driver.host=$HOST_IP # k8s worker ip, can be easily injected to the pod
--conf spark.driver.port=$SPARK_DRIVER_PORT # defined as environment variable
--conf spark.driver.blockManager.port=$SPARK_DRIVER_PORT # defined as environment variable
--conf spark.port.maxRetries=$SPARK_PORT_MAX_RETRIES # defined as environment variable
hostPort
是 Kubernetes 工作線程的本地端口,這意味着我們無需擔心端口用完。 k8s 調度器可以找到一個主機來運行 pod。
我們可以在每台主機上保留 40000 到 49000 的端口,並為每個 pod 開放 8 個端口(因為每個 spark-submit 需要 2 個開放端口)。 端口是根據 pod_id 選擇的。 由於 Kubernetes 建議每個節點運行少於 100 個 pod,因此端口沖突將非常罕見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.