大家好,我在
k8s
上遇到了 Apache Spark(版本 3.3.1)的问题。
简而言之: 当我运行该语句时
print(sc.uiWebUrl)
在 pod 内,我会得到一个
URL
,可以从 k8s
集群外部访问。
比如:
http://{{my-ingress-host}}
长话短说: 我想在
k8s
上为 Apache Spark 创建一个工作区,其中驱动程序的 pod 就是我工作的 workspace。我想让客户端使用 pyspark-shell
或使用 pyspark
python 库运行 Apache Spark。
无论哪种方式,我都希望 UI 的 Web URL 是可从外部世界(
k8s
集群外部)访问的 URL。
为什么?因为UX
,我想让我的客户的生活更轻松。
因为我在
k8s
上运行,所以我的Apache Spark程序的部分配置是:
spark.driver.host={{driver-service}}.{{drivers-namespace}}.svc.cluster.local
spark.driver.bindAddress=0.0.0.0
因此,这段代码的输出:
print(sc.webUiUrl)
将是:
http://{{driver-service}}.{{drivers-namespace}}.svc.cluster.local:4040
同样在 pyspark-shell 中,也会显示相同的地址。
所以我的问题是,有没有办法将 ui web url 的主机更改为我在
ingress
中定义的主机,以使我的客户的生活更轻松?
所以新的输出将是:
http://{{my-defined-host}}
我想确保尽可能调整解决方案的其他要点:
nginx
入口。也许我有一个HAPROXY
入口。但我希望尽可能最少与我的入口实现耦合。pyspark-shell
显示欢迎屏幕之前。ui.proxy
配置,但没有帮助。有时会让事情变得更糟。提前感谢大家,任何帮助将不胜感激。
SPARK_PUBLIC_DNS
环境变量将 Web UI 的主机更改为您想要的主机。这需要在驱动程序上完成,因为 Web UI 在驱动程序上运行。
设置该环境变量的方法有多种,但如果您使用
spark-submit
,您可以执行以下操作:
bin/spark-submit \
--class ... \
--master k8s://... \
....
....
....
--conf spark.kubernetes.driverEnv.SPARK_PUBLIC_DNS=YOUR_VALUE_HERE
...