近期打算升级dolphinscheduler到3.2.0,因此进行了一波测试。本文主要讲解在测试数据质量模块的时候遇到的问题,以及问题的原因。和临时解决方案(由于非专门后端,修改的代码可能没有考虑全局,仅为解决当前问题而修改。)
目前改下来,hive数据源算可以用了。PG数据源问题太多,可能是多了一层schema的原因,放弃了。先记录一下遇到的问题,先去测试数据质量各种检测了。
一、类找不到异常
根据官网描述,当前 dolphinscheduler-data-quality-3.2.0.jar
是瘦包,不包含任何 JDBC
驱动。 如果有 JDBC
驱动需要,可以在节点设置
选项参数
处设置 --jars
参数, 如:--jars /lib/jars/mysql-connector-java-8.0.16.jar
。
其他类找不到的问题类似。除此之外还可以直接将对应的包放入 ${SPARK_HOME}/jars
目录下。如果只在海豚工作节点的客户端上放置JAR包,需要用client或者local模式启动任务。
二、使用PG库作为海豚数据库时,可能会遇到时间类型错误
ERROR: column "create_time" is of type timestamp without time zone but expression is of type character varying
可以通过添加URL参数 stringtype=unspecified
解决:
bash
jdbc:postgresql://localhost:5432/databaseName?stringtype=unspecified
但是,这样修改以后在转换数据库连接参数的时候会报错JSON转换异常:
at [Source: (String)"{"other":"stringtype=unspecified","address":"jdbc:postgresql://IP:PORT","user":"user","password":"*******","database":"bigdata","jdbcUrl":"jdbc:postgresql://IP:PORT/bigdata"}"; line: 1, column: 10] (through reference chain: org.apache.dolphinscheduler.plugin.datasource.postgresql.param.PostgreSQLConnectionParam["other"])
因为 PostgreSQLConnectionParam 中,other 字段是一个Map结构。但是在数据质量中,用了 Properties 来存储,再JSON化:
这样在后续JSON转对象的时候,因为String类型不能转Map而报错。因此,我对 TaskExecutionContextFactory
类 进行了修改:
修改后,就可以正常转换了。
三、使用PG库作为海豚数据库时,可能会遇到最后写入结果表失败的问题
[INFO] 2023-12-28 11:53:43.857 +0800 - -> Exception in thread "main" org.postgresql.util.PSQLException: ERROR: schema "bigdata" does not exist
这是因为与 mysql 的 database.table 不同,PG库中是以 schema.table 的形式访问表。而源码中,采用了相同的方式:
因此,最简单的方式就是直接访问表。但是,需要注意的是。这样的话,存储海豚的数据库就需要单独用一个,且把表放在 public 模式下。修改 JdbcWriter
类 后的代码:
四、数据质量任务节点重跑的时候,可能会失败
Exception in thread "main" org.apache.spark.sql.AnalysisException: path hdfs://MYCLUSTER/user/dolphinscheduler/data_quality_error_data/0_10_空值检测 already exists.;
这是因为数据质量任务执行的最后会把结果写入到HDFS上,但是写入模式是使用ERROR,因此重跑的时候遇到相同的目录,自然报错了。把 BaseFileWriter
类中的写入模式改成 overwrite
,即可解决:
五、当数据源采用加密策略的时候,会导致数据质量任务连接数据源失败
这是因为在源码中,并没有对密码部分进行解密操作。因此会报错:
因为这里涉及到了 common.properties,尝试了几次没有好的办法,只能用默认密钥加密才有效。因此以下方案适用于默认密钥,或者直接将自定义密钥替换源码中的默认密钥常量。
添加pom依赖:
修改代码:
六、检测数据源为PG库时,报错表不存在
ERROR: relation "bigdata.t100" does not exist
和之前问题一样,PG这里需要的是 schema 而不是 database。
以上就是目前测试的经验,有需要的小伙伴可以参考。
后续:PG数据源问题太多了。放弃了。目前hive可以用了,就先用着吧。