常用数据抽取工具:kattle sqoop datax streamsets
streamsets kattle:偏向etl,数据会做处理
sqoop datax:偏向数据同步,数据不做处理直接拿
streamsets主要是对一些数据做ETL处理,如果单纯做数据同步的话用阿里的datax速度更快,效率更高
datax的详细教程可以去官网看 https://github.com/alibaba/DataX
在我这里可以重点参考一下第3点,生产中的shell脚本配置
异构数据源离线同步工具
这是一个单机多任务的ETL工具(单机多线程)
框架设计
DataX采用Framework + plugin架构构建
数据源 ===> ReadPlugin -> FrameWork -> WritePlugin ===> 目的端
Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
Writer: Writer为数据写入模块,负责不断的从Framework取数据,并将数据写入到目的端。
Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
"speed": {
"channel": 8, ----并发数限速(根据自己CPU合理控制并发数)
"byte": 524288, ----字节流限速(根据自己的磁盘和网络合理控制字节数)
"record": 10000 ----记录流限速(根据数据合理空行数)
reader过程url有[],writer过程没有[]
可以通过命令查看配置模板: python datax.py -r {YOUR_READER} -w {YOUR_WRITER}
不支持目的端自动建表,此处预先建立目的表
channle=2,使用streamwriter打印的时候会打印两遍内容。
但是如果是别的writer,比如hdfswriter,mysqlwriter,它只是启动两个并发任务,内容只有一次,不会重复两遍。
当用户配置querySql时,SqlServerReader直接忽略table、column、where条件的配置
===============================
栗子:读取sqlserver写入hdfs (再将hdfs数据加载到hive表)
总任务执行脚本execute.sh
sh execute.sh table_name start_time end_time
一共可以传三个参数
table_name:你要执行同步的表名,多个表用逗号分隔开(比如"table1,table2")
start_time,end_time:同步数据的时间段,这个时间段在每张表的where条件里面用时间戳字段来过滤
如果你提前确定了表名就可以在脚本里面配好,时间段默认是前一天。这样就不用传参数了直接执行脚本: sh execute.sh (记得要提前在hive里面建好对应表,导完数据会load进hive表)
#!/bin/bash
source /etc/profile
#数据库连接信息
connstr="jdbc:sqlserver://11.99.99.99:1433;DatabaseName=databs"
username="root"
password="123456"
#源数据库表
#名获取开始和结束的日期
if [ $# -gt 1 ]
then
table_name=$1
start_time=$2
end_time=$3
else
table_name="table1,table2,table3,table4"
start_time=`date -d "-1 day" +%Y-%m-%d`
end_time=`date +%Y-%m-%d`
fi
#hdfs地址信息
defaultFS="hdfs://cdh03:8020"
#datax导入文件后的存储格式
fileType="text"
#写入hdfs的模式
writeMode="append"
#文件数据分隔符
separator='\t'
#hive库
database="ods_data_all"
array=(${table_name//,/ })
for var in ${array[@]}
do
#datax数据导入目录
datadir="/data/datax/databs/${var}/${start_time}/"
#datax数据导入存储的文件名
fileName='$start_time'
#创建数据导入目录命令
hdfs dfs -mkdir -p $datadir
#运行datax的命令
python /opt/datax/bin/datax.py -p "-Dconnstr='$connstr' -Dusername='$username' -Dpassword='$password' -Dtable_name='$var' -Dstart_time='$start_time' -Dend_time='$end_time' -DdefaultFS='$defaultFS' -DfileType='$fileType' -Ddatadir='$datadir' -DfileName='$fileName' -DwriteMode='$writeMode' -Dseparator='$separator'" --jvm="-Xms1G -Xmx1G" /opt/datax/job/${var}.json
#将数据加载进hive表
hive -e "use ${database};load data inpath '${defaultFS}/${datadir}/*' into table ods_${var}_all;"
done
单个表的json配置文件:
table1.json
{
"job": {
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"connection": [
{
"jdbcUrl": ["$connstr"],
"querySql": ["select * from $table_name where creationtime >= '${start_time}' and creationtime < '${end_time}'"]
}
],
"password": "$password",
"username": "$username"
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [
{"name": "Id","type": "bigint"},
{"name": "PkId","type": "int"},
{"name": "Barcode","type": "String"},
{"name": "ClassId","type": "int"},
{"name": "Qty","type": "int"},
{"name": "TerminalId","type": "int"},
{"name": "Remark","type": "String"},
{"name": "CreationTime","type": "TIMESTAMP"},
{"name": "SaleClassId","type": "int"}
],
"defaultFS": "$defaultFS",
"fieldDelimiter": "$separator",
"fileName": "$fileName",
"fileType": "$fileType",
"path": "$datadir",
"writeMode": "$writeMode"
}
}
}
],
"setting": {
"speed": {
"channel": "3",
"batchSize":2048
},
"errorLimit":{
"percentage":0.02,
"record":0
}
}
}
}
自己再建一下其他表的json配置文件,主要每张表的字段不一样,其余配置都差不多。