简介:DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。DataX采用了框架 + 插件 的模式,目前已开源,代码托管在github
地址:https://github.com/alibaba/DataX
一.DataX安装部署
1.下载压缩包:
下载页面地址:https://github.com/alibaba/DataX 在页面中【Quick Start】--->【Download DataX下载地址】进行下载。下载后的包名:datax.tar.gz。解压后{datax}目录下有{bin conf job lib log log_perf plugin script tmp}几个目录。
2.安装
将下载后的压缩包直接解压后可用,前提是对应的java及python环境满足要求。
JDK(1.6以上,推荐1.6)
Python(推荐Python2.6.X)一定要为python2,因为后面执行datax.py的时候,里面的python的print会执行不了,导致运行不成功,会提示你print语法要加括号,python2中加不加都行 python3中必须要加,否则报语法错
另外要注意, 不要解压到C:\Program Files目录下或其他名字带空格的目录下,因为在cmd执行时会因为路径有空格导致找不到程序主文件。
DataX支持绝大部分种类数据库的数据转移,其数据转移的主要流程有三步:Reader -->transform-->writer
reader 从数据库读取需要转移的数据;
transform 在数据同步、传输过程中,存在用户对于数据传输进行特殊定制化的需求场景,包括裁剪列、转换列等工作,这些工作在这里进行;
writer 将读取并处理后的数据写入目标数据库;
二.使用示例
DataX是通过读取配置文件进行数据转移,配置文件为json格式
注:可查看模版 https://github.com/alibaba/DataX/blob/master/userGuid.md
2.1 mysql_hive
#执行方式 python datax.py ./hive_mysql.json
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
},
"content": [{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "mysql_user",
"password": "mysql_passwd",
"column": "*",
"connection": [{
"jdbcUrl": "jdbc:mysql://xx-xx-xx:3306/database_name?useUnicode=true&characterEncoding=utf-8",
"table": ["table_name"]
}]
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"path": "/home/hive/warehouse/database_name.db/table_name/*",
"defaultFS": "hdfs://hadoop1:8020",
"column": "*",
"fileType": "orc",
"encoding": "UTF-8",
"fieldDelimiter": ",",
"fileName": "table_name",
"writeMode": "append"
}
}
}]
}
}
}
2.2 获取hive表 字段类型格式
#!/usr/bin/env /python
# -*- coding:utf-8 -*-
# Author:dyf
import json
import os
from optparse import OptionParser
'''
使用方式
python datax_table.py --ttable database_name.table_name
'''
def parse_params():
parser = OptionParser()
parser.add_option('--columns', dest="columns", default='')
parser.add_option('--preSql', dest="preSql", default='')
parser.add_option('--connect', dest="jdbc_url", default='')
parser.add_option('--username', dest="user", default='')
parser.add_option('--password', dest="password", default='')
parser.add_option('--stable', dest="stable", default='')
parser.add_option('--ttable', dest="ttable", default='')
parser.add_option('--query', dest="query", default='')
(options, args) = parser.parse_args()
return options
sysarg = parse_params()
cols = []
print "hive -e 'desc {} '".format(sysarg.ttable)
desc_tbl = os.popen("hive -e 'desc {} '".format(sysarg.ttable)).read()
print desc_tbl
columns = []
index = 0
hcols =[]
for desc_col in desc_tbl.split("\n"):
if len(desc_col.strip())>0 :
col = {}
col["index"] = "" + str(index)
col["type"] = "string"
cols.append(col)
columns.append(desc_col.split("\t")[0].strip())
hcol = {}
hcol["name"] = desc_col.split("\t")[0].strip()
type = desc_col.split("\t")[1].strip()
type = 'DOUBLE' if 'decimal' in type.lower() else type
type = 'INT' if 'tinyint' in type.lower() else type
hcol["type"] = type
hcols.append(hcol)
index = index + 1
print json.dumps(hcols, sort_keys=True, indent=2)
#print hcols
print "----"*5