datax一次读,多次写改造

datax一次读,多次写改造

  第一次写技术类文章,写的不好请不要喷,最近公司在用datax进行数据同步,但是由于datax只支持一次读,一次写模式,如果我一份数据要分发到多处就会频繁读、写极大浪费资源,所以就下载了datax源码,尝试能否改造为一次读,多次写这样的模式,经过一点点debug以及源码的查看,了解datax的传输机制,决定尝试修改源码,经过几天还真的搞出来了,下面是我测试的job  json配置文件:

{
    "job": {
        "setting": {
            "speed": {
                "channel": 2
            }
        },
        "content": [
          {
            "reader":{
"name":"mysqlreader",
"parameter":{
"connection":[
{
"jdbcUrl":[
"jdbc:mysql://xxx.xxx.xxx.xxx:3306/dp_test?useUnicode=true&characterEncoding=utf8"
],
"querySql":[
"select id,username,password from testzhuser;"
]
}
],
"password":"****",
"username":"root"
}
},
             "writer": [{
                    "name": "mysqlwriter",
                    "parameter": {
                        "writeMode": "insert",
                        "username": "root",
                        "password": "****",
                        "column":["id","username","password"],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://xxx.xxx.xxx.xxx:3306/dp_test?useUnicode=true&characterEncoding=utf8",
                                "table": ["testzhuser1"]
                            }
                        ]
                    }
                },{
"name": "oraclewriter",
"parameter": {
"username": "xxxx",
"password": "xxxx",
"column": ["id", "username", "password"],
"connection": [{
"jdbcUrl": "jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:orcl",
"table": ["TESTZHUSER1"]
}]
}
},{
                    "name": "hdfswriter",
                    "parameter": {
                        "defaultFS": "hdfs://xxx.xxx.xxx.xxx:9000",
                        "fileType": "text",
                        "path": "/hive/warehouse/testzhuser1",
                        "fileName": "testzhuser11.txt",
                        "column": [
                            {
                                "name":"id",
                                "type":"string"
                            },
                            {
                                "name":"username",
                                "type":"string"
                            },
                            {
                                "name":"password",
                                "type":"string"
                            }
                        ],
                        "writeMode": "append",
                        "fieldDelimiter": "|",
                        "compress":""
                    }
                }
            ]
          }
        ]
    }

}

中间经历过磨难,datax传输原理是 channel ,channel中通过queue来进行数据的传输,本来想的是在datax 写入目标的时候进行数据的多分发,在小数据量的时候还真的运行成功了,当我同步16000+数据时,问题暴露了,就是数据混乱了。然后又换了种思路来修改,就是在数据读出后创建多个channel 以及queue队列,并创建一个唯一channelkey ,同一个writer用同一个channelKey进行数据的获取,并写入到目标中去。

  由于第一次注册csdn还不会上传文件,这几天研究了就把修改的源码上传到csdn中,请关注!

你可能感兴趣的:(datax一次读,多次写改造)