更改Spark Web UI的根路径?

时间:2019-05-29 21:44:42

标签: python apache-spark kubernetes pyspark jupyter

我正在努力在Kubernetes上设置能够启动pyspark的Jupyter笔记本服务器。每个用户都可以一次运行多个服务器,并且通过导航到适当的主机以及服务器的全限定名称路径来访问每个服务器。例如:http://<hostname>/<username>/<notebook server name>

我定义了一个顶层函数,该函数允许用户创建一个指向Kubernetes主URL的SparkSession并将其pod设置为Spark驱动程序。

这一切都很好,但是我想使最终用户能够访问Spark Web UI的URL,以便他们可以跟踪其作业。 Spark on Kubernetes documentation将端口转发作为实现此目的的推荐方案。对于任何具有安全意识的组织来说,允许任何随机用户以这种方式设置端口转发似乎都是不可接受的。

我想使用Ingress Kubernetes定义来允许从外部访问驱动程序的Spark Web UI。我已经设置了以下内容:

# Service
apiVersion: v1
kind: Service
metadata:
  namespace: <notebook namespae>
  name: <username>-<notebook server name>-svc
spec:
  type: ClusterIP
  sessionAffinity: None
  selector:
    app: <username>-<notebook server name>-notebook
  ports:
  - name: app-svc-port
    protocol: TCP
    port: 8888
    targetPort: 8888
  - name: spark-ui-port
    protocol: TCP
    port: 4040
    targetPort: 4040

# Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: workspace
  name: <username>-<notebook server name>-ing
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: <hostname>
    http:
      paths:
      - path: /<username>/<notebook server name>
        backend:
          serviceName: <username>-<notebook server name>-svc
          servicePort: app-svc-port
      - path: /<username>/<notebook server name>/spark-ui
        backend:
          serviceName: <username>-<notebook server name>-svc
          servicePort: spark-ui-port

但是,在这种设置下,当我导航到http://<hostname>/<username>/<notebook server name>/spark-ui/时,我将重定向到http://<hostname>/jobs。这是因为/jobs是Spark Web UI的默认入口点。但是,我没有该路径的入口规则,也无法设置这样的规则,因为每个用户的Web UI都会在负载均衡器中相互冲突(除非我有误解,这是完全可能的)。 / p>

Spark UI configuration设置下,似乎没有一种方法可以为Spark会话设置根路径。您可以更改其运行的端口,但是我想做的是使UI在类似http://<hostname>/<username>/<notebook server name>/spark-ui/<jobs, stages, etc>的位置上运行。真的没有办法更改URL主机名之后和最后一部分之前的内容吗?

2 个答案:

答案 0 :(得分:2)

1:设置您的Spark配置

spark.ui.proxyBase: /foo

2:在Ingress中设置nginx批注

annotations:
  nginx.ingress.kubernetes.io/proxy-redirect-from: http://$host/
  nginx.ingress.kubernetes.io/proxy-redirect-to: http://$host/foo/

3:重写目标的注释:

annotations:
  nginx.ingress.kubernetes.io/rewrite-target: /$2

spec:
  rules:
  - host: <host>
    http:
      paths:
      - backend:
          serviceName: <service>
          servicePort: <port>
        path: /foo(/|$)(.*)

答案 1 :(得分:0)

是的,您可以实现这一目标。具体来说,您可以通过在spark-defaults.conf中或在运行时设置spark.ui.proxyBase属性来执行此操作。

示例:

回显“ spark.ui.proxyBase $ SPARK_UI_PROXYBASE” >> /opt/spark/conf/spark-defaults.conf;

然后这应该工作。