前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单而又有效的设计才是好设计

简单而又有效的设计才是好设计

作者头像
用户2936994
发布2022-07-21 13:38:21
1830
发布2022-07-21 13:38:21
举报
文章被收录于专栏:祝威廉祝威廉

前缘

Delta刚开源的时候我就去使用了一把,然后因为刚开源,很多功能还是缺失的,比如很重要的upsert/compaction 等。于是我就开发了

delta-plus

开发的过程中,我熟悉了下delta的源码,为其设计的精妙不禁感叹不已。Delta的核心设计非常非常简单,但是这总简单的解法却能有效的解决很多问题。大家可以想想以前在高中的时候做数据证明题,好的解法又简单,又容易理解,而且天生自带美感,让人觉得就像在欣赏一幅字画,把玩中内心享受到了美的熏陶。

简单的设计

Delta 并没有自己发明一种新文件存储格式,而是复用了parquet,但是parquet只是一个带格式的文件而已,而且是面向查询设计的存储格式,对文件里面的记录是无法进行删除,更新动作的。那现在我们要实现一堆的特性,如更新,删除,新增,覆盖,流写,批写,版本回溯等等,该怎么办呢?

Delta 巧妙的将上述动作抽象成了无论你做什么操作,本质上都是新增文件,删除文件(标记删除)。 再解释一把就是,parquet文件为最基本的操作粒度,我们需要将前面提到的更新,删除,新增,覆盖,流批写,版本回溯等等都最终抽象成两个动作:

  1. 新增文件
  2. 标记删除文件

那是不是这个抽象真的能够实现这些功能呢?实际实践后发现是完全可以的。为了能够知道某一次到底新增了几个文件,标记删除了几个文件,我们需要有一个地方记录,这个地方就是meta文件目录,在该目录里,我们使用json格式,记录某次批、流写新增了哪些文件,删除了哪些文件。

别看就这么简单的做法,基本上就把我们前面要的功能就都实现了,假设我们对delta一共操作了三次分别产生a,b,c三个json文件,现在,我可以回溯到这三次中任何一次的状态。比如c其实是一次错误操作,我想回退一下,这个时候我只要读a,b两个文件,我就知道当前有哪些parquet文件是有效的,从而读取到正确的数据。虽然数据目录里已经有c写的parquet文件了,但是我系统不读取它,就相当于c没有发生过。这里就完成版本回溯的功能。

我们会在后续章节解释delta到底是如何实现更新等功能的细节的。但是这里大家只要了解,delta的所有操作功能,都可以理解为新增文件,标记删除文件,以及将这些操作信息记录下来。

所以有人会说,delta不过是在parquet之上加了一个操作记录功能而已,实际上确实如此。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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