簡體   English   中英

Spark/k8s:如何使用客戶端模式在 Kubernetes 上運行 spark提交

[英]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.bindAddressdriver.host或支持proxy ,這將是清潔劑來解決這一問題。

有人有類似情況嗎? 請分享一些見解。

謝謝。

附加上下文: spark version2.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.hostdriver.port用於告訴 Spark Executor 使用此主機和端口連接回 Spark 提交。

我們使用hostPortcontainerPort來暴露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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM