apache-spark - 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
编辑 因此,试图弄清楚这一点的一些额外观察:
- 看起来这至少部分是 Jupyter 笔记本问题,因为我现在可以通过 pyspark shell 让事情正常工作。
- 看起来我的笔记本正在启动它自己的 Spark 实例,所以 Spark 在此处的运行方式与从终端窗口运行的方式可能存在一些差异?
- 但不知它们有何不同,因为这两种环境都应该主要使用默认配置。
- 好的 - 看起来它在通过常规 Python REPL 调用时也不起作用,这让我认为 pyspark shell 创建的 spark 上下文与我在笔记本中创建的上下文有些不同。
- 好的 - 通过 Jupyter 运行时看起来有些不同 - hadoop.common.configuration.version 对于笔记本实例的值为 0.23.0,但对于 pyspark shell 实例的值为 3.0.0。不知道为什么会这样或它可能意味着什么。
我还应该检查什么以确认设置正确?
解决方案
好的 - 所以看起来不同之处在于 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。
推荐阅读
- android - TypeError - null 不是对象(评估't.data')[React Native 0.59.5 Android]
- java - 我无法使用 spring 框架将 Hibernate Validator 集成到 javaweb 项目中
- powerbi - 当A过滤的字符串值也等于B过滤的字符串值时如何计数
- python - 如何过滤和查找数据框的子集,其中两列中的分类数据出现超过 n、m 次
- java - 当从另一个对话框调用对话框时,软键盘不会在对话框关闭时隐藏
- android - 类型不匹配返回带有 fromCallable 的 observable
- java - 回放实时收集的数据以模拟真实的交通延迟和消息排序
- laravel - 即使我使用的是文档中的示例代码,为什么我的 testLogin 在 Laravel Dusk 中仍然失败?
- c++ - 移动轨迹栏时,如何防止控件(选项卡)在 Windows 通用控件 6.0 中闪烁和消失?
- java - 我需要帮助来修复此 NPE