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

时间: 2024-09-19 23:59:30

Apache CarbonData的Update/Delete功能设计实现的相关文章

简述SQL SERVER触发器内INSERT,UPDATE,DELETE的三种状态

一个触发器内三种INSERT,UPDATE,DELETE状态 CREATE   TRIGGER   tr_T_A   ON     T_A   for   INSERT,UPDATE,DELETE        如IF   exists   (select   *   from   inserted)   and   not   exists   (select   *   from   deleted)   则为   INSERT  如IF   exists(select   *   from

LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作 .这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作插入(Insert)1.简单形式 说明:new一个 对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges ()提交到数据库. NorthwindDataContext db = new NorthwindDataContext(); var newCustome

asp access insert update delete 使用

本教程是一篇asp入门篇的初级教程了,主要是讲asp access insert update delete 简单的使用哦,好了下面我们把它们写在一个函数里面然后再举例说明. Function add_del_update(tablename,str,id) Select Case str  Case "insert":    sql="select * from ["&tablename&"] where id=null"   

Apache CarbonData:大数据生态一种新的高性能数据格式

Apache CarbonData是一种新的高性能数据存储格式,针对当前大数据领域分析场景需求各异而导致的存储冗余问题,CarbonData提供了一种新的融合数据存储方案,以一份数据同时支持"任意维度组合的过滤查询.快速扫描.详单查询等"多种应用场景,并通过多级索引.字典编码.列存等特性提升了IO扫描和计算性能,实现百亿数据级秒级响应.CarbonData是由华为开源贡献到Apache基金会的大数据项目,致力于推动大数据开源生态技术的发展. 随着数据与日俱增,业务驱动下的数据分析灵活性

Apache® CarbonData™ 成 Apache 软件基金会顶级项目

Apache软件基金会正式宣布CarbonData从Apache孵化器毕业,正式成为Apache顶级项目(TLP),这也是首个由中国公司发起并捐献给Apache基金会的开源项目. Apache CarbonData是由华为开源贡献的大数据高效存储格式解决方案.针对当前大数据领域分析场景需求各异而导致的存储冗余问题,CarbonData提供了一种新的融合数据存储方案,以一份数据同时支持"交互式分析.详单查询.任意维度组合的过滤查询等"多种大数据应用场景,并通过丰富的索引技术.字典编码.列

SQL Server触发器insert update delete示例

·只有inserted表有数据时,当前操作为insert: ·inserted和deleted两张表都有数据时,当前操作为update: ·只有deleted表有数据时,当前操作为delete. 创建触发器用 CREATE TRIGGER  代码如下 复制代码 CREATE TRIGGER 触发器名称 ON 表名 FOR INSERT.UPDATE 或 DELETE AS nserted.deleted 这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录

注解-@Query 事务问题,Executing an update/delete query

问题描述 @Query 事务问题,Executing an update/delete query 新搭建了一个 Spring MVC+Spring Data JPA+Hibernate的一个工程 在DAO的方法之上加了注解@Query.@Modifying,但是在运行过程中一直抛出 javax.persistence.TransactionRequiredException: Executing an update/delete query 的异常,实在无力了,希望有大大来帮助 2015-04

在PostgreSQL中实现update | delete limit

背景 使用MySQL的用户可能会比较熟悉这样的用法,更新或删除时可以指定限制更新或删除多少条记录. 达到限定的记录数后不再继续进行下去,而是返回. delete from tbl where xxx limit 100; update tbl set xxx=xxx where xxx limit 100; 目前PostgreSQL没有类似的语法,但是可以通过其他手段来达到同样的效果. with语法实现 创建测试表 postgres=# create table t(id int primary

关于MYSQL DML(UPDATE DELETE)中的子查询问题和ERROR 1093 (HY000)错误

从5.6开始MYSQL的子查询进行了大量的优化,5.5中只有EXISTS strategy,在5.7中包含如下: IN(=ANY) --Semi-join   --table pullout(最快的,子查询条件为唯一键)   --first match   --semi-join materialization   --loosescan   --duplicateweedout --Materialization --EXISTS strategy(最慢的) NOT IN( <>ALL) -