Kubernetes spark-submit on ADLS Gen2 error: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem not found
Kubernetes spark-submit on ADLS Gen2 error: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem not found
我正在尝试将 ADLS Gen2 上的 Pyspark 作业提交到 Azure-Kubernetes-Services (AKS) 并出现以下异常:
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem not found
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2595)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3269)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3301)
at org.apache.hadoop.fs.FileSystem.access0(FileSystem.java:124)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3352)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3320)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:479)
at org.apache.spark.deploy.DependencyUtils$.resolveGlobPath(DependencyUtils.scala:191)
at org.apache.spark.deploy.DependencyUtils$.$anonfun$resolveGlobPaths(DependencyUtils.scala:147)
at org.apache.spark.deploy.DependencyUtils$.$anonfun$resolveGlobPaths$adapted(DependencyUtils.scala:145)
at scala.collection.TraversableLike.$anonfun$flatMap(TraversableLike.scala:245)
at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:38)
at scala.collection.TraversableLike.flatMap(TraversableLike.scala:245)
at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:242)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:108)
at org.apache.spark.deploy.DependencyUtils$.resolveGlobPaths(DependencyUtils.scala:145)
at org.apache.spark.deploy.SparkSubmit.$anonfun$prepareSubmitEnvironment(SparkSubmit.scala:365)
at scala.Option.map(Option.scala:230)
at org.apache.spark.deploy.SparkSubmit.prepareSubmitEnvironment(SparkSubmit.scala:365)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)
at org.apache.spark.deploy.SparkSubmit.doRunMain(SparkSubmit.scala:180)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:203)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:90)
at org.apache.spark.deploy.SparkSubmit$$anon.doSubmit(SparkSubmit.scala:1030)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1039)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2499)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2593)
... 27 more
我的 spark-submit 看起来像这样:
$SPARK_HOME/bin/spark-submit \
--master k8s://https://XXX \
--deploy-mode cluster \
--name spark-pi \
--conf spark.kubernetes.file.upload.path=file:///tmp \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.executor.instances=2 \
--conf spark.kubernetes.container.image=XXX \
--conf spark.hadoop.fs.azure.account.auth.type.XXX.dfs.core.windows.net=SharedKey \
--conf spark.hadoop.fs.azure.account.key.XXX.dfs.core.windows.net=XXX \
--py-files abfss://data@XXX.dfs.core.windows.net/py-files/ml_pipeline-0.0.1-py3.8.egg \
abfss://data@XXX.dfs.core.windows.net/py-files/main_kubernetes.py
作业 运行 在我的 VM 上运行正常,并且从 ADLS Gen2 加载数据也没有问题。
在此post建议下载安装包并添加到spark/jars文件夹中。但是我不知道在哪里下载它,也不知道为什么必须首先包含它,如果它在本地工作正常的话。
编辑:
所以我设法将罐子包含在 Docker 容器中。如果我通过 ssh 进入该容器和 运行 作业,它可以正常工作并从 ADLS 加载文件。
但是,如果我将作业提交给 Kubernetes,它会抛出与以前相同的异常。
请问有人可以帮忙吗?
Spark 3.1.1,Python3.8.5,Ubuntu18.04
所以我设法解决了我的问题。这绝对是一种解决方法,但它确实有效。
我修改了 PySpark Docker 容器,将入口点更改为:
ENTRYPOINT [ "/opt/entrypoint.sh" ]
现在我可以 运行 容器而无需立即退出:
docker run -td <docker_image_id>
并且可以通过 ssh 进入:
docker exec -it <docker_container_id> /bin/bash
此时我可以使用 --package 标志在容器内提交 spark 作业:
$SPARK_HOME/bin/spark-submit \
--master local[*] \
--deploy-mode client \
--name spark-python \
--packages org.apache.hadoop:hadoop-azure:3.2.0 \
--conf spark.hadoop.fs.azure.account.auth.type.user.dfs.core.windows.net=SharedKey \
--conf spark.hadoop.fs.azure.account.key.user.dfs.core.windows.net=xxx \
--files "abfss://data@user.dfs.core.windows.net/config.yml" \
--py-files "abfss://data@user.dfs.core.windows.net/jobs.zip" \
"abfss://data@user.dfs.core.windows.net/main.py"
Spark随后下载了需要的依赖,并保存在容器中的/root/.ivy2下,并成功执行了作业。
我将整个文件夹从容器复制到主机上:
sudo docker cp <docker_container_id>:/root/.ivy2/ /opt/spark/.ivy2/
并再次修改Docker文件,将文件夹复制到镜像中:
COPY .ivy2 /root/.ivy2
最后,我可以使用这个新构建的映像和预期的 运行 将作业提交给 Kubernetes。
我正在尝试将 ADLS Gen2 上的 Pyspark 作业提交到 Azure-Kubernetes-Services (AKS) 并出现以下异常:
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem not found
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2595)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3269)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3301)
at org.apache.hadoop.fs.FileSystem.access0(FileSystem.java:124)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3352)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3320)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:479)
at org.apache.spark.deploy.DependencyUtils$.resolveGlobPath(DependencyUtils.scala:191)
at org.apache.spark.deploy.DependencyUtils$.$anonfun$resolveGlobPaths(DependencyUtils.scala:147)
at org.apache.spark.deploy.DependencyUtils$.$anonfun$resolveGlobPaths$adapted(DependencyUtils.scala:145)
at scala.collection.TraversableLike.$anonfun$flatMap(TraversableLike.scala:245)
at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:38)
at scala.collection.TraversableLike.flatMap(TraversableLike.scala:245)
at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:242)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:108)
at org.apache.spark.deploy.DependencyUtils$.resolveGlobPaths(DependencyUtils.scala:145)
at org.apache.spark.deploy.SparkSubmit.$anonfun$prepareSubmitEnvironment(SparkSubmit.scala:365)
at scala.Option.map(Option.scala:230)
at org.apache.spark.deploy.SparkSubmit.prepareSubmitEnvironment(SparkSubmit.scala:365)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)
at org.apache.spark.deploy.SparkSubmit.doRunMain(SparkSubmit.scala:180)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:203)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:90)
at org.apache.spark.deploy.SparkSubmit$$anon.doSubmit(SparkSubmit.scala:1030)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1039)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2499)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2593)
... 27 more
我的 spark-submit 看起来像这样:
$SPARK_HOME/bin/spark-submit \
--master k8s://https://XXX \
--deploy-mode cluster \
--name spark-pi \
--conf spark.kubernetes.file.upload.path=file:///tmp \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.executor.instances=2 \
--conf spark.kubernetes.container.image=XXX \
--conf spark.hadoop.fs.azure.account.auth.type.XXX.dfs.core.windows.net=SharedKey \
--conf spark.hadoop.fs.azure.account.key.XXX.dfs.core.windows.net=XXX \
--py-files abfss://data@XXX.dfs.core.windows.net/py-files/ml_pipeline-0.0.1-py3.8.egg \
abfss://data@XXX.dfs.core.windows.net/py-files/main_kubernetes.py
作业 运行 在我的 VM 上运行正常,并且从 ADLS Gen2 加载数据也没有问题。
在此post
编辑: 所以我设法将罐子包含在 Docker 容器中。如果我通过 ssh 进入该容器和 运行 作业,它可以正常工作并从 ADLS 加载文件。 但是,如果我将作业提交给 Kubernetes,它会抛出与以前相同的异常。 请问有人可以帮忙吗?
Spark 3.1.1,Python3.8.5,Ubuntu18.04
所以我设法解决了我的问题。这绝对是一种解决方法,但它确实有效。
我修改了 PySpark Docker 容器,将入口点更改为:
ENTRYPOINT [ "/opt/entrypoint.sh" ]
现在我可以 运行 容器而无需立即退出:
docker run -td <docker_image_id>
并且可以通过 ssh 进入:
docker exec -it <docker_container_id> /bin/bash
此时我可以使用 --package 标志在容器内提交 spark 作业:
$SPARK_HOME/bin/spark-submit \
--master local[*] \
--deploy-mode client \
--name spark-python \
--packages org.apache.hadoop:hadoop-azure:3.2.0 \
--conf spark.hadoop.fs.azure.account.auth.type.user.dfs.core.windows.net=SharedKey \
--conf spark.hadoop.fs.azure.account.key.user.dfs.core.windows.net=xxx \
--files "abfss://data@user.dfs.core.windows.net/config.yml" \
--py-files "abfss://data@user.dfs.core.windows.net/jobs.zip" \
"abfss://data@user.dfs.core.windows.net/main.py"
Spark随后下载了需要的依赖,并保存在容器中的/root/.ivy2下,并成功执行了作业。
我将整个文件夹从容器复制到主机上:
sudo docker cp <docker_container_id>:/root/.ivy2/ /opt/spark/.ivy2/
并再次修改Docker文件,将文件夹复制到镜像中:
COPY .ivy2 /root/.ivy2
最后,我可以使用这个新构建的映像和预期的 运行 将作业提交给 Kubernetes。