无法创建ConnectionString连接Azure Event Hub:JavaPackage不可调用错误
问题分析
报错TypeError: 'JavaPackage' object is not callable的核心原因是Spark无法找到org.apache.spark.eventhubs.EventHubsUtils这个Java类,常见触发场景包括:
- 集群未安装Azure Event Hubs Spark连接器依赖
- 类路径引用错误(不同版本的连接器类路径存在差异)
- 调用JVM类时使用了错误的Spark上下文引用
解决方案
1. 安装Event Hubs Spark连接器依赖
在Databricks集群的「库」页面,添加对应Spark版本的Maven库:
- Spark 3.x环境推荐使用坐标:
com.microsoft.azure:azure-eventhubs-spark_2.12:2.3.22(版本号可根据官方最新稳定版调整)
2. 修正连接字符串加密代码
方式一:修复类调用路径与上下文引用
把原代码中的加密调用:
writeConnectionString = sparkContext._jvm.org.apache.spark.eventhubs.EventHubsUtils.encrypt(connectionString)
替换为:
# 若仍报错,可尝试类路径改为com.microsoft.azure.eventhubs.spark.EventHubsUtils writeConnectionString = spark._jvm.org.apache.spark.eventhubs.EventHubsUtils.encrypt(connectionString)
说明:使用spark(SparkSession实例)而非sparkContext获取JVM对象,部分环境中sparkContext的JVM引用无法正确加载目标类。
方式二:用Databricks Secrets管理连接字符串(更安全)
无需手动加密,直接通过Databricks Secrets安全存储并读取连接字符串:
- 在Databricks工作区创建Secret Scope,存储Event Hub连接字符串(密钥名例如
eventhubs-connection-string) - 代码中直接调用:
connectionString = dbutils.secrets.get(scope="你的Secret Scope名称", key="eventhubs-connection-string") ehWriteConf = { 'eventhubs.connectionString': connectionString }
Databricks会自动处理连接字符串的安全传递,省去手动加密步骤。
3. 补充完整流式写入逻辑
原代码缺少最终的Event Hub写入代码,补充如下:
streamingDelays.writeStream \ .format("eventhubs") \ .options(**ehWriteConf) \ .option("checkpointLocation", "/dbfs/mnt/你的检查点路径") # 替换为DBFS上的有效路径 .start() \ .awaitTermination()
注意:检查点路径必须是DBFS上的合法路径,不能使用///checkpoint这类无效路径。
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

