淘宝异构数据源数据交换工具 DataX
fmms
13年前
<h2 id="DataX是什么">DataX是什么?</h2> <p><br /> DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换,由淘宝数据平台部门完成。<br /> <br /> <img alt="异构数据源数据交换工具 DataX" src="https://simg.open-open.com/show/ec439b69375a4a66228f62d0ce347ea9.jpg" width="569" height="214" /> </p> <p><br /> </p> <h2 id="DataX用来解决什么">DataX用来解决什么?</h2> <p><br /> 目前成熟的数据导入导出工具比较多,但是一般都只能用于数据导入或者导出,并且只能支持一个或者几个特定类型的数据库。这样带来的一个问题是,如果我们拥 有很多不同类型的数据库/文件系统(Mysql/Oracle/Rac/Hive/Other…),并且经常需要在它们之间导入导出数据,那么我们可能需 要开发/维护/学习使用一批这样的工具(jdbcdump/dbloader/multithread/getmerge+sqlloader /mysqldumper…)。而且以后每增加一种库类型,我们需要的工具数目将线性增长。(当我们需要将mysql的数据导入oracle的时候,有没 有过想从jdbcdump和dbloader上各掰下来一半拼在一起到冲动?) 这些工具有些使用文件中转数据,有些使用管道,不同程度的为数据中转带来额外开销,效率差别很非常大。很多工具也无法满足ETL任务中常见的需求,比如日 期格式转化,特性字符的转化,编码转换。另外,有些时候,我们希望在一个很短的时间窗口内,将一份数据从一个数据库同时导出到多个不同类型的数据库。 DataX正是为了解决这些问题而生。<br /> <br /> <img alt="异构数据源数据交换工具 DataX" src="https://simg.open-open.com/show/991a9e2d80782c972e4e053ec560e410.jpg" width="557" height="391" /> </p> <blockquote> <p><strong>(问题: 新增第n+1个数据源,是不是要新开发n个数据同步工具 ?)</strong> </p> </blockquote> <p><br /> <br /> <br /> <img alt="异构数据源数据交换工具 DataX" src="https://simg.open-open.com/show/f3951ff67754acb8e53aca4974938066.jpg" width="461" height="369" /> <br /> <strong>我们只需要针对新增的数据源开发的一套Reader/Writer插件,即可实现任意数据的互导</strong> <br /> </p> <h2 id="DataX特点">DataX特点?</h2> <p></p> <ul> <li>在异构的数据库/文件系统之间高速交换数据</li> <li>采用Framework + plugin架构构建,Framework处理了缓冲,流控,并发,上下文加载等高速数据交换的大部分技术问题,提供了简单的接口与插件交互,插件仅需实现对数据处理系统的访问</li> <li>运行模式:stand-alone </li> <li>数据传输过程在单进程内完成,全内存操作,不读写磁盘,也没有IPC</li> <li>开放式的框架,开发者可以在极短的时间开发一个新插件以快速支持新的数据库/文件系统。(具体参见《DataX插件开发指南》)</li> </ul> <p><br /> </p> <h2 id="DataX结构模式框架插件">DataX结构模式(框架+插件)</h2> <p><br /> <br /> <img style="width:680px;height:292px;" alt="异构数据源数据交换工具 DataX" src="https://simg.open-open.com/show/977fbb4398c4d32fe67e4af41a074a4b.jpg" /> </p> <ul> <li>Job: 一道数据同步作业</li> <li>Splitter: 作业切分模块,将一个大任务与分解成多个可以并发的小任务.</li> <li>Sub-job: 数据同步作业切分后的小任务</li> <li>Reader(Loader): 数据读入模块,负责运行切分后的小任务,将数据从源头装载入DataX</li> <li>Storage: Reader和Writer通过Storage交换数据</li> <li>Writer(Dumper): 数据写出模块,负责将数据从DataX导入至目的数据地</li> </ul> <p><br /> DataX框架内部通过双缓冲队列、线程池封装等技术,集中处理了高速数据交换遇到的问题,提供简单的接口与插件交互,插件分为Reader和 Writer两类,基于框架提供的插件接口,可以十分便捷的开发出需要的插件。比如想要从oracle导出数据到mysql,那么需要做的就是开发出 OracleReader和MysqlWriter插件,装配到框架上即可。并且这样的插件一般情况下在其他数据交换场合是可以通用的。更大的惊喜是我们 已经开发了如下插件:</p> <p><br /> Reader插件</p> <ul> <li>hdfsreader : 支持从hdfs文件系统获取数据。</li> <li>mysqlreader: 支持从mysql数据库获取数据。</li> <li>sqlserverreader: 支持从sqlserver数据库获取数据。</li> <li>oraclereader : 支持从oracle数据库获取数据。</li> <li>streamreader: 支持从stream流获取数据(常用于测试)</li> <li>httpreader : 支持从http URL获取数据。</li> </ul> <p><br /> Writer插件</p> <ul> <li>hdfswriter:支持向hdbf写入数据。</li> <li>mysqlwriter:支持向mysql写入数据。</li> <li>oraclewriter:支持向oracle写入数据。</li> <li>streamwriter:支持向stream流写入数据。(常用于测试)</li> </ul> <p><br /> 您可以按需选择使用或者独立开发您自己的插件 (具体参见《DataX插件开发指南》)</p> <p><br /> <br /> </p> <h2 id="DataX在淘宝的运用">DataX在淘宝的运用</h2> <br /> DataX上线后,我们对淘宝数据平台原有作业进行了逐步批量迭代替换。数据同步工具归一化为DataX后,大大提高了用户拖表数据速度和内存利用率, 同时针对归一化后的DataX工具,我们能够做到更好应对mysql切库、数据同步监控等以前零散工具下很难完成的运维任务。 <br /> 下面是部分工具替换后的比对情况: <br /> <br /> <img alt="异构数据源数据交换工具 DataX" src="https://simg.open-open.com/show/e7531049b6542e43697c42ba31c8be7e.jpg" width="609" height="122" /> <br /> <br /> 目前DataX在淘宝数据平台数据已经广泛地被用于数据同步作业,每天共计有 <strong>4000+道</strong>DataX数据同步作业分布在全天各个时段运行。 <br /> DataX/DbSync/TT已经构成了淘宝数据平台数据提供的三大支柱: <br /> <br /> <img alt="异构数据源数据交换工具 DataX" src="https://simg.open-open.com/show/7ab269c9b97e50c6696c4349b8820bde.png" width="556" height="385" /> <br /> <br /> <br /> <br /> 其中DataX每天为淘宝贡献 <strong>2.5T</strong>数据量,占淘宝数据平台总体数据同步的 <strong>23%</strong>,占数据库数据同步的 <strong>96%</strong>。 <br /> <br /> <br /> <img alt="异构数据源数据交换工具 DataX" src="https://simg.open-open.com/show/b687ce7efd1cb4c90f17dba3a62f5a6c.png" width="556" height="355" /> <br /> <br /> <p><strong>项目主页:</strong><a href="http://www.open-open.com/lib/view/home/1325771223625" target="_blank">http://www.open-open.com/lib/view/home/1325771223625</a></p>