FlinkX脏值处理
在大量数据的传输过程中,必定会由于各种原因导致很多数据传输报错(比如类型转换错误),这种数据DataX认为就是脏数据。
– by DataX
配置实例
"dirty": {
"path": "/tmp",
"hadoopConfig": {
"fs.default.name": "hdfs://flinkhadoop:8020",
"dfs.nameservices": "ns1",
"dfs.ha.namenodes.ns1": "flinkhadoop",
"dfs.namenode.rpc-address.ns1.nn1": "hdfs://flinkhadoop:8020",
"dfs.ha.automatic-failover.enabled": "true",
"dfs.client.failover.proxy.provider.ns1": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
"fs.hdfs.impl.disable.cache": "true"
}
}
我这里的hdfs是一个单机。
实现逻辑
FlinkX的脏值处理逻辑是放在写入数据过程中的。按照脏值的定义,在读取过程中,能读取进来的都是正常的值,但是在写入过程中,以目标源的标准,可能读取的值是存在瑕疵的,所以是脏值。
在脏值处理的过程中,脏值处理器的作用肯定是首当其冲,我们先看一下DirtyManager的定义和初始化过程:
DirtyDataManager
全局视角:
创建
public DirtyDataManager(String path, Map<String, Object> configMap, String[] fieldNames, String jobId) {
this.fieldNames = fieldNames;
location = path + "/" + UUID.randomUUID() + ".txt";
this.config = configMap;
this.jobId = jobId;
}
- 可以看出来 location 是根据我们配置的路径+一个uuid生成的txt,其实这样在查看起来的时候不是很方便。
初始化
public void open() {
try {
FileSystem fs = FileSystemUtil.getFileSystem(config, null);
Path path = new Path(location