【问题标题】:Pyspark Azure Blob Storage - Class org.apache.hadoop.fs.azure.NativeAzureFileSystem not foundPyspark Azure Blob 存储 - 类 org.apache.hadoop.fs.azure.NativeAzureFileSystem 未找到
【发布时间】: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:27​​4) 在 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


【解决方案1】:

固定的
我也遇到了同样的问题。
这样做解决了我的问题:

老的
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,com.microsoft.azure:azure-storage:8.6.6").getOrCreate()

在配置中,对于 hadoop azure 应该遵循 maven 存储库命名约定 Maven repo naming convention
因此将“-”更改为“:”有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 2015-04-29
    • 2021-08-15
    • 2019-08-17
    • 2018-02-17
    • 2021-08-07
    • 2017-04-18
    • 2019-04-06
    相关资源
    最近更新 更多