0767-Hive ACID vs. Delta Lake( 二 )
select * from acidtbl;
5.使用Scala通过Spark读取结果
scala> val df = spark.read.format(''HiveAcid'').options(Map(''table'' -> ''default.acidtbl'')).load() scala> df.collect()
对于已有的ORC格式数据文件 , 你也可以直接使用Hive的create table语法直接创建事务表 , 而无需进行任何数据格式转换 。 如果已有的数据文件格式为Parquet , 同样的方法你只能创建仅支持插入(insert-only)的表 。
深度分析
3.1 Why Hive ACID?
许多开源项目都在解决多版本并发控制(MVCC, multi-version concurrency)以及对数据湖中的数据进行事务更新和删除 。 比较突出的几个产品包括:
本文插图
这里我们首先排除Apache Kudu , 因为它不是为云存储中的数据而构建的 。 所有其他项目都支持快照隔离 。 我们按照以下不同的维度对他们进行对比 , 但没有特定的顺序:
1.Support for updates and deletes
2.Support for compaction and cleanup
3.Support for Parquet and ORC formats
【0767-Hive ACID vs. Delta Lake】4.Support for Hive, Spark, and Presto
5.Support for SQL DML statements
6.Write amplification
7.Open source governance
下图总结了截至到2019年9月的一些对比 , 红色部分代表它们有一些问题 , 绿色部分则代表它们比较有优势 。
本文插图
通过上表 , 你可以发现如果要支持所有的特性 , 对Hive的改动会最小 , 具体来说只需要:
- 增加Presto和Spark对Hive ACID的读/写支持;
- 增加Hive ACID支持Parquet文件格式的更新/删除 。
上述两点其实对于Hive来说非常简单 , 因为Hive的社区相当的活跃 , 尽管这是一个主观的呼吁 , 但是相较Hive , 其他的产品向功能全面的解决方案过渡的难度要更大 , 比如:
1.Apache Iceberg非常有前途 , 但有关更新/删除支持的设计尚未最终确定
2.Apache Hudi似乎也很有前途 , 但是在数据摄取(data ingestion)这一块与Spark结合的太紧密 , 我们认为需要花费较大的成本才能扩展到其他引擎 。
3.Delta.io是为Spark和Parquet量身定制的 , 但是它的写入放大(high write amplification) , 缺少SQL DML支持和缺乏压缩支持方面都存在明显的缺陷 。 上表中其他的项目都是Apache项目 , Delta Lake最近才成为Linux基金会的子项目 。
3.2 Hive ACID是如何工作的
Hive ACID大致上通过维护子目录来存储不同的版本 , 并对表的变化进行update/delete 。 Hive Metastore用于跟踪不同的版本 , 下图是一张动画示意:
本文插图
3.3 Hive ACID的挑战
Hive ACID主要用于使用Hadoop的HDFS文件系统中 。 由于云存储与HDFS语义上的差异 , 在云中使用此类工具不可避免会碰到一些问题 , 这里强调两点:
- 云存储中重命名(renames)开销特别大 - Hive在写入数据的时候 , 首先会将其写入临时位置 , 然后在最后的提交步骤中将其重命名为最终位置 。 在AWS的S3等云存储系统中 , 重命名的开销比较大 。
为了减少Hive因为这个特性带来的印象 , 我们更改了Qubole中Hive的行为 , 使其直接写入最终位置 , 并避免了昂贵的重命名操作 。 Qubole对于普通的Hive表(regular table)一直采用的是这种优化手段 - 这个办法也特别适用于事务表 , 因为正在进行的事务数据不会被任何查询读取 。
推荐阅读
- 【农村小春】plus vs.吉利缤vs.SUV?,Cs35
- cnBeta:vs. Foundem案件新进展:让SEO专家介入或放弃提交算法文件,Google
- 「cnBeta」vs. Foundem案件新进展:让SEO专家介入或放弃提交算法文件,Google
