首页 > 解决方案 > PySpark / Kafka - org.apache.spark.sql.kafka010.KafkaSourceProvider 无法实例化

问题描述

所以,我正在努力建立一个使用 PySpark 和 Kafka 的开发环境。我正在完成设置工作,因此我可以在 Jupyter 笔记本中运行这些教程作为“hello world”练习:https://spark.apache.org/docs/3.1.1/structured-streaming-kafka-integration。 html

不幸的是,当我尝试连接到 Kafka 流时,我目前遇到了以下错误:

Py4JJavaError: An error occurred while calling o68.load.
: java.util.ServiceConfigurationError: org.apache.spark.sql.sources.DataSourceRegister: Provider org.apache.spark.sql.kafka010.KafkaSourceProvider could not be instantiated
    at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:583)
    at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:805)
    at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:723)
    at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1395)
    ...

现在,一些挖掘告诉我,这个问题的最常见原因是版本不匹配(对于 Spark 或正在使用的 Scala 版本)。但是,我能够确认这些已正确对齐:

Spark: 3.1.1
Scala: 2.12.10

conf/spark-defaults.conf

...
spark.jars.packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.1

编辑 因此,试图弄清楚这一点的一些额外观察:

我还应该检查什么以确认设置正确?

标签: apache-sparkpysparkapache-kafkajupyter-notebook

解决方案


好的 - 所以看起来不同之处在于 findspark 正在定位和使用不同的 Spark 主目录(通过 pip 安装 pyspark 安装的目录)。

看起来 Hadoop 2.7 的 Spark 3.1.1 与 Kafka 客户端存在问题(或者可能需要进行不同的配置),但 Hadoop 3.2 的 Spark 3.1.1 工作正常。

解决方案是通过将 spark_home 路径传递给findspark.init()

findspark.init(spark_home='/path/to/desired/home')

需要注意的事情让我感到困惑,也可能会让你绊倒:

  • 如果您通过 pip / mambaforge 安装了 pyspark,这还将部署第二个 SPARK_HOME - 这可能会造成依赖项/库混乱。
  • bin/ 中的许多脚本都使用SPARK_HOME来确定在哪里执行,所以不要仅仅因为您在一个家中运行脚本就认为您正在该家中运行 spark。

推荐阅读