首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星火/K8s:如何以客户端模式在Kubernetes上运行spark提交

星火/K8s:如何以客户端模式在Kubernetes上运行spark提交
EN

Stack Overflow用户
提问于 2020-01-09 00:00:30
回答 1查看 3.6K关注 0票数 7

我试图使用spark-submitclient模式在库伯内特斯吊舱提交作业到电子病历(由于其他一些问题,我们不允许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对话。

代码语言:javascript
复制
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.bindAddressdriver.host那样支持bindPort概念,或者支持proxy,那么解决这个问题就会更加干净。

有人有类似的情况吗?请分享一些见解。

谢谢。

附加上下文:spark version2.4

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.maxRetriesspark.driver.hostdriver.port用于告诉Spark使用此主机和端口连接回submit。

我们使用hostPortcontainerPort向Pod公开容器内的端口,并将端口范围和hostIP作为环境变量,以便火花提交知道使用什么。因此,这些额外的are是:

代码语言:javascript
复制
--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的端口,并为每个吊舱打开8个端口(因为每个星火提交都需要2个开放端口)。端口是基于pod_id选择的。由于Kubernetes建议每个节点运行少于100个豆荚,因此端口碰撞将非常罕见。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59655476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档