记录目前在做【数据中台】项目过程中,修复的 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
备注:
- 中台 hive 的 fieldDelimiter 为 \u0001
- 中台 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 数据开发-调度配置,节点被引用为上游节点,可随意删除
目前删除节点的逻辑:
- 查询临时任务信息;
- 正式任务进行判断,下线处理
查询正式任务的最新版本
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异常,请检查您的网络是否正常。
原因:在企业中经常会搞高可用模式,如果 datax 的 json 设置的是nn01为路径,那如果nn02变成主节点,那就会路径失败。
7 hive 建表
Hive 3.1 的 Hive 官方文档: Hive SQL Conformance 显示, 针对 UNIQUE, PRIMARY KEY, FOREIGH KEY 等特性,支持的状态是 Partial,即未完全支持。其中,UNIQUE, PRIMARY KEY, FOREIGH 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
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"]
}]