0767-Hive ACID vs. Delta Lake


?Qubole现在支持对存储在Cloud数据湖中的数据进行高效的Update和Delete 。 用户可以对开启了事务的Hive表进行insert , update和delete , 并通过Apache Spark或Presto进行查询 。 使用Apache Spark或Presto操作Hive的事务表功能 , 我们已将其开源 , 我们对于更多引擎支持update和delete的工作也在进行中 , 这块同样也会开源 。
在这篇文章中 , 我会介绍该功能 , 设计实现以及未来的路线图 。
动机和背景
我们看到越来越多的用户对存储在数据湖中的数据渴望有高效可靠的update和delete解决方案 , 尤其是保存在云对象存储中的数据 。 对于这种update和delete , 传统的做法是在分区(partition)级别全部重写并覆盖(overwrite)旧的数据 。 如果使用这种方法 , 即使只是数据更新了几条 , 你都需要全部重写大量数据 , 因此该方法无法有效扩展 。 由于GDPR和CCPA之类的安全合规要求 , 对高性能和高性价比解决方案的需求也变得迫在眉睫 。
在比较了不同的技术方法之后 , 我们选择了Apache Hive的ACID事务作为Qubole中update/delete支持的基础 。 Qubole现在使用的Hive3.1支持事务 , 用户可以使用Hive的DML语句对以ORC格式保存的数据进行追加(append) , 更新(update)和删除(delete) , 如果是Parquet格式的数据则只能进行追加(append) 。 我们还增强了Qubole中的Presto和Apache Spark , 使其能够读取此类事务表 , 并将这些更改回馈给了开源社区 。 我们的解决方案建立在Hive的Metastore Server上 , 当数据发生变化时 , 可以提供自动或者手动的合并/清除操作 。
简介
2.1 开源用户设置指南
1.用户必须使用Hive 3.0及更高版本 。 如果你使用的是旧版本 , 建议你将Hive Metastore database和server升级到3.1.2 。 旧一点的Hive比如v2.3可以继续与Hive3.1.2兼容 。
2.为了让Spark能够读取Hive事务表 , 用户必须使用可用的Spark ACID数据源 , 参考:
https://github.com/qubole/spark-acid或者相对应的Spark package与Spark2.4+版本一起使用 , Spark package参考:
https://spark-packages.org/package/qubole/spark-acid
3.要让Presto读取Hive事务表 , 用户必须从master分支构建PrestoSQL并且应用补丁PR-1257:
https://github.com/prestosql/presto/pull/1257对应open issue PrestoSQL-576
https://github.com/prestosql/presto/issues/576
2.2 Qubole用户设置指南
1.要让Hive能够支持读取/写入ACID事务表 , 参考:
https://docs.qubole.com/en/latest/user-guide/hive/hive-acid/prerequisites-acid.html
2.要让Presto和Spark读取Hive ACID事务表 , 可以联系Qubole的技术支持customersupport@qubole.com
2.3 用法示例
以下是具有完整ACID表(当前仅支持ORC格式)的典型流程示例:
1.在Hive中创建一个事务表并插入一些数据
create table acidtbl (key int, value string) stored as orc TBLPROPERTIES (''transactional''=''true''); insert into acidtbl values(1,'a'); insert into acidtbl values(2,'b');
或者
2.通过简单的操作元数据也可以实现将现有的ORC非事务表转换为事务表
alter table nonacidtbl set TBLPROPERTIES ('transactional'='true');
3.使用Hive进行delete , update和merge数据
delete from acidtbl where key=1; update acidtbl set value='http://news.hoteastday.com/a/updated' where key=2; merge into acidtbl using src on acidtbl.key = src.key when matched and src.value is NULL then delete when matched and (acidtbl.value != src.value) then update set value = http://news.hoteastday.com/a/src.value when not matched then insert values (src.key, src.value);4.使用Hive或Presto读取结果


推荐阅读