Jupyter/PyCharm运行Spark Avro报访问拒绝问题咨询
问题梳理
- Jupyter环境下Spark读写Parquet、CSV格式文件正常,操作Avro格式时触发访问拒绝报错
- 参照官方《Apache Avro Data Source Guide》方案,以管理员身份执行携带
org.apache.spark:spark-avro_2.12:3.3.0依赖的./bin/spark-submit命令,仍返回访问被拒错误(对应报错参考截图1、截图2) - 2022年7月5日测试验证:命令行执行携带相同Avro依赖的
./bin/spark-shell命令时,Avro相关代码可正常运行(运行界面参考Spark-shell截图、Avro编码截图),但命令行编码便捷性不足 - 需要定位具体操作错误点,获取查看IDE启动Spark时对应
spark-submit、spark-shell加载配置的方法
错误原因
Avro是Spark外部数据源组件,不属于核心内置模块:命令行执行spark-shell时手动传入的依赖参数只对当前命令行启动的实例生效,Jupyter、PyCharm自行启动的Spark实例默认仅加载核心内置依赖,不会自动拉取Avro依赖包,因此触发类加载失败、访问拒绝类报错。之前手动执行spark-submit仍报错,通常是依赖参数传入位置错误——--packages参数必须写在主类、应用jar路径参数之前,否则不会被提交逻辑解析。
修复方案
Jupyter环境
两种方式二选一即可:
- 启动Jupyter前在终端配置环境变量,再启动服务:
export PYSPARK_SUBMIT_ARGS='--packages org.apache.spark:spark-avro_2.12:3.3.0 pyspark-shell' jupyter notebook
- 在Notebook代码中初始化SparkSession时直接注入依赖配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Avro_Test") \ .config("spark.jars.packages", "org.apache.spark:spark-avro_2.12:3.3.0") \ .getOrCreate()
PyCharm环境
两种方式二选一即可:
- 打开对应Python脚本的运行配置,在环境变量项添加
PYSPARK_SUBMIT_ARGS,值设为--packages org.apache.spark:spark-avro_2.12:3.3.0 pyspark-shell - 和Jupyter逻辑一致,在代码初始化SparkSession时,通过
spark.jars.packages配置项传入Avro依赖坐标
查看IDE启动Spark加载配置的方法
- 代码内查询:Spark实例启动后,执行
spark.sparkContext.getConf().getAll(),会以列表形式返回当前进程加载的所有配置项,包含依赖jar路径、提交参数、资源配置等全量信息 - 日志查询:打开Spark运行日志目录,默认路径为
$SPARK_HOME/work/或当前运行目录下的spark-<用户名>-org.apache.spark.deploy.*.out文件,日志内会完整打印IDE启动Spark时拼接的等效spark-submit/spark-shell命令、所有加载的配置项与依赖包 - 配置生效验证:执行
spark.read.format("avro").load("测试avro文件路径"),无报错正常返回数据即配置成功
内容的提问来源于stack exchange,提问作者Decurro
相关产品推荐
相关产品推荐

