Apache Iceber能将Amazon S3 成本降低了 90%


与Apache Hive相比,新一代数据湖表格式(Apache HudiApache IcebergDelta Lake)凭借其卓越的功能每天都在受到越来越多的关注。它们为具有 ACID 事务、模式演变、时间旅行等的大数据分析提供经济高效的云解决方案。

表格格式
表格式技术对于大数据环境在分布式存储系统中正确读取、写入和管理大型数据集至关重要。Apache Hive 是 Hadoop 时代的首选解决方案,并通过其 SQL 接口促进了数据分析。但是,Apache Hive 在设计时考虑了 HDFS,它不能很好地转换为像Amazon S3这样的对象存储系统。
相反,Apache Hudi、Apache Iceberg 和 Delta Lake 在设计时考虑了现代云基础架构,以便在具有 PB 级数据集的云上表现更好且成本更低。

云能力
Apache Hive 的主要缺点是缺乏粒度元数据,并且依赖于列出具有 O(N) 复杂度的分区的目录来进行查询规划。表和分区元数据存储在由 RDBMS 支持的 Hive Metastore 中,需要查询以找出应为请求的数据读取哪些目录。然后,列出目录以找出实际的数据文件。Hive Metastore 和目录列表会导致表上的分区数量增加造成很大的瓶颈,特别是考虑到对象存储上的目录列表实际上是在扫描带有前缀的文件并且成本很高。
下一代表格格式利用元数据来完成繁重的工作。元数据定义了表结构、分区和组成表的数据文件,无需查询元存储和列出目录。Apache Iceberg 使用快照方法并执行O(1) RPC 来读取快照文件,因此 Apache Iceberg 表可以轻松扩展,而无需担心增加分区数时的性能。

性能和成本效应
Apache Iceberg 专为大型表而设计,用于单个表可以包含数十 PB 数据的生产环境。另一个设计目标是解决影响在 Amazon S3 中运行的 Hive 表的正确性问题。实现这些目标使 Iceberg 成为 Amazon S3 上具有成本效益的解决方案。
在 Insider,我们将 Amazon EMR 用于我们的 Spark 工作负载,这些工作负载执行繁重的 ETL 和机器学习操作,以推动我们的产品推荐和预测客户细分功能。以尽可能经济高效的方式运行这些工作负载对我们来说始终很重要。我们重视将我们的技术推向边缘以实现这一目标。您还可以阅读Spark 3 如何帮助我们降低 EMR 成本。将 Hive 支持的数据湖迁移到 Iceberg 对我们来说是一个类似的决定。如果您对我们如何实际规划、构建和执行迁移感兴趣,请查看此博客文章。

我们的 Hive 表使用带有Snappy压缩的[url=https://orc.apache.org/]Apache ORC[/url]文件格式,因为它是我们对其进行基准测试时的最佳选择。在对新一代表格格式进行基准测试时,我们还对文件格式和压缩算法进行了基准测试。作为我们数据基准测试的结果,我们最终使用了带有Zstandard压缩的Apache Parquet文件格式。
Uber 有一篇很棒的博客文章描述了大数据文件格式的成本效率,它为我们提供了很多指导。

导致 Hive在云上出现性能问题的原因也会导致额外的成本。首先,为 Hive Metastore 运行 RDBMS 是有成本的。然后,还有目录列表的成本。结合 Spark 默认的 200 个分区和小文件问题,数据文件发现和数据读取成本极高。对我们来说,这是存储成本的五倍。

使用 Apache Iceberg,可以通过参数配置表的文件大小,默认write.target-file-size-bytes为512MB。这会导致合并数据直到达到目标限制并将大文件写入 Amazon S3。Iceberg 还具有用于压缩数据文件以减少文件数量的维护工具。拥有几个大文件而不是很多小文件有两个方面的帮助。

  • 由于每个分区包含的文件(实际上是对象)要少得多,因此查询表读取的对象要少得多。这显着降低了 Amazon S3 的HeadObject和GetObject成本,在我们的案例中约为 90%。
  • 对象读取和文件打开操作要少得多。结合 Hive Metastore 消除了查询计划的瓶颈,Spark 作业的性能更高,因此EMR 运行时也减少了。在我们的案例中,我们节省了大约 20% 的 EC2 和 EMR 成本。

Apache Iceberg 是一种用于缓慢变化的大型数据集的出色开放表格式。通过几行配置在 Amazon EMR 上进行设置相当容易。将 Amazon S3 用于数据湖存储层是一种经济高效的解决方案。Iceberg 还提供了广泛的表管理功能,例如模式演变隐藏分区时间[url=https://iceberg.apache.org/docs/latest/spark-queriestime-travel]旅行[/url]等。如果您在 AWS 上使用 Apache Hive,您可以考虑试用 Apache Iceberg 以节省性能和成本。