pyspark 将kubernetes中spark的context web ui url更改为可从集群外部访问的url

wj8zmpe1  于 12个月前  发布在  Spark
关注(0)|答案(1)|浏览(92)

我在k8s上使用Apache Spark(3.3.1版)时遇到了问题。
简而言之:当我运行语句时,

print(sc.uiWebUrl)

在pod中,我会得到一个URL,它可以从k8s集群外部访问。例如:

http://{{my-ingress-host}}

说来话长:我想在k8s上为Apache Spark创建一个工作区,其中驱动程序的pod是我工作的工作区。我想让客户端使用pyspark-shellpyspark 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}}

我想确保尽可能调整解决方案的其他要点:

  • 我的k8s集群中没有nginx入口。也许我有一个HAPROXY入口。但我希望尽可能至少地耦合到我的入口实现。
  • 我更希望客户端需要尽可能最少地配置Apache Spark。
  • 我更希望Spark上下文的ui web url在创建上下文时设置,这意味着在pyspark-shell显示欢迎屏幕之前。
  • 我试过弄乱ui.proxy的配置,但没有帮助。有时会把事情搞得更糟。

谢谢大家,任何帮助都将不胜感激。

nx7onnlm

nx7onnlm1#

您可以通过设置SPARK_PUBLIC_DNS环境变量将Web UI的主机更改为所需的主机。这需要在驱动程序上完成,因为Web UI在驱动程序上运行。
要设置Web UI的端口,可以使用spark.ui.port配置参数。
因此,例如使用spark-submit将两者放在一起,就像下面这样:

bin/spark-submit \
   --class ... \
   --master k8s://... \
   ....
   ....
   ....
   --conf spark.kubernetes.driverEnv.SPARK_PUBLIC_DNS=YOUR_VALUE_HERE
   --conf spark.ui.port=YOUR_WANTED_PORT_HERE
   ...

相关问题