如何在 Kubernetes 托管集群中将 --packages 传递给 spark-submit?

how to pass --packages to spark-submit in Kubernetes managed cluster?

我正在尝试使用 --packages

spark-submit 中使用 Snowflake spark 连接器包

当我 运行 在本地时,它工作正常。我能够连接到 Snowflake table 并返回 Spark DataFrame.

spark-submit --packages net.snowflake:snowflake-jdbc:2.8.1,net.snowflake:spark-snowflake_2.10:2.0.0 test_sf.py

但是当我尝试传递 --master 参数时,它失败说明 Snowflake class 不可用。

spark-submit --packages net.snowflake:snowflake-jdbc:2.8.1,net.snowflake:spark-snowflake_2.10:2.0.0 --master spark://spark-master.cluster.local:7077 test_sf.py

更新:

我已经尝试了所有选项,例如驱动程序和执行程序上的 --jarsextraClassPath--packages,但似乎没有任何效果..是因为 Spark standalone 中的一些问题集群

最新更新:

当我在 --jars 中指定 repository URL 而不是文件路径时,它正在工作。所以基本上我必须将 jars 上传到某个存储库并指向它。

错误日志:

Caused by: java.lang.ClassNotFoundException: net.snowflake.spark.snowflake.io.SnowflakePartition
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.spark.serializer.JavaDeserializationStream$$anon.resolveClass(JavaSerializer.scala:67)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
    at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
    at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    ... 1 more

我代表对此有一些见解的同事发帖:

当您从笔记本电脑 运行 spark-submit 到 运行 Kubernetes 上的工作负载(托管或其他方式)时,它需要您提供 k8s master URL 而不是 spark大师URL。无论这个 URL 指向 "spark://spark-master.cluster.local:7077" 都没有你的机器的视线,它可能甚至不存在于你的原始问题中。当使用 spark submit 时,它会在 k8s 中创建执行器和驱动程序节点,那时 spark master URL 将可用,但即便如此,spark master URL 也只能从 k8s 内部使用,除非视线可用

根据您的更新部分:对于传递包,包在本地 Maven 库或远程库中搜索包(如果提供了远程库的路径),您可以使用 --jars 选项。其中,您可以在将 运行 火花作业的容器内烘烤罐子,然后在 --jars 变量

中提供本地路径

这些是否与您在更新后的问题中得出的更新和结论产生共鸣?