开发过程bug修复记录

119 阅读4分钟

记录目前在做【数据中台】项目过程中,修复的 bug ,积累学习。

1 【运维中心】周期任务查询条件”节点名称/节点ID“输入框输入节点ID不生效 106

存在问题的SQL

SELECT td.name process_definition_name, td.id process_definition_id, td.task_type, u.user_name, pd.update_time,
    u.id user_id,
    td.code task_code, ptr.process_definition_code
FROM t_ds_task_definition td
LEFT JOIN t_ds_user u ON td.user_id = u.id
LEFT JOIN t_ds_process_task_relation ptr ON ptr.post_task_code = td.code
LEFT JOIN t_ds_process_definition pd ON ptr.process_definition_code = pd.code
WHERE td.task_type !='DEPENDENT' AND pd.release_state = 1 AND td.project_code = #{projectCode}
<if test="keyWords!=null and keyWords!=''">
    AND td.name like concat('%', #{keyWords}, '%') OR td.code like concat('%', #{keyWords}, '%')
</if>
<if test="taskType!=null and taskType!=''">
    AND td.task_type like concat('%', #{taskType}, '%')
</if>
<if test="userId!=null and userId!=0 and code!=0">
    AND u.id = #{userId}
</if>
ORDER BY td.update_time DESC

修复后

AND (td.name like concat('%', #{keyWords}, '%') OR td.code like concat('%', #{keyWords}, '%'))

总结

  • SQL中AND运算符的优先级高于OR运算符,因此AND条件将优先被处理。
  • 如果你想在OR条件后面添加AND条件,并且确保AND条件生效,可以使用括号来明确指定逻辑运算的顺序。通过使用括号,可以确保OR条件和AND条件按照预期的逻辑组合。

2 【运维中心】周期任务--修改责任人之后的任务,操作补数据,没有产生实例。

修改责任人操作未修改日志表数据

taskDefinitionNotOnlineMapper.updateTaskLog(projectCode, taskCode, userId);
UPDATE t_ds_task_definition_log SET user_id = #{userId} WHERE project_code=#{projectCode} AND code=#{taskCode}

3 【数据开发】离线同步,运行成功,运行日志报错

对于 Oracle 数据源,Datax同步时 table 属性值需要拼接上 schema

否则,ORA-00942: table or view does not exist

备注:

  1. 中台 hive 的 fieldDelimiter 为 \u0001
  2. 中台 hive 的 fileType 为 parquet
{
	"job": {
		"content": [{
			"reader": {
				"parameter": {
					"schema": "PMONITOR",
					"userPassword": "",
					"address": [],
					"dbName": "222222222222222222223333333333333333333344444444444444444444",
					"column": ["table_id"],
					"dbType": "5",
					"userName": "",
					"splitter": ",",
					"collectionName": "",
					"password": "**",
					"connection": [{
						"jdbcUrl": ["jdbc:oracle:thin:@//10.11.3.33:1521/evmsc"],
						"table": ["PMONITOR.gen_table"]
					}],
					"splitPk": "name",
					"username": "ev"
				},
				"name": "oraclereader"
			},
			"writer": {
				"parameter": {
					"path": "/warehouse/tablespace/external/hive/bitnei_dim.db/ods_data_test0532/year=2023/month=06/day=01",
					"fileName": "ppp",
					"compress": "snappy",
					"dbName": "test_lyk",
					"column": [{
						"name": "vin",
						"type": "string"
					}],
					"defaultFS": "hdfs://10.11.14.30:8020",
					"dbType": "2",
					"targetTableName": "ods_data_test0532",
					"writeMode": "append",
					"fieldDelimiter": "\u0001",
					"splitter": ",",
					"fileType": "parquet"
				},
				"name": "hdfswriter"
			}
		}],
		"setting": {
			"errorLimit": {
				"record": 0,
				"percentage": 0.02
			},
			"speed": {
				"channel": 3
			}
		}
	}
}

4 【数据表管理】导入本地txt/csv文件,提示导入成功但是数据库无数据

目前,对于 EXTERNAL 声明的外部表采用 Load 方式

"load data inpath '/dolphinscheduler/dolphinscheduler/resources/" + 
uploadFile.getOriginalFilename() + "' into table " + 
databaseName + "." + table.getTableName();

否则,读取文件每一行进行 insert into

"insert into " + database +"." + table.getTableName() + 
"(" + insertFieldStr + ") values "

问题在于:对于外部表 load 之前,文件处理的方法中,将上传文件的字段分隔符固定替换为 /t,而大数据侧已经在底层将分隔符替换为 /u001,导致数据上传后无法正常解析。

uploadFile = replaceCommaWithTab(uploadFile, separator, startLine, isFirstTitle, tableId);

修复:字段分隔符从 hive 元数据动态获取。

DataBaseUtils dataBase = new DataBaseUtils();
Connection connection;
// 建立JDBC连接
String fieldDelim = "/u001";
try {
    connection = getConnection(dataBase, table.getDatabaseName());
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("DESC FORMATTED " + table.getTableName());

    while (resultSet.next()) {
        String propertyName = resultSet.getString(2);
        String propertyValue = resultSet.getString(3);
        if (propertyName == null){
            continue;
        }
        if ("field.delim".equalsIgnoreCase(propertyName.trim())) {
            fieldDelim = propertyValue.trim();
            break;
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}

5 数据开发-调度配置,节点被引用为上游节点,可随意删除

目前删除节点的逻辑:

  1. 查询临时任务信息;
  2. 正式任务进行判断,下线处理

查询正式任务的最新版本

SELECT * FROM t_ds_task_definition 
WHERE code=#{taskCode} AND project_code=#{projectCode} 
ORDER BY version DESC LIMIT 1

该正式任务是否为某个工作流的中间节点,是则不允许删除

SELECT r.*
FROM t_ds_process_task_relation r
         INNER JOIN t_ds_process_definition t
         ON r.process_definition_code = t.code 
             AND r.process_definition_version = t.version
WHERE r.pre_task_code = 9759628198912
  AND r.pre_task_version = 1
  AND r.project_code = 9063908292224
  AND t.release_state = 1;

6 hdfs 高可用

报错:[job-0] ERROR HdfsWriter$Job - 判断文件路径[message:filePath =/data/ods/ ]是否存在时发生网络IO异常,请检查您的网络是否正常。

原因:在企业中经常会搞高可用模式,如果 dataxjson 设置的是nn01为路径,那如果nn02变成主节点,那就会路径失败。

参考:blog.csdn.net/weixin_4568…

7 hive 建表

Hive 3.1 的 Hive 官方文档: Hive SQL Conformance 显示, 针对 UNIQUEPRIMARY KEYFOREIGH KEY 等特性,支持的状态是 Partial,即未完全支持。其中,UNIQUEPRIMARY KEYFOREIGH KEY 的备注都是 NOT ENFORCED

参考:zhuanlan.zhihu.com/p/565102443

8 【运维中心】补数据数量少1条

参考原有实现

去数据库里排查问题(寻找差异)

大数据命令

列出指定目录下的文件及文件夹

hadoop fs -ls /dolphinscheduler/dolphinscheduler/resources/

Linux命令

vim 删除全部内容

键入 ggdG 即可(gg 光标跳转到该文件的行首 dG 删除光标行及其以下行的全部内容)。

查找大文件

查询大于200M的文件

find / -type f -size +200M | xargs ls -Slh

查找根目录下最大目录/文件(包括子文件夹)

du -Sh / | sort -rh | head -n10

参考:blog.csdn.net/m0_37996629…

sql 错误

Parameter 'array' not found. Available parameters are [keyWords, userIds, da

错误原因是因为,当传一个参数(数组类型),collection="Array",这样写是没问题的。 当传多个参数时,mybatis不知道参数的对应位置,因此collection对应的值应该是参数名称。

序列化

字符串解析成为json数组对象

JSONArray json = JSONArray.parseArray(jsonStr)

String 序列化为 Josn String 数组

@Nullable
private String getStringJson(String str) {
    List<String> stringList = new ArrayList<>();
    stringList.add(str);
    ObjectMapper objectMapper = new ObjectMapper();
    String json = null;
    try {
        json = objectMapper.writeValueAsString(stringList);
    } catch (JsonProcessingException e) {
        logger.error("Json Processing Exception", e);
    }
    return json;
}
[{
	"jdbcUrl": ["jdbc:oracle:thin:@//10.11.3.33:1521/evmsc"],
	"table": ["QPS_INFO"]
}]

Datax 数据同步相关

参考:github.com/alibaba/Dat…