最近新入职某银行,负责数据智能平台方向,用到了Hadoop相关的技术栈,我之前自学过相关的技术,这次也是派上了用场,但之前没有系统的整理出相关的文章,此次在掘金会将技术系统的整理成文档,记录与分享。
Datax简介
DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
以上内容和图片摘自datax的github托管地址。里面内容介绍还是非常丰富,这里不再复述。 传送门 Dataxgithub托管地址 个人使用Datax的感觉是上手简单易用,不需要学习复杂的Api,简单使用不需要了解底层机制。真的是太方便了。而datax在网上已经有很多教程,本文主要结合自身使用经验以及踩过的坑与大家分享。
windows下的安装使用
图中可以看到,Datax的开发语言包括Java、Python、Shell,因此要运行Datax需要Java与Python的运行环境。
- jdk安装 这个网上的教程太多了,不再复述。 cmd执行java -version 出现版本提示即表示安装完成
- python安装 python安装教程 cmd执行python --version 出现版本提示即表示安装完成
- datax安装 datax是免安装,直接下载解压即可。 github地址 嫌github慢的同学可以使用码云的托管地址。 码云地址
确保JDK、Python都安装完成后,解压datax到指定目录。我本机的解压位置是:D:\安装\datax 打开cmd,进入datax解压目录下的bin目录。
bin目录下的datax.py是datax执行任务的入口。
job目录下是用来保存需要执行的job,job以json格式保存,默认有一个名为job.json的文件,可以直接执行。
输入命令:python datax.py ./../job/job.json
正常情况会出现很多提示,没有异常就表示执行成功。
发现中文出现乱码,简单,执行CHCP查看当前活动页编码。
936表示的是DBK的编码
执行CHCP 65001命令即可。 CHCP是计算机的一个指令,可以指定代码页编码,而65001代表UTF-8。
再次执行job.json,没有再出现乱码,至此,Datax搭建完成。
Datax的使用
Datax的运行关键在于对job的编写,我们可以查看job.json一探Datax的魔力。
{
"job": {
"setting": {
"speed": {
"byte":10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column" : [
{
"value": "DataX",
"type": "string"
},
{
"value": 19890604,
"type": "long"
},
{
"value": "1989-06-04 00:00:00",
"type": "date"
},
{
"value": true,
"type": "bool"
},
{
"value": "test",
"type": "bytes"
}
],
"sliceRecordCount": 100000
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": false,
"encoding": "UTF-8"
}
}
}
]
}
}
可以看到,整个json格式文件以job起手,内含setting和content两大战将。每个字段的含义本文暂不讲解,其核心机制我目前也不是特别明白,网上也没找到很好的资料,后期可能会深入源码了解更多运行机制后专门写一个更有深度的博文。 Datax支持的读写类型很多,常用的MySQL、Oracle、Hive、Hbase、HDFS等都支持。本文以MySQL数据导入MySQL作为示例,数据源在json文件中用reader配置读取,写入的数据用writer表示。 在本地MySQL数据库form并创建表mysql_to_mysql作为数据源,随便插入几条数据
在本地MySQL新建target数据库并新建mysql_target表,如下。
在datax的job目录下创建mysql2mysql.json文件,内如如下。
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 10000,
"percentage": 1.0
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"column": [
"name",
"age"
],
"splitPk": "id",
"connection": [
{
"table": [
"mysql_to_mysql"
],
"jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/from?useUnicode=true&characterEncoding=utf-8"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password": "root",
"column": [
"name",
"age"
],
"preSql": [
"delete from mysql_target"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/target?useUnicode=true&characterEncoding=utf-8",
"table": [
"mysql_target"
]
}
]
}
}
}
]
}
}
执行命令: python datax.py ./../job/mysql2mysql.json
成功执行,查看target中的数据
至此,导入完成!