1.如何更改 datax 以支持hive 的同同步 DECIMAL 数据类型?
2.DataX安装部署
3.工具Datax的基本概念(初识ETL工具)
4.如何评价datax的应用?
5.Datax二次开发支持增量更新
6.SeaTunnel连接器V1到V2的架构演进与探究
如何更改 datax 以支持hive 的 DECIMAL 数据类型?
在处理数据时,我们经常需要将数据从一种数据类型转换为另一种数据类型。步源在数据迁移任务中,码更如果涉及到使用datax进行数据迁移,数据且源数据或目标数据中出现了Hive的原理DECIMAL数据类型,那么如何确保数据迁移的同同步韩剧tvapp源码准确性和完整性就成为了一个关键问题。本文将详细介绍如何更改datax以支持Hive的步源DECIMAL数据类型。
在JAVA中,码更主要使用float/double和BigDecimal来存储小数。数据其中,原理float和double在不需要完全精确的同同步计算结果的场景下,可以提供较高的步源运算效率,但当涉及到金融等场景需要精确计算时,码更必须使用BigDecimal。数据
Hive支持多种数字类型数据,原理如FLOAT、DOUBLE、DECIMAL和NUMERIC。DECIMAL数据类型是后加入的,允许设置精度和标度,适用于需要高度精确计算的场景。
若要使datax支持Hive的DECIMAL数据类型,关键在于修改datax源码,增强其对DECIMAL数据的读取和写入能力。主要通过以下几个步骤:
1. **修改HDFS Reader**:在处理Hive ORC文件时,需要修改HDFS Reader插件中的相关类和方法,如DFSUtil#transportOneRecord。通过该步骤,确保能正确读取到ORC文件中的DECIMAL字段。datax的Double类型可以通过其内部的rawData字段存储数据的原始内容,支持Java.math.BigDecimal和Java.lang.Double,因此可以实现不修改HDFS Reader代码,直接读取并处理DECIMAL数据的目标。配置作业时,将Hive的DECIMAL字段指定为datax的Double类型,HDFS Reader在底层调用Hive相关API读取ORC文件中的DECIMAL字段,将其隐式转换为Double类型。datax的Double类型支持Java.math.BigDecimal和Java.lang.Double,确保后续写入操作的精度。
2. **修改HDFS Writer**:为了支持写入数据到Hive ORC文件中的shell收信箱子源码DECIMAL字段,同样需要在HDFS Writer插件中进行相应的代码修改。修改后的代码确保能够将datax的Double字段正确写入到Hive ORC文件中的DECIMAL字段。使用方法com.alibaba.datax.common.element.DoubleColumn#asBigDecimal,基于DoubleColumn底层rawData存储的原始数据内容,将字段值转换为合适的外部数据类型。这一过程不会损失数据精度。
综上所述,通过修改datax的HDFS Reader和Writer插件,实现对Hive DECIMAL数据类型的读取和写入支持,确保数据迁移过程的准确性和完整性,从而满足复杂数据迁移场景的需求。
DataX安装部署
DataX安装部署涉及文档查阅、工具包下载、解压目录选择、编译源码、创建配置文件、启动DataX等步骤。首先,访问DataX的用户指南文档,获取安装部署的具体信息。文档地址位于 DataX/userGuid.md at master · alibaba/DataX。部署前需满足相关需求。
选择合适的下载地址获取DataX工具包,直接下载后解压至本地,进入bin目录即可运行同步作业。或下载源码并自行编译。编译步骤包括下载源码、使用maven进行打包。打包成功后,日志会显示DataX包位于指定路径,通常位于 { DataX_source_code_home}/target/datax/,并呈现特定目录结构。
配置文件创建是关键步骤,文件应采用json格式。使用命令查看配置模板,根据模板内容,手工或借助工具生成所需的json配置文件,确保内容完整、准确。图集交易网站源码
启动DataX前,确保所有依赖环境已经准备就绪。启动DataX后,系统将按照配置文件执行同步作业,同步过程的详细日志记录在控制台输出中。注意查看日志,及时发现并解决问题,以确保数据同步过程顺利无误。
在实际部署过程中,可能会遇到各种问题,如依赖缺失、配置文件错误、权限问题等。解决问题时,建议仔细检查文档、日志和配置文件,确保每一步操作准确无误。此外,定期更新DataX版本,以获得最新的功能和修复已知问题,提高数据同步的稳定性与效率。
工具Datax的基本概念(初识ETL工具)
ETL技术的实质是将数据经过抽取、清洗转换之后加载到数据仓库的过程。DataX是由阿里巴巴研发并开源的异构数据源离线同步工具,能实现不同数据源之间的数据同步,包括关系型数据库、NoSQL数据存储、无结构化数据存储、时间序列数据库以及阿里的云数仓数据存储。DataX是阿里云DataWorks数据集成的开源版本,用于在阿里巴巴集团内广泛使用的离线数据同步工具/平台,支持包括MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、手机昵图网源码HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS等各种异构数据源之间的高效数据同步。
DataX采用Framework + plugin的架构,数据同步步骤将数据的读取、写入操作抽象为由Reader/Writer插件处理,纳入整个同步框架。其核心组件包括Job、Task、Channel以及Transformer。
Job代表数据同步任务;Task代表运行一个单独的同步线程,该线程使用一个Channel作为Reader与Writer的数据传输媒介;数据流转方向为Reader—>Channel—>Writer。
Transformer模式提供强大的数据转换功能,DataX内置丰富数据转换实现类,用户可根据自身需求扩展数据转换。
DataX的安装部署可选择直接下载工具包或下载源码自主编译。下载后解压至本地目录即可运行同步作业。自检脚本为:python { YOUR_DATAX_HOME}/bin/datax.py { YOUR_DATAX_HOME}/job/job.json。
若数据源同步遇到格式不匹配问题,可以修改相应的reader与writer代码,然后maven编译,后续会提供具体源码修改示例。
DataX的源码可在gitee上找到,以解决github地址在国内可能存在的连接问题。参考网址提供了更多关于ETL工具-Datax的资源。
如何评价datax的应用?
为了改进datax任务进度信息展示方式,我们计划对源码进行改造,将实时任务进度信息结构化存储在redis服务器中,让前端通过轮询实时从redis中获取进度信息,从而提供给用户更友好的体验。
在分析datax任务进度信息的打印逻辑时,我们发现这些信息首先被task group汇总收集,然后由job进一步汇总收集。因此,job能够收集并汇总所有任务的进度信息。
进一步探究,我们了解到JobContainer依赖的php财务软件源码Scheduler会周期性打印job收集汇总的进度信息。具体实现可见于源码中的com.alibaba.datax.core.job.scheduler.AbstractScheduler#schedule函数,以及com.alibaba.datax.core.statistics.container.communicator.job.StandAloneJobContainerCommunicator#report函数。
了解了datax的hook机制后,我们能够设计实现从datax实时获取并持久化进度信息至redis的功能。关键在于,我们可以在打印进度信息的时机触发invokeHook方法,通过配置信息和进度信息作为参数,调用自定义实现的Hook类的invoke方法。具体地,我们设计了一个名为RedisReportHook的自定义Hook类,用于将进度信息持久化至redis。
Datax二次开发支持增量更新
Datax的二次开发支持增量更新功能,这对于处理Oracle和Mysql之间的数据同步特别重要。原版的OracleWriter和MysqlWriter并不支持writeMode配置,这在某些场景下可能会有所限制。 经过博主们的实践和探索,我们找到了一种有效的解决方法。首先,需要对Datax的源码进行定制,具体步骤如下:修改OracleWriter.java文件,移除原有的限制条件。
接着,对WriterUtil.java进行增强,添加Oracle数据插入时的类型转换处理,以确保数据的正确性。
另外,关注CommonRdbmsWriter部分,这里的配置实际上底层实现了Oracle的MERGE语句,这个特性使得增量更新得以实现。
通过这样的定制,Datax现在能够支持Oracle的数据增量更新,为数据同步任务提供了更大的灵活性和效率。SeaTunnel连接器V1到V2的架构演进与探究
核心概念
SeaTunnel设计的核心是利用设计模式中的控制翻转或依赖注入,主要包括以下两点:
数据处理过程大致分为输入 -> 转换 -> 输出,更复杂的数据处理实质上也是这些行为的组合。
内核原理
SeaTunnel将数据处理的各种行为抽象成Plugin,并使用SPI技术进行动态注册,设计思路保证了框架的灵活扩展。在以上理论基础上,数据的转换与处理还需要做统一的抽象,如著名的异构数据源同步工具DataX,也对数据单条记录做了统一抽象。
SeaTunnel V1架构体系中,由于背靠Spark和Flink两大分布式计算框架,框架已经为我们做好了数据源抽象的工作,Flink的DataStream、Spark的DataFrame已经是对接入数据源的高度抽象。在此基础上,我们只需要在插件中处理这些数据抽象即可。同时,借助Flink和Spark提供的SQL接口,还可以将每次处理完的数据注册成表,方便用SQL进行处理,减少代码的开发量。
实际上,SeaTunnel的最终目的是自动生成一个Spark或Flink作业,并提交到集群中运行。
SeaTunnel连接器V1 API解析架构概览
目前在项目dev分支下,SeaTunnel连接器V1 API所在的模块如图所示:
seatunnel-api-base
在基础模块中,有以下代码:
为了更清晰地理解这些类之间的关系,笔者制作了一张简单的UML类图:
整个API的组成可以大体分为三部分:构建层接收命令参数构建执行器,执行器初始化上下文,上下文注册插件并启动插件,至此,整个作业开始运行。
seatunnel-api-spark
在Spark引擎API层有以下代码:
同样,笔者整理了一张UML类图来表示它们之间的关系:
整个流程与Base模块一致,在此不再赘述,有兴趣的读者可以自行查看源码。
seatunnel-api-flink
在Flink引擎API层有以下代码:
同样,笔者整理了一张UML类图来表示它们之间的关系:
整个流程与Base模块一致,在此不再赘述,有兴趣的读者可以自行查看源码。
SeaTunnel连接器V1运行原理启动器模块概览
整个项目的最外层启动类都放在以下模块中:
与连接器V1有关的模块如下:
执行流程
为了更好地理解SeaTunnel V1的启动流程,笔者制作了一张简单的时序图:
程序最外层的启动由start-seatunnel-${ engine}.sh开始,用户将配置文件从脚本传入,脚本调用org.apache.seatunnel.core.spark.SparkStarter或org.apache.seatunnel.core.flink.FlinkStarter。实际上,这个类只做一个工作:将所有参数拼接成spark-submit或flink命令,然后脚本接收spark-submit或flink命令并提交到集群中。提交到集群中真正执行job的类实际上是org.apache.seatunnel.spark.SeatunnelSpark或org.apache.seatunnel.flink.SeatunnelFlink。读者如果想直接深入了解作业启动核心流程的话,推荐阅读这两个类的源码。
执行原理SparkFlinkSeaTunnel连接器V2 API解析架构概览
目前在项目dev分支下,SeaTunnel连接器V2 API所在的模块如图所示:
数据抽象
SeaTunnel连接器V2 API在数据层面做了抽象,定义了自己的数据类型,这是与连接器V1最大的不同点。连接器V1使用的是引擎数据抽象的能力,但连接器V2自己提供了这个异构数据源统一的能力。
在所有的Source连接器和Sink连接器中,处理的都是SeaTunnelRow类型数据,同时SeaTunnel也对内设置了数据类型规范。所有通过Source接入进来的数据会被对应的连接器转化为SeaTunnelRow送到下游。
API Common
在API common包下有以下接口的定义:
在这里,由于篇幅关系,只介绍比较核心的几个接口:
具体接口中有哪些方法,读者可以自行阅读对应类的源码,在此不再赘述。
API Source
在API source包下有以下接口的定义:
在这里,由于篇幅关系,只介绍比较核心的几个接口:
API Sink
在API sink包下有以下接口的定义:
在这里,由于篇幅关系,只介绍比较核心的几个接口:
小结
连接器V2在架构分层上与计算引擎进行解耦,定义了自己的元数据定义以及数据类型定义,在API层和计算引擎层增加了翻译层,将SeaTunnel自定义的数据源通过翻译层接入到引擎中,从而真正实现接口和引擎分离的目的。
SeaTunnel连接器V2运行原理启动器模块概览
整个项目的最外层启动类都放在以下模块中:
与连接器V2有关的模块如下:
执行流程
为了更好地理解SeaTunnel V2的启动流程,笔者制作了一张简单的时序图:
程序最外层的启动由start-seatunnel-${ engine}-new-connector.sh开始,用户根据将配置文件从脚本传入,脚本调用org.apache.seatunnel.core.spark.SparkStarter或org.apache.seatunnel.core.flink.FlinkStarter。实际上,这个类只做一个工作:将所有参数拼接成spark-submit或flink命令,然后脚本接收spark-submit或flink命令并提交到集群中。提交到集群中真正执行job的类实际上是org.apache.seatunnel.spark.SeatunnelSpark或org.apache.seatunnel.flink.SeatunnelFlink。读者如果想直接深入了解作业启动核心流程的话,推荐阅读这两个类的源码,连接器V2和连接器V1的启动流程基本一致。
SeaTunnel V2 on Spark
SeaTunnel Source连接器V2将异构数据源接入,生成以SeaTunnelRow为基本单位的数据源,在翻译层实现了Spark DataSource API V2,翻译层使得Spark可以接入以SeaTunnelRow为基本单位的数据源,从而实现无缝接入Spark的目的。
关于Spark DataSource API V2的详细信息,读者可以参考:/session/apache-spark-data-source-v2。由于这篇文章的主题并不是介绍Spark的特性,所以在此不再赘述。
SeaTunnel V2 on Flink
SeaTunnel Source连接器V2将异构数据源接入,生成以SeaTunnelRow为基本单位的数据源,同时在翻译层实现了Flink source function和Flink sink function。翻译层使得Flink可以接入以SeaTunnelRow为基本单位的数据源,从而实现无缝接入Flink的目的。
关于Flink source Function和Flink sink function的详细信息,读者可以参考:https://nightlies.apache.org/flink/flink-docs-release-1./docs/dev/datastream/sources/#the-data-source-api。由于这篇文章的主题并不是介绍Flink的特性,所以在此不再赘述。
执行原理
Source连接器接入数据源为SeaTunnelRow,Translation层转换SeaTunnelRow数据源为各种计算引擎内部的数据源,Sink连接器接收计算引擎内部转换好的SeaTunnelRow数据源并写入到目标数据源中。
V1 API vs V2 API未来展望
目前社区正在做的事情:
未来目标:
最终目标:成功从Apache孵化器毕业,成为世界一流的诞生于中国的数据集成平台工具
贡献者招募
目前社区正在蓬勃向前发展,大量feature需要去开发实现,毕业之路道阻且艰,期待更多的有志之士参与到社区共建,欢迎热爱开源的小伙伴加入SeaTunnel社区,有意者可发邮件至tyrantlucifer@apache.org或微信tyrantlucifer联系我咨询相关事宜,让我们一起用开源点燃璀璨的程序人生。
成数据集成任务 3. 更多调度平台无缝接入
最终目标:成功从Apache孵化器毕业,成为世界一流的诞生于中国的数据集成平台工具
贡献者招募
目前社区正在蓬勃向前发展,大量feature需要去开发实现,毕业之路道阻且艰,期待更多的有志之士参与到社区共建,欢迎热爱开源的小伙伴加入SeaTunnel社区,有意者可发邮件至tyrantlucifer@apache.org或微信tyrantlucifer联系我咨询相关事宜,让我们一起用开源点燃璀璨的程序人生。
大数据技术之Datax
分享大数据技术之Datax的使用与特性,旨在解决大数据生产环境中的数据同步需求。Datax是阿里巴巴开源的异构数据源离线同步工具,支持多种数据源之间的数据同步,包括关系型数据库、HDFS、Hive、ODPS、HBase、FTP等。
Datax的核心设计思路是将复杂的同步链路转变为星型数据链路,作为中间传输载体实现数据同步。采用Framework + plugin架构,将数据源读取和写入抽象为Reader/Writer插件,使得框架负责内部的序列化传输、缓冲、并发、转换等,而数据采集和落地核心操作则由插件执行。
Datax拥有全面的插件体系,支持主流数据库、NoSQL、大数据计算系统等,提供丰富的数据源参考指南。单个数据同步作业由Job模块管理,启动进程完成整个同步过程。Job模块负责数据清理、子任务切分、TaskGroup管理等,将单一作业拆分为多个Task并行执行。每个Task由TaskGroup启动,执行Reader-Channel-Writer线程完成同步任务。
Datax快速入门指南提供下载地址和源码地址,需满足前置要求并完成安装。类图展示了Datax的启动流程,包括解析配置、设置参数、启动Engine、初始化reader和writer插件、切分任务、执行任务等步骤。Datax-web是基于Datax开发的分布式数据同步工具,提供用户界面,简化任务配置,支持多种数据源,提供同步进度、日志查看及终止功能,并集成时间、增量同步功能。
Datax-web的搭建教程可在官网找到,如遇疑问可直接联系作者。Datax与Datax-web结合使用,能够实现大数据采集模块的自动化和高效同步,减少开发成本。
以上内容仅为Datax技术概览,更多深入细节和实践案例将在后续文章中分享。希望读者在大数据领域取得成就,收获满满。我是脚丫先生,期待与您下期再见。
DataX任务容器
DataX任务容器涉及的源码分析如下:
在DataX中,判断容器是否为job或taskGroup类型,这一步骤是通过容器执行源码实现的。DataX提供两种容器类:taskGroupContainer和jobContainer,它们都是抽象类AbstractContainer的实现。
抽象类AbstractContainer中定义了一个抽象方法start,这个方法在容器启动时被调用。
任务容器的执行流程如下:当任务容器被启动后,它会按照任务生命周期的每个阶段进行执行。这是单个数据任务的调度过程,通常依赖数据任务调度DAG实现。尽管开源的DataX调度功能较为基础。