前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >闲聊数据交换的历史和现状

闲聊数据交换的历史和现状

作者头像
哒呵呵
发布2020-02-11 13:21:09
1K0
发布2020-02-11 13:21:09
举报
文章被收录于专栏:鸿的学习笔记

数据交换的历史

IBM 在 1960 年代发明了数据库,也就是 SystemR 。过了一段时间到了 1970 年代,数据库里面有了足够多的数据后,自然而然就有了数据交换(data exchange)的需求。1972 年 IBM 的 Fortran 编译器开始支持以逗号为分隔符的 CSV 文件格式为核心进行数据交换,于是由数据库导出数据到 CSV 格式文件,或者由 CSV 格式文件导入数据到数据库便成了数据交换历史的开端。

随着历史的发展,数据库种类越来越多,存储数据的文件类型也层出不穷,稍微想下数据库种类就有以MySQL、Oracle为代表的关系型数据库,也有像 Hbase、Kudu 一样的非关系型数据库,更何况还有类似 sqlite 的文件型数据库;存储数据的文件类型有传统的 CSV、TSV 格式的行式存储文件格式,也有随着大数据发展而诞生的 Parquet、ORC 格式的列式存储文件格式。

这么多种数据库类型和文件格式自然少不了它们之间的数据交换。数据交换可以认为是传统的 ETL (Extract-Transform-Load)的一部分,工程师们为此开发了无数的工具去解决从 A 类型数据库导入到 B 类型数据库,或者从 C 类型的文件格式导入到 D 类型的数据库中的问题。

说句玩笑话:每一种数据库类型或者是文件类型的数据交换工具都解决了某种特定的需求,因此从某种意义上来说,都是 KPI 啊。

数据交换的定义

Wiki 上对于数据交换的定义非常宽泛。数据交换不仅仅局限在数据库和文件类型的交互,也包括了使用 Json 格式的 Web API 之间的交互。

Data exchange is the process of taking data structured under a source schema and transforming it into data structured under a target schema, so that the target data is an accurate representation of the source data.[1] Data exchange allows data to be shared between different computer programs.

本文为了讨论方便,把数据交换局限在数据库和文件类型的交互上。

数据交换的现状

前文提到过因为数据库种类和文件类型的繁多,工程师们开发了各种各样的工具去进行数据交换。比如下面一段代码就是使用 Python 将本地的 CSV 格式文件读取写入到数据库中:

代码语言:javascript
复制
import pandas as pd
pd.read_csv(path).to_sql(sql,con)

这种简单的代码写起来很快,但是如果遇上了要从数据库导出成 CSV 格式的文件,也可以照着模样画葫芦:

代码语言:javascript
复制
import pandas as pd
pd.read_sql(sql,con).to_csv(sql,con)

庆幸的是,无论是 Python 、Java 还是什么其它的编程语言都有一种通用的读取关系型数据库或者是与 SQL 相关的数据库的协议,比如 Java 的 JDBC 协议和 Python 的 DB API 协议。所以才可以使用read_sql这么简单的语句读取所有支持 SQL 的数据库类型,而不用指定这个数据库是 MySQL 还是 PostgreSQL,或者是 Oracle。

我想无论在哪个公司,这种从从 A 类型数据库/文件到 B 类型数据库/文件的代码都不少见。上面写的两段代码简单是简单,也就两行而已,但是如果数据量是百万级、千万级乃至更大,或者说数据传输时报错了,要怎么办?

于是就有了专门的工具去解决这些问题,比如 Sqoop,比如 Airflow 上的 Transfer 类型的 Operator 。

如果公司的数据库类型和文件类型比较单一,这种类型的数据交换工具还好,但是内部的数据库类型和文件类型很丰富,那此类工具就会很痛苦,就像调度系统 Airflow 上的 Operator 一样,会有gcs_to_s3gcs_to_sftphive_to_mysqlmssql_to_gcsmysql_to_hivepostgres_to_gcs等等。盗用一张很形象的图就是:

然后就有了像 DataX、Embulk 这类工具,通过插件机制将数据交换过程抽象化,将复杂的异构数据源同步从网状链路变成了星型数据链路。当然,也有一篇很著名的关于 LOG 的文章也是讲述这个问题的,推荐大家去看看(https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying)。

结尾

趁着元旦稍微写了一下数据交换的历史和现状,毕竟数据交换作为数据工程师必须要掌握和经常使用的技能,作为新年的第一篇技术文章还是很有意义。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据交换的定义
  • 数据交换的现状
  • 结尾
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档