【问题标题】:How to access the kubectl forwarded port on Spark Kubernetes cluster from spark-submit?如何从 spark-submit 访问 Spark Kubernetes 集群上的 kubectl 转发端口?
【发布时间】:2021-09-08 16:49:20
【问题描述】:

我有一个运行在内部 kubernetes 集群上的 spark 集群(由 Rancher 管理)。我们公司和集群的配置不允许从以下位置访问服务:

spark://SERVICE_NAME.namespace.svc.domain.....

我们使用 Big data Europe 的 yaml 文件创建了集群,并进行了一些明显的更改,例如资源。

链接到他们的 github:

https://github.com/big-data-europe/docker-spark#kubernetes-deployment

这种方法最好的一点是我们不必手动设置任何东西、部署、服务等。我们只需运行yaml 文件,一切都在几秒钟内为我们构建好了。

Yaml 文件: https://raw.githubusercontent.com/big-data-europe/docker-spark/master/k8s-spark-cluster.yaml

要访问 spark-ui,我只需创建一个入口对象,我们就可以从外部访问它。酷!

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: spark-master
    labels:
      app: spark-master
    annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/hsts: "false"
spec:
    rules:
    - host: RANDOM_NAME.NAMESPACE.svc.k8s.CLUSTER.DOMAIN.com
      http:
        paths:
          - path: /
            backend:
              serviceName: spark-master
              servicePort: 8080

我想做的是,通过我工作站上的 CLI 访问由 BDE 的给定 yaml 文件创建的 spark 集群。 因为我们还不支持服务方式(正确的方式)所以我尝试使用端口转发方法

一些见解:

  • 火花大师在 7077 上
  • spark UI 在 8080 上(可通过入口对象访问)
  • 火花架在 6066 上

kubectl -n <NAMESPACE> port-forward pods/spark-master-64bbbd7877-6vt6w 12345:7077

我的kubectl 已配置为连接到集群(感谢 Rancher 准备使用的配置文件)

但是当我尝试通过以下方式向集群提交作业时:


spark-submit --class org.apache.spark.examples.SparkPi --master spark://localhost:12345 --deploy-mode cluster \
--conf  spark.kubernetes.namespace=NAMESPACE \
--conf \spark.kubernetes.authenticate.submission.oauthToken=MY_TOKEN  \
--conf spark.kubernetes.file.upload.path=/temp C:\opt\spark\spark-3.0.0-bin-hadoop2.7\examples\jars\spark-examples_2.12-3.0.0.jar 1000

我收到错误

Forwarding from 127.0.0.1:12345 -> 7077
Forwarding from [::1]:12345 -> 7077
Handling connection for 12345
E1014 13:17:45.039840   13148 portforward.go:400] an error occurred forwarding 12345 -> 7077: error forwarding port 7077 to pod f83c6b40d5af66589976bbaf69537febf79ee317288a42eee31cb307b03a954d, uid : exit status 1: 2020/10/14 11:17:45 socat[5658] E connect(5, AF=2 127.0.0.1:7077, 16): Connection refused

简而言之,提交命令没有连接到从我的 CLI 部署的 Spark 集群。

我可以使用 BDE 文档中指定的 kubectl 命令运行 spark 提交,但出于某些原因,我们的要求是通过 CLI 连接。

在这方面的帮助将不胜感激。 我的令牌和其他东西在 k8s 模式下是正确的,我可以轻松 ping 集群(使用 url)

EDIT:

我假设 spark-master 进程创建了一个明确不绑定到地址 0.0.0.0 的套接字,但只绑定到它的主地址。由于端口转发将使用 pod 内的环回地址,因此连接失败。 ​​​ 而且我需要重新配置 spark-master 进程以显式绑定到 0.0.0.0。 如果这是问题所在,有人知道这样做的方法吗?

【问题讨论】:

    标签: apache-spark kubernetes kubectl spark-submit


    【解决方案1】:

    感谢您提出问题,尤其是您的编辑。它帮助我找出问题并解决它。

    我正在使用 bitnami helm 图表在我的集群上安装 spark。问题是 spark 守护程序是使用参数“--host”启动的,参数“--host”预填充了“hostname -f”,因此不会对 localhost 做出反应。 我通过将主 pod“SPARK_MASTER_HOST”的环境变量设置为 0.0.0.0 解决了 bitnami 图表的问题。

    编辑: 该解决方案仍然存在问题,即启动作业时的反向连接不起作用,因为主设备假定请求的来源是 127.0.0.1 :(。 为了解决这个问题,可能需要一个 vpn 隧道。

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2021-04-17
      • 2016-11-25
      • 1970-01-01
      相关资源
      最近更新 更多