【发布时间】:2022-08-24 13:48:24
【问题描述】:
我正在尝试使用 Jupyter Notebook 中的 pyspark 在 Azure Blob Storage 上读取 CSV 文件,但我遇到以下错误:
Py4JJavaError:调用 o34.csv 时出错。 : java.lang.RuntimeException:java.lang.ClassNotFoundException:类 org.apache.hadoop.fs.azure.NativeAzureFileSystem 未在 org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2667) 在 org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3431) 在 org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3466) 在 org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:174) 在 org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3574) 在 org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3521) 在 org.apache.hadoop.fs.FileSystem.get(FileSystem.java:540) 在 org.apache.hadoop.fs.Path.getFileSystem(Path.java:365) 在 org.apache.spark.sql.execution.datasources.DataSource$.$anonfun$checkAndGlobPathIfNecessary$1(DataSource.scala:747) 在 scala.collection.immutable.List.map(List.scala:293) 在 org.apache.spark.sql.execution.datasources.DataSource$.checkAndGlobPathIfNecessary(DataSource.scala:745) 在 org.apache.spark.sql.execution.datasources.DataSource.checkAndGlobPathIfNecessary(DataSource.scala:577) 在 org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:408) 在 org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:274) 在 org.apache.spark.sql.DataFrameReader.$anonfun$load$3(DataFrameReader.scala:245) 在 scala.Option.getOrElse(Option.scala:189) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:245) 在 org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:571) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在 py4j.Gateway.invoke(Gateway.java:282) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182) 在 py4j.ClientServerConnection.run(ClientServerConnection.java:106) 在 java.base/java.lang.Thread.run(Thread.java:829) 引起: java.lang.ClassNotFoundException:类 org.apache.hadoop.fs.azure.NativeAzureFileSystem 未在 org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2571) 在 org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2665) ... 29 更多
以下是我遵循的步骤: 我有一个可用的 Kubernetes 集群。
我安装了一个似乎可以正常工作的 HELM 图表 JupyterHub,我在那里安装了 Pyspark。
我安装了 HELM Chart (Bitnami) 来设置 Spark 集群。
我能够从 Jupyter 笔记本通过 pyspark 连接到我的 Spark 集群:
from pyspark.sql import SparkSession spark = SparkSession.builder.master(\"spark://spark-master-svc:7077\").getOrCreate() spark.sparkContext我可以在远程 Spark 中执行一些命令而没有任何问题。
我试图读取位于 Blob 存储上的 csv 文件,但我收到了上面粘贴的错误消息
SECRET_ACCESS_KEY = \"***\" STORAGE_NAME = \"***\" file_path = \"wasb://***@***.blob.core.windows.net/***.csv\" fs_acc_key = \"fs.azure.account.key.\" + STORAGE_NAME + \".blob.core.windows.net\" spark.conf.set(fs_acc_key, SECRET_ACCESS_KEY) df_csv = spark.read.csv( path=file_path, sep=\'|\', inferSchema=True, header=True )java.lang.RuntimeException:java.lang.ClassNotFoundException:类 org.apache.hadoop.fs.azure.NativeAzureFileSystem 未找到
经过一番研究,我发现有必要安装多个 jars(至少 hadoop-azure 和 azure-storage),所以我在 Dockerfile 中进行了安装,如 Bitnami 文档中所述:
# https://github.com/bitnami/bitnami-docker-spark/blob/master/3/debian-10/Dockerfile FROM bitnami/spark:3.2.0-debian-10-r73 USER root ### ADDITIONAL JARS # https://github.com/bitnami/bitnami-docker-spark#installing-additional-jars RUN curl https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure/3.3.1/hadoop-azure-3.3.1.jar --output /opt/bitnami/spark/jars/hadoop-azure-3.3.1.jar &&\\ curl https://repo1.maven.org/maven2/com/microsoft/azure/azure-storage/8.6.6/azure-storage-8.6.6.jar --output /opt/bitnami/spark/jars/azure-storage-8.6.6.jar &&\\ curl https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util/11.0.7/jetty-util-11.0.7.jar --output /opt/bitnami/spark/jars/jetty-util-11.0.7.jar &&\\ curl https://repo1.maven.org/maven2/org/apache/hadoop/thirdparty/hadoop-shaded-guava/1.1.1/hadoop-shaded-guava-1.1.1.jar --output /opt/bitnami/spark/jars/hadoop-shaded-guava-1.1.1.jar &&\\ curl https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar --output /opt/bitnami/spark/jars/httpclient-4.5.13.jar &&\\ curl https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.13.1/jackson-databind-2.13.1.jars --output /opt/bitnami/spark/jars/jackson-databind-2.13.1.jars &&\\ curl https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.13.1/jackson-core-2.13.1.jar --output /opt/bitnami/spark/jars/jackson-core-2.13.1.jar &&\\ curl https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util-ajax/11.0.7/jetty-util-ajax-11.0.7.jar --output /opt/bitnami/spark/jars/jetty-util-ajax-11.0.7.jar &&\\ curl https://repo1.maven.org/maven2/org/wildfly/openssl/wildfly-openssl/2.2.0.Final/wildfly-openssl-2.2.0.Final.jar --output /opt/bitnami/spark/jars/wildfly-openssl-2.2.0.Final.jar &&\\ curl https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-common/3.3.1/hadoop-common-3.3.1.jar --output /opt/bitnami/spark/jars/hadoop-common-3.3.1.jar &&\\ curl https://repo1.maven.org/maven2/com/microsoft/azure/azure-keyvault-core/1.2.6/azure-keyvault-core-1.2.6.jar --output /opt/bitnami/spark/jars/azure-keyvault-core-1.2.6.jar USER 1001我重新部署了我的 Spark 集群,jar 存在于预期的文件夹中
但是,我仍然遇到同样的错误:
java.lang.RuntimeException:java.lang.ClassNotFoundException:类 org.apache.hadoop.fs.azure.NativeAzureFileSystem 未找到
我已经尝试了很多在 stackoverflow 上找到的配置,但仍然得到相同的结果。
spark = SparkSession.builder.master(\"spark://spark-master-svc:7077\") \\ .config(\"spark.jars.packages\", \"org.apache.hadoop:hadoop-azure-3.3.1,com.microsoft.azure:azure-storage:8.6.6\").getOrCreate() spark = SparkSession.builder.master(\"spark://spark-master-svc:7077\") \\ .config(\"spark.jars.packages\", \"org.apache.hadoop:hadoop-azure-3.3.1\").getOrCreate() spark.sparkContext._conf.set(\"spark.hadoop.fs.wasb.impl\", \"org.apache.hadoop.fs.azure.NativeAzureFileSystem\") spark.sparkContext._conf.set(\"fs.azure\", \"org.apache.hadoop.fs.azure.NativeAzureFileSystem\") spark.sparkContext._conf.set(\"fs.wasbs.impl\", \"org.apache.hadoop.fs.azure.NativeAzureFileSystem\")无论我尝试什么配置,当我尝试读取 CSV 文件时,我都会收到相同的错误消息。
我真的不知道该尝试什么了,肯定有一些事情让我无法理解。
我希望这里有人可以帮助我吗?
-
您找到解决方案了吗?我在同一条船上...
-
我今天遇到了同样的问题。非常感谢任何帮助。
标签: azure docker pyspark blob jupyter