将数据迁移到hudi中

405 阅读3分钟

Hudi维护元数据,如提交时间轴和索引来管理表。提交时间线有助于理解表上发生的操作以及表的当前状态。索引被Hudi用来维护一个记录键到文件id映射,从而有效地定位一个记录。目前,Hudi只支持书写parquet columnar格式。为了能够开始为现有表使用Hudi,您需要将现有表迁移到一个Hudi管理的表。有几种方法可以实现这一点。

方法

仅对新分区使用Hudi

Hudi可以用来管理现有的表,而不影响/改变表中已经存在的历史数据。Hudi已经实现与这样的混合表兼容,但需要注意的是,整个Hive分区是否由Hudi管理。因此,Hudi管理表的最低粒度是一个Hive分区。开始使用数据源API或WriteClient写入表,并确保开始写入一个新的分区,或将最后N个分区转换为Hudi,而不是整个表。注意,由于历史分区不是由HUDI管理的,所以HUDI提供的任何操作都不能处理这些分区中的数据。更具体地说,不能对这些不受HUDI表管理的旧分区执行upserts或增量拉取。如果您的表只是追加类型的表,并且不希望对现有(或非Hudi管理的)分区执行任何更新,那么可以采用这种方法。

将原有数据导入hudi

将现有表导入到Hudi托管表中。因为所有的数据都是由Hudi管理的,所以方法1的限制在这里都不适用。任何分区的更新都可以应用到这个表上,Hudi将有效地让查询可以使用更新。请注意,您不仅可以在该表上使用所有Hudi原语,这样做还有其他好处。Hudi自动管理一个Hudi管理表的文件大小。您可以在转换这个表时定义所需的文件大小,Hudi将确保它写出符合配置的文件。它还将确保稍后通过将一些新插入路由到小文件中而不是写入新的小文件来纠正较小的文件,从而维护集群的健康。

在选择这种方法时,有几个选项。

选项一:使用HDFSParquetImporter工具。 顾名思义,这只在现有表为parquet文件格式时有效。 这个工具本质上是启动一个Spark Job来读取现有的parquet表,并通过重写所有数据将其转换为一个HUDI管理的表。

选项二:对于巨大的表,这可以像这样简单:

for partition in [list of partitions in source table] {
        val inputDF = spark.read.format("any_input_format").load("partition_path")
        inputDF.write.format("org.apache.hudi").option()....save("basePath")
}

选项三:编写您自己的自定义逻辑,如何将现有的表加载到Hudi管理的表中。 请在这里阅读RDD API。 使用HDFSParquetImporter工具。 一旦通过mvn clean install -DskipTests构建了hudi,你就可以通过hudi-cli.sh执行如下命令

hudi->hdfsparquetimport
        --upsert false
        --srcPath /user/parquet/table/basepath
        --targetPath /user/hoodie/table/basepath
        --tableName hoodie_table
        --tableType COPY_ON_WRITE
        --rowKeyField _row_key
        --partitionPathField partitionStr
        --parallelism 1500
        --schemaFilePath /user/table/schema
        --format parquet
        --sparkMemory 6g
        --retry 2

了解更多