数据同步之DataX
目前业务中需要进行数据同步, 考虑使用datax数据同步方式替换掉现有的同步方式
业务场景:
即将业务中每天生成的日志表中的数据部分字段同步到自己的库中,进行后台数据的查询
起因:
之前“大神”写的逻辑中使用每三分钟更新一次的策略进行数据同步,在redis中进行计数和打标记的方式进行数据的增量同步,但是最近发现经常数据会发生丢失的问题,于是进行问题的修复
解决:
了解到运营对于这些数据的查询实时性并没有这么高,今天查询昨天的数据这种场景比较多,于是打算使用datax凌晨同步昨天的数据到本地即可,节省资源,减少调用业务的数据库频次
DataX: https://github.com/alibaba/DataX
基于java的同步开源项目,基本使用起来较为容易,简单配置即可,完成之后 3万多的数据 只需要不到10秒中就完成了数据同步工作
数据库-mysql相关的reader和writer相关配置参考:
- https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md
- https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
当然他还支持很多的数据库
安装)
1)下载源码包
wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
基于java, 保证已经安装了Java,推荐8版本,安装方式,可见本博客,
cd /usr/local/src/ wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.gz
tar -zxvf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201 /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=${JAVA_HOME}/bin:${PATH} source /etc/profile
java -version 查看版本
2)解压datax
tar -zxvf datax.tar.gz 执行一个demo
python datax/bin/datax.py datax/job/job.json 注意:这里使用的是python2 版本
2)示例
1.MySQL同步到MySQL
{
"job": {
"setting": {
"speed": {
"byte":10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"connection": [
{
"querySql": [
"select player_id,UNIX_TIMESTAMP(create_time) AS create_time from t_player_log__20210422"
],
"jdbcUrl": [
"jdbc:mysql://127.0.0.1:3306/demo"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password":"123456",
"column": [
"player_id",
"create_time"
],
"session": [
"set names utf8mb4"
],
"connection": [
{
"encoding": "UTF-8",
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/test",
"table": [
"tt_player_log"
]
}
]
}
}
}
]
}
}
还支持传入参数的方式动态的配置(python bin/datax.py 支持的参数:-p),例如:
{
"job": {
"setting": {
"speed": {
"byte":10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "${username}",
"password": "${password}",
"connection": [
{
"querySql": [
"select player_id,UNIX_TIMESTAMP(create_time) AS create_time from t_player_log__${dateNum}"
],
"jdbcUrl": [
"jdbc:mysql://${ip}:${port}/${db}"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password":"123456",
"column": [
"player_id",
"create_time"
],
"session": [
"set names utf8mb4"
],
"connection": [
{
"encoding": "UTF-8",
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/test",
"table": [
"${table}"
]
}
]
}
}
}
]
}
}
同步命令:
/bin/python /opt/datax/bin/datax.py /opt/datax/job/game_job.json -p"-Dusername=xxxx -Dpassword=xxx -Dip=xx.xx.xx.xx -Dport=3306 -Ddb=xx -Dtable=xx -DdateNum=20210423"
注意:如果密码中有特殊字符,需要使用单引号将其引起来
相关的job任务会放到job目录下, 新建一个shell脚本放到script下, run_jobs.sh,将相关数据库连接配置到一个数据表中, 添加上定时任务即可
#!/bin/bash #说明:
# 执行同步游戏库玩家日志表数据 day_num=`date -d "-1 day" +%Y%m%d`
#day_num=`date +%Y%m%d` main(){
mysql -hxx.xx.xx -Pxx -uxx -pxx -N -e "select game_name,app_id,ip,port,username,password,db_name,player_log_table from t
xx.tt_game_db where type=2 and status=1" | while read game_name app_id ip port username password db_name player_log_table
do
echo "当前游戏:$game_name[$app_id] 数据库信息:$username:$password@$ip:$port/$db_name 目标表:$player_log_table"
#echo "-Dusername=$username -Dpassword=$password -Dip=$ip -Dport=$port -Ddb=$db_name -Dtable=$player_log_table -DdateNum=$day_num"
/bin/python /opt/datax/bin/datax.py /opt/datax/job/game_job.json -p"-Dusername=$username -Dpassword=$password -Dip=$ip -Dport=$port -Ddb=
$db_name -Dtable=$player_log_table -DdateNum=$day_num" done
} main
2)MongoDB同步到MySQL
{
"job": {
"setting": {
"speed": {
"channel": 2
}
},
"content": [
{
"reader": {
"name": "mongodbreader",
"parameter": {
"address": ["127.0.0.1:27017"],
"userName": "dataxUser1",
"userPassword": "xxxxx",
"dbName": "log_1",
"collectionName": "20210101",
"column": [
{
"name": "uid",
"type": "int"
},
{
"name": "match_id",
"type": "string"
}
],
"query": { // 添加筛选条件
"func_name":"play",
"play_type": {
"$in": [2,3]
}
}
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "gameUser",
"password": "xxxxx",
"column": [
"player_index",
"table_id"
],
"session": [
"set names utf8mb4"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/game_log",
"table": [
"game_record_log"
]
}
]
}
}
}
]
}
}
注意点: 这里的MongoDB的用户名和密码 要开一个这个库的所属人的权限
db.createUser({user:"dataxUser1",pwd:"xxxx",roles:[{role:"dbOwner", db:"log_1"}]})
后面为了通用, 需要将这里配置的MongoDB的信息和MySQL的信息都通过变量的方式传递进来
在script目录下添加shell执行脚本,例如:run_jobs_for_mongo2mysql.sh
#!/bin/bash
## 传入开始和结束时间将MongoDB(10十个库)中每个库指定日期范围内的数据同步到MySQL
begin_date=$1
end_date=$2
begin_time=$begin_date mongo_user_prefix="dataxUser"
mongo_pwd=xxxx
mongo_db_name_prefix="log_"
mongo_table_name_prefix="game_" mysql_user="mysqlUser"
mysql_pwd="xxx"
mysql_host="127.0.0.1"
mysql_port=3306
mysql_db_name="game_log"
mysql_table_name="game_record_log" main(){
for n in $(seq 1 10)
do
while [ "$begin_date" != "$end_date" ]
do
echo $begin_date
mongo_user=$mongo_user_prefix$n
mongo_db_name=$mongo_db_name_prefix$n
mongo_table_name=$mongo_table_name_prefix$begin_date
echo "-Dmongo_user=$mongo_user -Dmongo_pwd=$mongo_pwd -Dmongo_db_name=$mongo_db_name -Dmongo_table_name=$mongo_table_name -Dmysql_user=$mysql_user -Dmysql_pwd=$mysql_pwd -Dmysql_host=$mysql_host -Dmysql_port=$mysql_port -Dmysql_db_name=$mysql_db_name -Dmysql_table_name=$mysql_table_name"
/bin/python /opt/data/datax/bin/datax.py /opt/data/datax/job/game_mongo2mysql_job.json -p"-Dmongo_user=$mongo_user -Dmongo_pwd=$mongo_pwd -Dmongo_db_name=$mongo_db_name -Dmongo_table_name=$mongo_table_name -Dmysql_user=$mysql_user -Dmysql_pwd='$mysql_pwd' -Dmysql_host=$mysql_host -Dmysql_port=$mysql_port -Dmysql_db_name=$mysql_db_name -Dmysql_table_name=$mysql_table_name"
let begin_date=`date -d "-1 days ago ${begin_date}" +%Y%m%d`
done
begin_date=$begin_time
echo $end_date
done
}
main
常见问题:
1.如果数据表中有特殊表情的时候, 可能会出现字符错误的报错信息, 这个时候需要进行设置
"session": [
"set names utf8mb4"
],
更多同步工具:
- canal
- CloudCanal(https://www.clougence.com/)
数据同步之DataX的更多相关文章
- 环境篇:数据同步工具DataX
环境篇:数据同步工具DataX 1 概述 https://github.com/alibaba/DataX DataX是什么? DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 ...
- 比Sqoop功能更加强大开源数据同步工具DataX实战
@ 目录 概述 定义 与Sqoop对比 框架设计 支持插件 核心架构 核心优势 部署 基础环境 安装 从stream读取数据并打印到控制台 读取MySQL写入HDFS 读取HDFS写入MySQL 执行 ...
- 数据同步DataX
数据同步那些事儿(优化过程分享) 简介 很久之前就想写这篇文章了,主要是介绍一下我做数据同步的过程中遇到的一些有意思的内容,和提升效率的过程. 当前在数据处理的过程中,数据同步如同血液一般充满全过 ...
- Spark记录-阿里巴巴开源工具DataX数据同步工具使用
1.官网下载 下载地址:https://github.com/alibaba/DataX DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlSe ...
- 基于datax的数据同步平台
一.需求 由于公司各个部门对业务数据的需求,比如进行数据分析.报表展示等等,且公司没有相应的系统.数据仓库满足这些需求,最原始的办法就是把数据提取出来生成excel表发给各个部门,这个功能已经由脚本转 ...
- 数据同步工具Sqoop和DataX
在日常大数据生产环境中,经常会有集群数据集和关系型数据库互相转换的需求,在需求选择的初期解决问题的方法----数据同步工具就应运而生了.此次我们选择两款生产环境常用的数据同步工具进行讨论 Sqoop ...
- 数据同步Datax与Datax_web的部署以及使用说明
一.DataX3.0概述 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳定高 ...
- 执行 dataX 数据同步命令
:: 执行 dataX 数据同步命令 @echo off set day_interval=7@echo =========开始执行dataX数据同步========= @echo 时间周期为最近%d ...
- 淘宝异构数据源数据交换工具 DataX
淘宝异构数据源数据交换工具 DataX 阅读目录 DataX是什么? DataX用来解决什么? DataX特点? DataX结构模式(框架+插件) DataX在淘宝的运用 DataX是什么? Data ...
- 大数据 --> 淘宝异构数据源数据交换工具 DataX
淘宝异构数据源数据交换工具 DataX DataX是什么? DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesys ...
随机推荐
- in notin exists not exists 性能优化算法总结
in notin exists not exists 性能优化算法总结 1.1. in 和 exists 区别 1.2. not in 能不能走索引 1.3. not in 和 join 的关系 1. ...
- 深度学习环境安装-conda-torch-Jupyter Notebook
conda的安装 为什么要安装这个,它是什么? 它是一个管理环境的,当我们跑项目的时候,往往这些项目所需要的pickets库和环境是不同的,这时候如果自己的电脑里面只有一个版本的库的话,就运行不了,比 ...
- svg之viewbox缩放
先看个示例 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...
- 全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
全网最适合入门的面向对象编程教程:56 Python 字符串与序列化-正则表达式和 re 模块应用 摘要: Python 的 re 模块提供了强大的正则表达式操作功能,用于在字符串中搜索.匹配.替换等 ...
- springboot起步依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- eBPF 概述:第 4 部分:在嵌入式系统运行
1. 前言 在本系列的第 1 部分和第 2 部分,我们介绍了 eBPF 虚拟机内部工作原理,在第 3 部分我们研究了基于底层虚拟机机制之上开发和使用 eBPF 程序的主流方式. 在这一部分中,我们将从 ...
- 对于python中GIL的一些理解与代码实现
近期看了一些关于GIL的一些内容,敲一下代码看看效果. # coding:utf-8 # GIL(Global Interpreter Lock):他只允许任何时刻只有一个线程处于执行状态,即使是在具 ...
- Java日期时间API系列36-----Jdk8中java.time包中的新的日期时间API类应用,使用LocalTime计算十二时辰。
十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰.二十四小时和十二时辰对照表: 时辰 时间 24时制 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 : ...
- fatal: couldn't find remote ref XXX解决
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 云原生周刊:Kubernetes v1.30 发布 | 2024.4.22
开源项目推荐 pv-migrate pv-migrate 是一个 CLI 工具/kubectl 插件,可轻松将一个 Kubernetes 的内容迁移 PersistentVolumeClaim 到另一 ...