我对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配置在类路径中找到类。
有人能告诉我怎么解决这个问题吗?我可能缺少一些基本的东西。
1条答案
按热度按时间qacovj5a1#
看起来我需要在docker映像中添加hadoop azure包,该映像运行jupyter notebook并充当spark驱动程序。这样做后,它的工作如预期。