Apache CarbonData的Update/Delete功能设计实现

简介:

本文将介绍Apache CarbonData 0.3.0的Update/Delete功能设计实现。

CarbonData是由华为开发、开源并支持Apache Hadoop的列式存储文件格式,支持索引、压缩以及解编码等,其目的是为了实现同一份数据达到多种需求,而且能够实现更快的交互查询。目前该项目正处于Apache孵化过程中。

当前,CarbonData暂不支持修改表中已经存在的数据。但是在现实情况下,我们可能很希望这个功能,比如修改维度表,事实表的数据校正以及数据清洗等。很多使用CarbonData的用户很希望其能够提供数据的修改和删除功能。为此,社区已经有人提了Issue(CARBONDATA-440),其目标就是为CarbonData提供Update/Delete功能,这个功能应该会在CarbonData 0.3.0版本发布。本文将介绍CarbonData的Update/Delete功能设计实现。下面是实现这个功能的高层次设计目标:

(1)、提供标准的SQL接口,以便能够执行更新和删除操作;

(2)、对CarbonData表执行更新和删除操作的时候,不需要对已经存在的整个CarbonData块重写,而是将修改写到差异文件中(differential files);

(3)、在更新和删除操作之后,CarbonData readers应该能够跳过删除的记录,并且能够无缝地读取更新的记录,而这些操作不需要用户更新自己的应用程序。

下面我将详细地介绍 CarbonData 的修改和删除实现设计。

更新操作实现

我们都知道,CarbonData的数据是存储在HDFS之上,而HDFS中的文件是不可修改的(immutable),所以CarbonData的数据块并不能原地进行修改。更新数据的一种方法就是删除和重写整个数据块。然而这种方法的效率很低,会导致性能瓶颈。其实我们可以把更新操作认为是先"删除",然后"插入",这也就是CarbonData中更新的实现。下面我将详细地介绍CarbonData的更新操作实现:CarbonData的更新操作分为以下两步:

1、第一步包括两个部分:

(1)、首先,CarbonData能够通过执行过滤和Join操作识别出需要更新的行。为了能够唯一标识行数据,CarbonData会使用到ROWID属性。一旦需要更新的数据被标识后,这些数据将会在单独的文件中被标识为deleted,而且这些文件是存放在当前表的目录下,这些文件被称为"Delete Delt"。

(2)、然后,CarbonData将会从源表中收集需要更新的列值并组成新的一行。新的行数据是由更新后的列值和目标表现有的列值数据组成的。这些更新的行数据将会在Spark处理层组成一个源RDD。

2、第二步:CarbonData将会使用现有的数据加载方法将源RDD中的行数据转换成CarbobData数据格式。这个操作类似于数据的增量加载。这个新创建的CarbonData文件称为"Update Delta"。Update Delta文件将存储在同一个segment中,而且Update Delta本身拥有btree和块级别的统计,正如正常的CabonData文件。这个新的btree应该追加到全局的btree中,并且缓存起来。

下面就是CabonData更新操作的时序图:

删除操作的实现

在删除数据的情况,CarbonData也是通过过滤和Join操作来识别需要删除的行。为了能够唯一标识行数据,CarbonData会使用到ROWID属性。一旦需要删除的数据被标识后,这些数据将会在单独的文件中被标识为deleted,这个文件也称为"Delete Delta"文件。CarbonData记录扫描程序将会把这些删除的文件排除到结果集之外。在删除操作之后,CarbonData不需要更新全局字典表,因为字典表中有些entries对其他的segment还是有效的。

删除操作的原子性

CarbonData的删除操作具有原子性,也就是说,删除的数据要么全部被删除,要么全部都没删除。删除操作产生的Delete delta文件在删除操作仍然进行时,对readers事不可见的;只有删除操作成功进行,新删除的行数据才会对readers可见。删除的操作如下图所示:

下面就是CabonData删除操作的时序图:

文件合并

对每次更新操作,都会产生update delta 和 delete delta文件,随着频繁地更新和删除操作,会产生越来越多的delta文件。这将会产生许多小文件,这可能会影响scan操作的性能,所以我们需要将这些delta文件合并成单独的delta文件。将许多个delta文件合并成一个delta文件的操作称为compaction或 minor compaction. 操作如下:

而且compaction操作可以通过配置达到多少个delta files来触发。在删除或者更新操作之后,如果delta文件的数量达到了配置的阈值,compaction操作将会触发。


本文作者:佚名

来源:51CTO

相关文章
|
6月前
|
域名解析 Linux Apache
Linux Apache服务详解——虚拟网站主机功能实战
Linux Apache服务详解——虚拟网站主机功能实战
145 5
|
SQL 物联网 Apache
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(11)
目前,IoTDB中不存在冲突的权限,因此用户的真正权限是用户自身权限和用户角色权限的结合。也就是说,要确定用户是否可以执行操作,取决于用户自己的权限之一或用户角色的权限是否允许该操作。用户自己的特权和用户角色的特权可能会重叠,但这并不重要。
202 1
|
存储 物联网 数据管理
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(12)
现在到了使用Apache IoTDB进行IoT相关开发的架构设计与功能实现的最后一个环境,在本文中我将向大家介绍IoTDB的查询语言。IoTDB为咱们广大开发者提供了类似SQL的查询语言,用于与IoTDB进行交互,查询语言可以分为4个主要部分:架构语句、数据管理语句、数据库管理语句、功能。
209 0
|
SQL 传感器 物联网
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(10)
物联网提供限制/限制条款和偏移/偏移子句,以使用户对查询结果有更多的控制权。使用 LIMIT 和 SLIMIT 子句允许用户控制查询结果的行数和列数,使用 OFFSET 和 SOFSET 子句允许用户设置结果的起始位置进行显示。
143 0
|
5月前
|
存储 SQL 数据管理
基于阿里云数据库 SelectDB 版内核 Apache Doris 全新分区策略 Auto Partition 应用场景与功能详解
自动分区的出现进一步简化了复杂场景下的 DDL 和分区表的维护工作,许多用户已经使用该功能简化了工作流程,并且极大的便利了从其他数据库系统迁移到 Doris 的工作,自动分区已成为处理大规模数据和应对高并发场景的理想选择。
|
6月前
|
运维 Linux Apache
LAMP架构调优(九)——Apache Rewrite功能实战
LAMP架构调优(九)——Apache Rewrite功能实战
62 1
|
6月前
|
存储 SQL Apache
Apache Hudi 1.x 版本重磅功能展望与讨论
Apache Hudi 1.x 版本重磅功能展望与讨论
115 4
|
6月前
|
消息中间件 JSON Kafka
实战 | Apache Hudi回调功能简介及使用示例
实战 | Apache Hudi回调功能简介及使用示例
52 0
|
SQL 传感器 物联网
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(8)
IoTDB为用户提供了多种插入实时数据的方式,如直接输入插入SQL语句在客户端,这插入SQL语句语句可用于将数据插入到一个或多个已创建的指定时间序列中。
314 1
|
SQL 物联网 Java
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(9)
GROUP BY 语句为用户提供了三种类型的指定参数: 参数1:时间轴上的显示窗口 参数2:划分时间轴的时间间隔(应为正) 参数3:时间滑动步长(可选,不应小于时间间隔,如果未设置,则默认等于时间间隔)
244 0
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(9)

推荐镜像

更多