java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem 未找到
java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem not found
我是 Spark 和 Kubernetes 世界的新手。我使用 docker-image-tool.sh 实用程序使用与 Hadoop 3.2 捆绑在一起的官方 Spark 3.0.1 构建了一个 Spark docker 图像。
我还为 Jupyter notebook 创建了另一个 docker 图像,并试图在客户端模式下 运行 在 Kubernetes 上启动。我首先 运行 我的 Jupyter notebook 作为一个 pod,使用 kubectl 进行端口转发并从我的系统 localhost:8888 访问笔记本 UI 。一切似乎工作正常。我能够从笔记本成功地 运行 命令。
现在我正在尝试使用 Hadoop ABFS connector 从我的笔记本访问 Azure Data Lake Gen2。
我正在如下设置 Spark 上下文。
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
# Create Spark config for our Kubernetes based cluster manager
sparkConf = SparkConf()
sparkConf.setMaster("k8s://https://kubernetes.default.svc.cluster.local:443")
sparkConf.setAppName("spark")
sparkConf.set("spark.kubernetes.container.image", "<<my_repo>>/spark-py:latest")
sparkConf.set("spark.kubernetes.namespace", "spark")
sparkConf.set("spark.executor.instances", "3")
sparkConf.set("spark.executor.cores", "2")
sparkConf.set("spark.driver.memory", "512m")
sparkConf.set("spark.executor.memory", "512m")
sparkConf.set("spark.kubernetes.pyspark.pythonVersion", "3")
sparkConf.set("spark.kubernetes.authenticate.driver.serviceAccountName", "spark")
sparkConf.set("spark.kubernetes.authenticate.serviceAccountName", "spark")
sparkConf.set("spark.driver.port", "29413")
sparkConf.set("spark.driver.host", "my-notebook-deployment.spark.svc.cluster.local")
sparkConf.set("fs.azure.account.auth.type", "SharedKey")
sparkConf.set("fs.azure.account.key.<<storage_account_name>>.dfs.core.windows.net","<<account_key>>")
spark = SparkSession.builder.config(conf=sparkConf).getOrCreate()
然后我运行使用以下命令读取 ADLS 位置中存在的 csv 文件
df = spark.read.csv("abfss://<<container>>@<<storage_account>>.dfs.core.windows.net/")
在运行宁宁它我收到错误
Py4JJavaError:调用 o443.csv 时发生错误。
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem 未找到
经过一些研究,我发现我必须明确包含 hadoop-azure jar 才能使适当的 classes 可用。我从 here 下载了 jar,将其放入 /spark-3.0.1-bin-hadoop3.2/jars 文件夹并再次构建图像。
不幸的是我仍然收到这个错误。我手动验证了 jar 文件确实存在于 docker 图像中并且包含 class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem
我查看了 spark-3.0.1-bin-hadoop3.2\kubernetes\dockerfiles\spark
文件夹中的 entrypoint.sh,它是我们的 spark docker 图像的入口点。它添加 class 路径中 spark-3.0.1-bin-hadoop3.2\jar\
文件夹中的所有包。
# If HADOOP_HOME is set and SPARK_DIST_CLASSPATH is not set, set it here so Hadoop jars are available to the executor.
# It does not set SPARK_DIST_CLASSPATH if already set, to avoid overriding customizations of this value from elsewhere e.g. Docker/K8s.
if [ -n "${HADOOP_HOME}" ] && [ -z "${SPARK_DIST_CLASSPATH}" ]; then
export SPARK_DIST_CLASSPATH="$($HADOOP_HOME/bin/hadoop classpath)"
fi
if ! [ -z ${HADOOP_CONF_DIR+x} ]; then
SPARK_CLASSPATH="$HADOOP_CONF_DIR:$SPARK_CLASSPATH";
fi
根据我的理解,spark 应该能够通过任何附加的 setJar 配置在其 class 路径中找到 class。
有人可以指导我如何解决这个问题吗?我可能在这里遗漏了一些非常基本的东西。
看来我需要在 Docker 图像中添加 hadoop-azure 包,运行 Jupyter notebook 并充当 Spark 驱动程序。这样做后它按预期工作。
正在应用此处提供的解决方案...
How do we specify maven dependencies in pyspark
我们可以启动一个 Spark 会话并从 Maven 中包含所需的 Jar。
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]")\
.config('spark.jars.packages', 'org.apache.hadoop:hadoop-azure:3.3.1')\
.getOrCreate()
我是 Spark 和 Kubernetes 世界的新手。我使用 docker-image-tool.sh 实用程序使用与 Hadoop 3.2 捆绑在一起的官方 Spark 3.0.1 构建了一个 Spark docker 图像。
我还为 Jupyter notebook 创建了另一个 docker 图像,并试图在客户端模式下 运行 在 Kubernetes 上启动。我首先 运行 我的 Jupyter notebook 作为一个 pod,使用 kubectl 进行端口转发并从我的系统 localhost:8888 访问笔记本 UI 。一切似乎工作正常。我能够从笔记本成功地 运行 命令。
现在我正在尝试使用 Hadoop ABFS connector 从我的笔记本访问 Azure Data Lake Gen2。 我正在如下设置 Spark 上下文。
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
# Create Spark config for our Kubernetes based cluster manager
sparkConf = SparkConf()
sparkConf.setMaster("k8s://https://kubernetes.default.svc.cluster.local:443")
sparkConf.setAppName("spark")
sparkConf.set("spark.kubernetes.container.image", "<<my_repo>>/spark-py:latest")
sparkConf.set("spark.kubernetes.namespace", "spark")
sparkConf.set("spark.executor.instances", "3")
sparkConf.set("spark.executor.cores", "2")
sparkConf.set("spark.driver.memory", "512m")
sparkConf.set("spark.executor.memory", "512m")
sparkConf.set("spark.kubernetes.pyspark.pythonVersion", "3")
sparkConf.set("spark.kubernetes.authenticate.driver.serviceAccountName", "spark")
sparkConf.set("spark.kubernetes.authenticate.serviceAccountName", "spark")
sparkConf.set("spark.driver.port", "29413")
sparkConf.set("spark.driver.host", "my-notebook-deployment.spark.svc.cluster.local")
sparkConf.set("fs.azure.account.auth.type", "SharedKey")
sparkConf.set("fs.azure.account.key.<<storage_account_name>>.dfs.core.windows.net","<<account_key>>")
spark = SparkSession.builder.config(conf=sparkConf).getOrCreate()
然后我运行使用以下命令读取 ADLS 位置中存在的 csv 文件
df = spark.read.csv("abfss://<<container>>@<<storage_account>>.dfs.core.windows.net/")
在运行宁宁它我收到错误 Py4JJavaError:调用 o443.csv 时发生错误。 : java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem 未找到
经过一些研究,我发现我必须明确包含 hadoop-azure jar 才能使适当的 classes 可用。我从 here 下载了 jar,将其放入 /spark-3.0.1-bin-hadoop3.2/jars 文件夹并再次构建图像。
不幸的是我仍然收到这个错误。我手动验证了 jar 文件确实存在于 docker 图像中并且包含 class org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem
我查看了 spark-3.0.1-bin-hadoop3.2\kubernetes\dockerfiles\spark
文件夹中的 entrypoint.sh,它是我们的 spark docker 图像的入口点。它添加 class 路径中 spark-3.0.1-bin-hadoop3.2\jar\
文件夹中的所有包。
# If HADOOP_HOME is set and SPARK_DIST_CLASSPATH is not set, set it here so Hadoop jars are available to the executor.
# It does not set SPARK_DIST_CLASSPATH if already set, to avoid overriding customizations of this value from elsewhere e.g. Docker/K8s.
if [ -n "${HADOOP_HOME}" ] && [ -z "${SPARK_DIST_CLASSPATH}" ]; then
export SPARK_DIST_CLASSPATH="$($HADOOP_HOME/bin/hadoop classpath)"
fi
if ! [ -z ${HADOOP_CONF_DIR+x} ]; then
SPARK_CLASSPATH="$HADOOP_CONF_DIR:$SPARK_CLASSPATH";
fi
根据我的理解,spark 应该能够通过任何附加的 setJar 配置在其 class 路径中找到 class。
有人可以指导我如何解决这个问题吗?我可能在这里遗漏了一些非常基本的东西。
看来我需要在 Docker 图像中添加 hadoop-azure 包,运行 Jupyter notebook 并充当 Spark 驱动程序。这样做后它按预期工作。
正在应用此处提供的解决方案...
How do we specify maven dependencies in pyspark
我们可以启动一个 Spark 会话并从 Maven 中包含所需的 Jar。
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]")\
.config('spark.jars.packages', 'org.apache.hadoop:hadoop-azure:3.3.1')\
.getOrCreate()