如何在 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
更新:
我已经尝试了所有选项,例如驱动程序和执行程序上的 --jars
、extraClassPath
和 --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 变量
中提供本地路径
这些是否与您在更新后的问题中得出的更新和结论产生共鸣?
我正在尝试使用 --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
更新:
我已经尝试了所有选项,例如驱动程序和执行程序上的 --jars
、extraClassPath
和 --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 变量
中提供本地路径这些是否与您在更新后的问题中得出的更新和结论产生共鸣?