Jupyter Notebook中Spark无法加载Kafka数据源问题求助
问题背景
Mac本地环境下,通过spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.4可以正常运行读取Kafka的代码,但在Jupyter Notebook中通过SparkSession.builder.config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.4")配置后,执行代码报AnalysisException: Failed to find data source: kafka,且Spark Web UI显示该包已存在于spark.jars.packages配置中。
解决方案
1. 修改Spark默认配置文件,提前加载依赖
在$SPARK_HOME/conf/spark-defaults.conf文件中添加以下配置(文件不存在则新建):
spark.jars.packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.4
保存后重启Jupyter Notebook内核,Spark启动时会自动下载并加载Kafka相关依赖包。
2. 配置Jupyter的PySpark内核启动参数
找到PySpark内核的配置文件kernel.json(通常路径为~/.local/share/jupyter/kernels/pyspark/kernel.json),在argv数组中添加--packages参数:
{ "argv": [ "/path/to/your/python", "-m", "ipykernel_launcher", "--packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.4", "-f", "{connection_file}" ], "display_name": "PySpark", "language": "python" }
修改后重启Jupyter,内核启动时会带上依赖参数,确保Kafka数据源类被正确加载。
3. 手动复制依赖包到Spark jars目录
- 执行
spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.4 --version,触发依赖包下载,包会被缓存到~/.ivy2/cache目录下。 - 找到以下核心jar包:
org.apache.spark/spark-sql-kafka-0-10_2.12/3.4/jars/spark-sql-kafka-0-10_2.12-3.4.jarorg.apache.kafka/kafka-clients/[对应版本]/jars/kafka-clients-[对应版本].jarorg.apache.spark/spark-token-provider-kafka-0-10_2.12/3.4/jars/spark-token-provider-kafka-0-10_2.12-3.4.jar
- 将这些jar包复制到
$SPARK_HOME/jars目录下,重启Jupyter内核即可。
原因说明
spark-submit会主动处理依赖包的下载、解析和类路径注入,而Jupyter Notebook中通过SparkSession.builder动态配置spark.jars.packages时,可能因SparkContext初始化顺序问题,导致Kafka数据源的注册类未被正确加载——即使UI显示配置存在,实际类路径中并未包含相关依赖。
内容的提问来源于stack exchange,提问作者steve

