Apache Hudi数据备份与转储利器:HoodieSnapshotExporter

简介: Apache Hudi数据备份与转储利器:HoodieSnapshotExporter

1. 引入

最近社区活跃贡献者:Raymond Xu & OpenOpened,给Hudi贡献了一个非常实用的工具:HoodieSnapshotExporter,该实用程序旨在促进导出(如备份复制和转换格式)Hudi数据集的任务。

2. 备份成Hudi格式数据集

与现有的 HoodieSnapshotCopier相似,导出器将扫描源数据集,然后将其复制到目标输出路径。

spark-submit \
    --jars "packaging/hudi-spark-bundle/target/hudi-spark-bundle_2.11-0.6.0-SNAPSHOT.jar" \
    --deploy-mode "client" \
    --class "org.apache.hudi.utilities.HoodieSnapshotExporter" \
    packaging/hudi-utilities-bundle/target/hudi-utilities-bundle_2.11-0.6.0-SNAPSHOT.jar \
    --source-base-path "/tmp/" \
    --target-output-path "/tmp/exported/hudi/" \
    --output-format "hudi"                #Export as Hudi

3. 备份成Json/Parquet格式数据集

导出器还可以将源数据集转换为其他格式,当前仅支持jsonparquet

spark-submit \
    --jars "packaging/hudi-spark-bundle/target/hudi-spark-bundle_2.11-0.6.0-SNAPSHOT.jar" \
    --deploy-mode "client" \
    --class "org.apache.hudi.utilities.HoodieSnapshotExporter" \
    packaging/hudi-utilities-bundle/target/hudi-utilities-bundle_2.11-0.6.0-SNAPSHOT.jar \
    --source-base-path "/tmp/" \
    --target-output-path "/tmp/exported/json/" \
    --output-format "json"  # or "parquet"

2.1 Re-partitioning

当导出为其他格式(json/parquet)时,导出器将使用该参数进行一些自定义重新分区。默认情况下,如果以下两个参数均未给出,则输出数据集将没有分区。

2.1.1 --output-partition-field

此参数使用现有的非元数据字段作为输出分区。在导出时,所有 _hoodie_*元数据字段都将被删除。

spark-submit \
    --jars "packaging/hudi-spark-bundle/target/hudi-spark-bundle_2.11-0.6.0-SNAPSHOT.jar" \
    --deploy-mode "client" \
    --class "org.apache.hudi.utilities.HoodieSnapshotExporter" \
    packaging/hudi-utilities-bundle/target/hudi-utilities-bundle_2.11-0.6.0-SNAPSHOT.jar \
    --source-base-path "/tmp/" \
    --target-output-path "/tmp/exported/json/" \
    --output-format "json" \
    --output-partition-field "symbol"  # assume the source dataset contains a field `symbol`

输出目录如下所示:

_SUCCESS symbol=AMRS symbol=AYX symbol=CDMO symbol=CRC symbol=DRNA ...

2.1.2 --output-partitioner

此参数表示实现 HoodieSnapshotExporter.Partitioner类的全路径名。此参数的优先级高于 --output-partition-field,如果提供该参数, --output-partition-field配置将被忽略。

一个示例实现如下所示:

package com.foo.bar;
public class MyPartitioner implements HoodieSnapshotExporter.Partitioner {
  private static final String PARTITION_NAME = "date";
  @Override
  public DataFrameWriter<Row> partition(Dataset<Row> source) {
    // use the current hoodie partition path as the output partition
    return source
        .withColumnRenamed(HoodieRecord.PARTITION_PATH_METADATA_FIELD, PARTITION_NAME)
        .repartition(new Column(PARTITION_NAME))
        .write()
        .partitionBy(PARTITION_NAME);
  }
}

将此类放在 my-custom.jar中之后,然后将其放在作业类路径中,submit命令将如下所示:

spark-submit \
    --jars "packaging/hudi-spark-bundle/target/hudi-spark-bundle_2.11-0.6.0-SNAPSHOT.jar,my-custom.jar" \
    --deploy-mode "client" \
    --class "org.apache.hudi.utilities.HoodieSnapshotExporter" \
    packaging/hudi-utilities-bundle/target/hudi-utilities-bundle_2.11-0.6.0-SNAPSHOT.jar \
    --source-base-path "/tmp/" \
    --target-output-path "/tmp/exported/json/" \
    --output-format "json" \
    --output-partitioner "com.foo.bar.MyPartitioner"

请注意,其不会删除 _hoodie_*元数据字段;它留给用户处理元数据字段。

3. 总结

相信有这个工具后,大家可以非常方便地备份Hudi数据集或者对初始数据集的格式进行特定的转换、转储。这个特性将会包含在Hudi的下一个版本0.6.0中。如果有小伙伴迫不及待想使用这个特性,也可以checkout master分支上的代码到本地,自己编译打包。

目录
相关文章
|
7月前
|
存储 Apache
Apache Hudi Savepoint实现分析
Apache Hudi Savepoint实现分析
122 0
|
7月前
|
存储 机器学习/深度学习 Apache
如何将Apache Hudi应用于机器学习
如何将Apache Hudi应用于机器学习
68 0
|
7月前
|
Apache 索引
精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter
精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter
73 0
|
7月前
|
存储 SQL Apache
Apache Hudi与Delta Lake对比
Apache Hudi与Delta Lake对比
108 0
|
7月前
|
Apache
Apache Hudi Rollback实现分析
Apache Hudi Rollback实现分析
101 0
|
5月前
|
SQL 分布式计算 Apache
Apache Doris + Apache Hudi 快速搭建指南|Lakehouse 使用手册(一)
本文将在 Docker 环境下,为读者介绍如何快速搭建 Apache Doris + Apache Hudi 的测试及演示环境,并对各功能操作进行演示,帮助读者快速入门。
Apache Doris + Apache Hudi 快速搭建指南|Lakehouse 使用手册(一)
|
6月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错合集之从hudi读数据,报错NoSuchMethodError:org.apache.hudi.format.cow.vector.reader.PaequetColumnarRowSplit.getRecord(),该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
129 0
|
7月前
|
存储 SQL 分布式计算
使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据
使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据
228 0
|
7月前
|
存储 分布式计算 Hadoop
一文了解Apache Hudi架构、工具和最佳实践
一文了解Apache Hudi架构、工具和最佳实践
1304 0
|
7月前
|
SQL 分布式计算 NoSQL
使用Apache Hudi和Debezium构建健壮的CDC管道
使用Apache Hudi和Debezium构建健壮的CDC管道
81 0

推荐镜像

更多