我试图使用spark-submit与client模式在库伯内特斯吊舱提交作业到电子病历(由于其他一些问题,我们不允许cluster模式)。默认情况下,spark-submit使用pod的hostname作为spark.driver.host,而hostname是pod的主机名,因此spark executor无法解析它。spark.driver.port也在舱(容器)的局部位置。
我知道一种将一些甜点传递给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个spark-submit作业,甚至可以在一个吊舱中运行多个spark-submit作业。因此,在启动pod之前,我们需要动态地选择k8s节点中的几个可用端口,并创建一个服务来执行端口映射,然后在启动结束符时,将这些端口传递到吊舱中,让spark-submit使用它们。我觉得这有点复杂。
使用hostNetwork: true可以潜在地解决这个问题,但是它在我们下面引入了许多其他问题,所以这不是一种选择。
如果spark-submit能够像driver.bindAddress和driver.host那样支持bindPort概念,或者支持proxy,那么解决这个问题就会更加干净。
有人有类似的情况吗?请分享一些见解。
谢谢。
附加上下文:spark version:2.4
发布于 2020-05-29 02:58:48
火花提交可以采取额外的arg,如,--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使用此主机和端口连接回submit。
我们使用hostPort和containerPort向Pod公开容器内的端口,并将端口范围和hostIP作为环境变量,以便火花提交知道使用什么。因此,这些额外的are是:
--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 variablehostPort是Kubernetes工作人员的本地工具,这意味着我们不需要担心端口的耗尽。k8s调度程序可以找到运行pod的主机。
我们可以在每个主机上保留40000到49000的端口,并为每个吊舱打开8个端口(因为每个星火提交都需要2个开放端口)。端口是基于pod_id选择的。由于Kubernetes建议每个节点运行少于100个豆荚,因此端口碰撞将非常罕见。
https://stackoverflow.com/questions/59655476
复制相似问题