Bulk Insert

批量插入实验 中,在创建Hudi表时,做出了几个配置选择来优化未来对Hudi表的读写性能。在本节中,我们将深入解释一些关键的Hudi概念和操作,以帮助我们完全理解实验笔记本中的调优和配置选择。

批量插入如何工作

Hudi批量插入执行以下步骤:

  1. 使用配置的:link[KeyGenerator]{href="https://hudi.apache.org/docs/key_generation/” external=true}生成Hudi记录键和分区路径。
  2. 向输入数据集添加Hudi元数据列(例如_hoodie_commit_time)。
  3. 如果hoodie.combine.before.insert设置为true(默认为false),则对输入数据集进行重复数据删除。
  4. 重新排序输入数据集中的列,以使Hudi元数据列位于首位。
  5. 根据配置的hoodie.bulkinsert.sort.mode对数据集进行分区。
  6. 将数据集写入Hudi表,写入数据文件,并确保生成的文件大小小于hoodie.parquet.max.file.size

文件大小管理

Hudi自动尝试创建合适大小的文件(即使用hoodie.parquet.max.file.size大小)。但是对于批量插入操作,我们需要调整批量插入创建的文件数量以获得合适的文件大小。

选择记录键

唯一性(必需) Hudi通过由记录键分区路径组成的主键来唯一标识记录。这要求选择Hudi记录键,使得每个记录都有唯一的记录键值(至少在分区内)。

排序(可选) 如果记录键是单调递增的,Hudi可以在索引查找中执行范围裁剪 ,减少需要执行索引查找的文件数量。这可以显著提高索引查找性能,从而提高upsert性能

Hudi元数据表

Hudi写操作执行文件系统列表以获取数据集中分区和文件的当前视图。对于大型数据集,此列表操作可能会对性能产生负面影响。Hudi元数据表(默认启用)存储分区和文件的列表,以减少递归文件列表操作。

范围裁剪

范围裁剪通过文件裁剪提高读写性能,当有有序记录键时:

  • Upsert/delete - Hudi可以使用范围裁剪对记录键索引查找中的文件进行裁剪,缩小要检查和加载到内存中的文件数量。
  • 读取 - 通过Parquet过滤器下推在记录键上执行范围裁剪,缩小要加载到内存中的文件数量。

范围裁剪效果最佳的是当文件具有非重叠的记录键范围时。

Hudi Parquet文件

Hudi Parquet文件包含以下组件:

  • 每个行组都有每列的最小值和最大值统计信息,用于谓词下推(范围裁剪)。
  • 默认情况下,Hudi使用布隆过滤器进行upsert和delete操作。它首先检查hoodie_min_record_keyhoodie_max_record_key的值,以了解记录是否可能位于文件中(范围裁剪)。如果可能存在,它继续检查存储在文件中的布隆过滤器(使用文件裁剪)。