天天看点

SPARK & HIVE现在ACID的支持现状

在讨论之前,先介绍ACID是什么。

原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)

事务前后数据的完整性必须保持一致。

隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

简单来说支持ACID就是使得数据不会出现异常,包括数据新增,修改,删除所引起的一切异常。也正是这个问题,导致很多工具都不支持删除和修改的功能。

好了,现在讲讲到现在为止哪些是支持ACID的(当然只是根据在下所了解的范畴来说,不喜勿喷)

HDP3.1 里面HIVE3.X就支持ACID, 但是只有ORC的存储格式数据才能进行修改和删除操作。比如PARQUET只是拥有了ACID特性,但同样不能进行更新删除的操作。

HDP3.1 里面的SPARK2.3 也不支持更新删除的操作,但是HIVE表结构变更后再不需要手动REFLASH刷新SPARK的缓存数据了。

APACHE SPARK2.4.2 开始支持ACID数据的更新删除操作,数据源需要是基于PARQUET格式的DELTA LAKE数据(Databricks开源),传统的PARQUET数据可以很容易转换为DELTA LAKE的数据。

目前HIVE还不能直接读取delta lake数据,估计不久之后databricks公司将会实现该功能。

这里需要提到一个存储系统 KUDU , 他相当于是一个HBASE的升级产物,因为他除了实现HBASE的快速新增,快速查询之外,他还实现了表结构定义数据。但他是独立于HDFS存在的。

目前KUDU主要可以提供 impala , spark 进行数据处理,而impala 是依赖HIVE metastore读取数据的。虽然impala和hive共用了一个 metastore, 但是官方说目前还不支持hive 计算引擎直接读取kudu的数据。

现在KUDU是部分支持ACID,所以尽量还是不要把它ACID特性应用到生产环境中去比较稳妥。

继续阅读