DataX实战应用

2024-05-14 15:18
文章标签 实战 应用 datax

本文主要是介绍DataX实战应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

系统架构

关键实现

系统目前使用现状

DataX使用心得


前言

DataX是阿里开源数据同步工具,实现异构数据源的数据同步,Github地址:https://github.com/alibaba/DataX,企业存储离线数据到数仓,但是没办法对接业务,本次实践主要是运用DataX实现数据从数仓导入到MySQL,从而对接业务,另外,对数仓数据的流出进行管理。

一般从数仓数据导入到MySQL中,可以从hive查询存储到一个文件里面,如果是数据量比较大的情况下先将文件按一定行数切分为多个文件,然后遍历文件往MySQL中导入,这种方式虽然简单,缺点在于对于每一个导入需求,都需要写一个job,并且每次都会产生临时文件,mysql load会比较占用资源,之所以选择了DataX,因为它能实现hdfs导入MySQL,速度快,能实现增量全量,可以分表,能减少很多技术的实现成本。

系统架构

本次应用主要需实现一个Client和Server,依托于Hadoop集群,通过Schedule基础平台定时调度调用client实现数据的同步。Server是一个管理项目,后端使用Spring MVC工程,对接了元数据系统,直接从前端页面可以配置从Hive表导入到具体的MySQL表,client是一个jar包,通过HTTP和MQ和Server通信。

运行流程

1.Schedule通过java -jar client.jar启动client

2.client通过http接口调用到server,获取到本次要同步的一个job,通过job的信息生成一个json串,分配一个线程,client中通过python datax.py xxx.json调用DataX完成数据同步

3.client完成json文件的输出,输出到指定的文件夹下,文件名采用时间戳命名。

4. client中通过执行shell命令完成对DataX的调用

发布流程:

1.DataX部署,这里只使用到了mysqlwriter和hdfsreader组件,所以通过clone DataX源码,删除掉了其余不用的组件代码,手动编译进行部署,编译后大约占用200M空间,部署到hadoop集群的各个slave机器,正常情况下DataX只需要一次部署。

2.server发布,server通过jenkins发布为一个web工程,后端提供http接口,并监听MQ。

3.client发布,client通过jenkins发布到hadoop集群的slave机器。

关键实现

1.日志监控,schedule调起client任务一次对应的日志应该都要全部输出到schedule中,并且应该要捕捉到DataX的运行日志。关键代码:

//commond是运行DataX的命令:python datax/bin/datax.py xxx.json 
Process process = RUNTIME.exec(command);
try (BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()))) {String line;while ((line = input.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {LOG.error("读取DataX中job运行日志异常", e);
}

2.作业告警,采用了Schedule调度系统的告警,DataX导入失败会触发调度系统的告警,然后通过电话和邮件对负责人进行通知。

3.Hive分区表,hive中对单个表进行分区存储,一般按照日期进行分区,在schedule调起client时可以传入一个日期参数,然后根据日期生成一个日期分区,在hdfsreader中的分区中带入即可:

 "path": "/user/hive/warehouse/order/20180831","defaultFS": "hdfs://localhost:2181",

4.MySQL增量和全量,DataX很贴心,mysqlwriter可以选择导入的模式。

"writer":{"name": "mysqlwriter","parameter": {"writeMode": "insert",  // 写入模式可以选择insert/replace/update"username": "root","password": "root","column": ["id","name"],"session": ["set session sql_mode='ANSI'"],"preSql": ["delete from test" // 预执行SQL,可以选择一个delete语句],"connection": [{"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/datax?useUnicode=true&characterEncoding=gbk","table": ["test"]}]}
}

其中parameter中的writeMode可以选择insert,update,replace。并且有preSql选项,也就是在导入之前可以执行一些SQL,对我们全量数据和增量数据提供了有效的方案。

全量数据导入:通过preSql传入一条delete语句,然后writerMode选择insert执行导入(甚至如果有比较高的权限,可以直接用truncate语句,但是一般dba才有的这样权限),在delete的时候需要注意,如果数据量太大的情况下,一条delete就足以让dba找上门拉,所以添加索引就有必要拉,根据索引删除就会快一些。

增量数据导入:选择writeMode使用update,这里dataX是通过on duplicate key update语句来实现数据的增量实现,也就是说表里面有唯一键或者主键冲突时,覆盖原来的数据,这就很容易理解了,比如订单数据,订单号肯定是一个唯一键,如果导入一个已存在的订单,数据肯定会覆盖原来的数据。

5.为什么要用MQ,这里client在调用DataX执行完成之后,应该要通知到server,当前的任务执行完毕,server会更新当前任务的状态,对于简单检查任务的状态时,就不用去查看schedule中的日志了。

系统目前使用现状

1.稳定性强,系统上线2个月以来,有大约20个作业在运行,其中有5个小时运行的作业,从来没有出现过问题。

2.速度快,目前同步数据量最大的一个表大概是1.4亿的数据量,同步的时间在1100s左右,也就是18分钟到19分钟这样一个时间,每秒最高写入量达到14w+,平均每秒写入量大约在13w左右的速度,速度保持一个平均的趋势,下面是一个运行结果的截图

DataX使用心得

1.DataX是一个高可用的数据同步工具,稳定性强,速度快,上手快(不知道二次开发会不会困难,有机会可以试试,但是目前的功能已经能满足很大一部分需求)。

2.事务的支持不足,在github上看到的DataX支持的一个线程中的事务,在测试过程中没有体会到这种小事务能带来多大的收益,在有脏数据的情况下,如果当前线程的数据出现问题执行回滚,其实对于整体来说数据是不完整的,还是有一部分数据已经导入到MySQL 了,所以单个线程的事务其实对于数据量较大的数据来说收益不大,除非作业是通过一个线程来跑的。

但是,另一方面,如果在大量数据导入执行一个事务,对MySQL来说无疑是一个灾难,所以最好的办法是保证系统结构稳定。

这里其实有一个办法,如果是全量的数据,在job跑失败之后重新跑,能证数据的准确性,但是跑失败的那段时间数据是有缺失的;如果是增量数据导入,重新跑一下job也能保证数据没有问题。但是在那段小时间内还是有问题的。

确实是没有什么好的办法去支持完整的事务。

欢迎交流。

这篇关于DataX实战应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989099

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢