SparkSubmitOperator指定多jar包时出现Azure文件系统类找不到报错如何解决
Spark读取Azure Blob Storage类找不到问题解决方案
你遇到的org.apache.hadoop.fs.azure.NativeAzureFileSystem类找不到报错,核心有3个配置错误:
- 依赖不全:
hadoop-azure包本身依赖azure-storage系列jar包,仅导入hadoop-azure-3.3.1.jar无法满足类加载要求,缺少的依赖会导致核心类无法初始化 - Jar路径分隔符错误:SparkSubmitOperator的
jars和driver_class_path参数要求多个jar路径之间仅用英文逗号分隔,不能加空格,你代码中写的", "会让第二个jar路径前多出空格,系统无法识别到hadoop-azure包的有效路径 - 版本兼容问题:
hadoop-azure包的版本必须和Spark集群自带的Hadoop runtime版本完全匹配,跨版本使用也会出现类加载失败
另外你代码中还有两处笔误:
- Spark写JDBC的properties配置中,
driver的键写错了,原代码是"driver: ",正确写法是"driver": "com.mysql.cj.jdbc.Driver"
解决方案
第一步:补全依赖
下载和你hadoop-azure版本匹配的azure-storage包:hadoop-azure 3.3.1对应使用azure-storage-8.6.6.jar,将该jar包放到和现有两个依赖包相同的路径下。
第二步:修复SparkSubmitOperator配置
移除jar路径之间的空格,同时加入新增的azure-storage依赖:
spark_job = SparkSubmitOperator( task_id="my-spark-app", application="path/to/my/spark/job.py", name="my-spark-app", conn_id="spark_default", verbose=1, conf={"spark.master":spark_master}, application_args=[tsv_file, mysql_server, mysql_user, mysql_password, mysql_table], # 移除逗号后的空格,新增azure-storage包路径 jars=azure_hadoop_jar + "," + mysql_driver_jar + "," + azure_storage_jar, driver_class_path=azure_hadoop_jar + "," + mysql_driver_jar + "," + azure_storage_jar, dag=dag)
如果是集群运行模式,建议直接通过spark.jars.packages自动拉取匹配依赖,避免手动管理jar包的路径和版本问题:
conf={ "spark.master":spark_master, "spark.jars.packages": "org.apache.hadoop:hadoop-azure:3.3.1,com.microsoft.azure:azure-storage:8.6.6,mysql:mysql-connector-java:8.0.27" }
第三步:修复Spark任务代码中的JDBC笔误
df_tsv.write.jdbc(url=mysql_url, table=mysql_table, mode="append", properties={ "user":mysql_user, "password": mysql_password, "driver": "com.mysql.cj.jdbc.Driver" # 修正driver键的写法 })
第四步:验证版本兼容性
确认Spark集群使用的Hadoop版本和你引入的hadoop-azure包大版本一致,比如集群Hadoop版本为3.2.x就使用对应3.2.x版本的hadoop-azure包,不要跨版本使用。
内容的提问来源于stack exchange,提问作者Minura Punchihewa
相关产品推荐
相关产品推荐

