首页 > 解决方案 > 如何在 Kubernetes 托管集群中将 --packages 传递给 spark-submit?

问题描述

我正在尝试使用雪花火花连接器spark-submit--packages

当我在本地运行时,它工作正常。我能够连接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 类不可用。

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

更新:

我已经尝试了所有选项--jars,例如extraClassPath驱动程序和执行程序以及--packages,但似乎没有任何工作..是因为 Spark 独立集群中的一些问题

最近更新:

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

错误日志:

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$1.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

标签: kubernetespysparksnowflake-cloud-data-platform

解决方案


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

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

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

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


推荐阅读