datax介绍及生产脚本配置

常用数据抽取工具:kattle sqoop datax streamsets

streamsets kattle:偏向etl,数据会做处理
sqoop datax:偏向数据同步,数据不做处理直接拿

streamsets主要是对一些数据做ETL处理,如果单纯做数据同步的话用阿里的datax速度更快,效率更高

datax的详细教程可以去官网看 https://github.com/alibaba/DataX

在我这里可以重点参考一下第3点,生产中的shell脚本配置

1.datax介绍

异构数据源离线同步工具
这是一个单机多任务的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  ----记录流限速(根据数据合理空行数)

2.编写json任务时注意点:

  • reader过程url有[],writer过程没有[]

  • 可以通过命令查看配置模板: python datax.py -r {YOUR_READER} -w {YOUR_WRITER}

  • 不支持目的端自动建表,此处预先建立目的表

  • channle=2,使用streamwriter打印的时候会打印两遍内容。
    但是如果是别的writer,比如hdfswriter,mysqlwriter,它只是启动两个并发任务,内容只有一次,不会重复两遍。

  • 当用户配置querySql时,SqlServerReader直接忽略table、column、where条件的配置

===============================

3.生产环境shell脚本配置

栗子:读取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配置文件,主要每张表的字段不一样,其余配置都差不多。

你可能感兴趣的:(大数据,datax,脚本配置,数据同步)