java.lang.classnotfoundexception:找不到类org.apache.hadoop.fs.azurebfs.secureazureblobfilesystem

cnh2zyt3  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(495)

我对spark和kubernetes的世界还很陌生。我使用官方的spark3.0.1和hadoop3.2绑定,并使用docker-image-tool.sh实用程序构建了一个spark-docker映像。
我还为jupyter笔记本创建了另一个docker映像,并尝试在客户机模式下在kubernetes上运行spark。我首先运行我的jupyter笔记本作为一个pod,使用kubectl做一个端口转发,然后从我的系统访问笔记本uilocalhost:8888 . 一切似乎都很顺利。我能够从笔记本上成功运行命令。
现在我正在尝试使用hadoop abfs连接器从我的笔记本访问azuredatalakegen2。我将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:找不到类org.apache.hadoop.fs.azurebfs.secureazureblobfilesystem
经过一番研究,我发现我必须显式地包含hadoopazurejar,才能获得合适的类。我从这里下载了jar,把它放在/spark-3.0.1-bin-hadoop3.2/jars文件夹中,然后再次构建了图像。
不幸的是,我仍然得到这个错误。我手动验证了jar文件确实存在于docker映像中,并且包含该类 org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem 我看着眼前的入口 spark-3.0.1-bin-hadoop3.2\kubernetes\dockerfiles\spark 文件夹,它是我们的spark docker映像的入口点。它添加了 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配置在类路径中找到类。
有人能告诉我怎么解决这个问题吗?我可能缺少一些基本的东西。

qacovj5a

qacovj5a1#

看起来我需要在docker映像中添加hadoop azure包,该映像运行jupyter notebook并充当spark驱动程序。这样做后,它的工作如预期。

相关问题