Spark Druid Connector连接报错:JsonParseException无法识别token 'root1234'
Spark连接Druid深度存储时Jackson解析密码报错问题
我们尝试通过Spark连接Druid深度存储,使用了一个spark-druid-connector仓库,因版本不兼容,已针对Scala 2.11、Spark 2.4.3环境做适配修改。
第一种尝试及报错
按仓库示例代码读取Druid时:
import com.julianjaffe.spark_druid_connector.DruidDataFrameReader import com.julianjaffe.spark_druid_connector.model.HdfsDeepStorageConfig val deepStorageConfig = new HdfsDeepStorageConfig().storageDirectory("oss://debucket/druid/segments") spark.read .brokerHost("10.100.1.123") .brokerPort(18082) .metadataDbType("mysql") .metadataUri("jdbc:mysql://10.100.1.123:3306/druid") .metadataUser("root") .metadataPassword("root1234") .dataSource("interaction") .deepStorage(deepStorageConfig) .druid()
抛出如下错误:
Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'root1234': was expecting ('true', 'false' or 'null')
第二种尝试仍未解决
我们也尝试了通过配置参数的方式读取,问题依旧:
val properties = Map[String, String]( "metadata.dbType" -> "mysql", "metadata.connectUri" -> "jdbc:mysql://10.100.1.123:3306/druid", "metadata.user" -> "root", "metadata.password" -> "root123", "broker.host" -> "10.100.1.123", "broker.port" -> "8082", "table" -> "dataSource", "reader.deepStorageType" -> "hdfs", "local.storageDirectory" -> "oss://debucket/druid/segments/") spark .read .format("druid") .options(properties) .load()
问题分析与解决方案
这个错误是Jackson在解析密码字符串时,误将纯文本密码当作JSON值处理导致的。以下是可行的排查和解决方向:
- 检查适配代码的配置处理逻辑:重点查看连接器中
metadataPassword字段的序列化/反序列化代码,确认是否错误地使用Jackson的JSON解析方法处理纯字符串密码。如果是,修改为直接传递字符串而非解析JSON。 - 尝试给密码添加引号:在设置密码时,将密码用双引号包裹,比如
.metadataPassword("\"root1234\""),或者在properties中写成"metadata.password" -> "\"root123\"",让Jackson能将其识别为合法的JSON字符串。 - 验证元数据库连接信息:确认MySQL的URI、用户名、密码本身正确,排除数据库连接本身的问题。
- 核对适配修改点:检查针对Scala 2.11、Spark 2.4.3的适配代码,是否在配置传递环节引入了不必要的JSON转换逻辑。
内容的提问来源于stack exchange,提问作者Elif Gerdan
相关产品推荐
相关产品推荐

