1.如何写入Hudi数据集

通常,你会从源获取部分更新/插入,然后对Hudi数据集执行写入操作。如果从其他标准来源(如Kafka或tailf DFS)中提取数据,那么DeltaStreamer将会非常有用,其提供了一种简单的自我管理解决方案,可将数据写入Hudi。你还可以自己编写代码,使用Spark数据源API从自定义源获取数据,并使用Hudi数据源写入Hudi。

2. 如何部署Hudi作业

写入Hudi的好处是它可以像在YARN/Mesos甚至是K8S群集上运行的任何其他Spark作业一样运行。只需使用Spark UI即可查看写入操作,而无需单独搭建Hudi集群。

3. 如何查询刚写入的Hudi数据集

除非启用了Hive同步,否则与其他任何源一样,通过上述方法写入Hudi的数据集可以简单地通过Spark数据源进行查询。

val hoodieROView = spark.read.format("org.apache.hudi").load(basePath + "/path/to/partitions/*")
val hoodieIncViewDF = spark.read().format("org.apache.hudi")
.option(DataSourceReadOptions.VIEW_TYPE_OPT_KEY(), DataSourceReadOptions.VIEW_TYPE_INCREMENTAL_OPT_VAL())
.option(DataSourceReadOptions.BEGIN_INSTANTTIME_OPT_KEY(), <beginInstantTime>)
.load(basePath);

请注意:当前不支持从Spark数据源读取实时视图。请使用下面的Hive路径。

如果在deltastreamer工具或数据源中启用了Hive Sync,则该数据集会同步到Hive的几张表中,可以使用HiveQL,Presto或SparkSQL进行读取。点击这里查看更多。

4. Hudi如何处理输入中的重复记录

在数据集上执行upsert操作时,提供的记录包含给定键的多条记录,然后通过重复调用有效负载类的preCombine方法将所有记录合并为一个最终值。默认情况下会选择最大值的记录(由compareTo决定)。

对于insertbulk_insert操作,不执行preCombine。因此,如果你的输入包含重复项,则数据集也将包含重复项。如果您不希望重复的记录,请使用upsert或在数据源deltastreamer中指定删除重复数据的配置项。

5. 可以实现自定义合并逻辑处理输入记录和存储的记录吗

与上面类似,定义有效负载类定义的方法(combineAndGetUpdateValue(),getInsertValue()),这些方法控制如何将存储的记录与输入的更新/插入组合以生成最终值以写回到存储中。

6. 如何删除数据集中的记录

GDPR使删除成为数据管理工具箱中的必备工具。Hudi支持软删除和硬删除。有关如何实际执行它们,请参见此处

7. 如何将数据迁移到Hudi

Hudi对迁移提供了内置支持,可使用hudi-cli提供的HDFSParquetImporter工具将整个数据集一次性写入Hudi。也可以使用Spark数据源API读取和写入数据集。迁移后,可以使用此处讨论的常规方法执行写操作。 这里也详细讨论该问题,包括部分迁移的方法。

8. 如何将Hudi配置传递给Spark作业

这里涵盖了数据源和Hudi写入客户端(deltastreamer和数据源都会内部调用)的配置项。在DeltaStreamer之类的工具上调用--help都会打印所有使用选项。许多控制upsert、调整文件大小的选项是在客户端级别定义的,下面是将它们传递给可用于写数据配置项的方式。

1). 对于Spark DataSource,可以使用DataFrameWriter的options API来传递这些配置项。

inputDF.write().format("org.apache.hudi")
.options(clientOpts) // any of the Hudi client opts can be passed in as well
.option(DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY(), "_row_key")
...

2). 直接使用HoodieWriteClient时,只需使用配置来构造HoodieWriteConfig对象。

3). 使用HoodieDeltaStreamer工具提取时,可以在属性文件中设置配置项,并将该文件作为命令行参数 --props传递。

9. 可以在Apache Hive Metastore中注册Hudi数据集吗

可以, 可以通过独立的Hive Sync工具或使用deltastreamer工具数据源中的选项来执行此操作。

10. Hudi索引的工作原理及其好处是什么

索引是Hudi写入的关键部分,它始终将给定的recordKey映射到Hudi内部的文件组(FileGroup)。这样可以更快地识别受给定写入操作影响的文件组。

Hudi支持以下几种索引配置

  • HoodieBloomIndex(默认):使用bloom过滤器和范围信息,并在parquet/基础文件(不久后的日志文件也支持)的页脚中放置该信息。

  • HoodieGlobalBloomIndex:默认索引仅在单个分区内强制执行键的唯一性,即要求用户知道存储给定记录键的分区。这可以帮助非常大的数据集很好地建立索引。但是,在某些情况下,可能需要在所有分区上执行重复数据删除/强制唯一性操作,这就需要全局索引。如果使用此选项,则将传入记录与整个数据集中的文件进行比较,并确保仅在一个分区中存在recordKey

  • HBaseIndex:Apache HBase是一个键值存储,可以将索引存储在HBase内,如果已经在使用HBase,这将会非常方便。

也可以自定义索引,需要实现HoodieIndex类并在配置中配置索引类名称。

Apache Hudi使用问题汇总(一)的更多相关文章

  1. Apache Hudi异步Compaction方式汇总

    本篇文章对执行异步Compaction的不同部署模型一探究竟. 1. Compaction 对于Merge-On-Read表,数据使用列式Parquet文件和行式Avro文件存储,更新被记录到增量文件 ...

  2. 使用Apache Hudi构建大规模、事务性数据湖

    一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk 关于Nishith Agarwal更详细的介绍,主 ...

  3. 在AWS Glue中使用Apache Hudi

    1. Glue与Hudi简介 AWS Glue AWS Glue是Amazon Web Services(AWS)云平台推出的一款无服务器(Serverless)的大数据分析服务.对于不了解该产品的读 ...

  4. 基于Apache Hudi构建数据湖的典型应用场景介绍

    1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...

  5. Apache Hudi 介绍与应用

    Apache Hudi Apache Hudi 在基于 HDFS/S3 数据存储之上,提供了两种流原语: 插入更新 增量拉取 一般来说,我们会将大量数据存储到HDFS/S3,新数据增量写入,而旧数据鲜 ...

  6. 使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据

    将数据存储在Amazon S3中可带来很多好处,包括规模.可靠性.成本效率等方面.最重要的是,你可以利用Amazon EMR中的Apache Spark,Hive和Presto之类的开源工具来处理和分 ...

  7. 官宣!Amazon EMR正式支持Apache Hudi

    ​Apache Hudi是一个开源的数据管理框架,其通过提供记录级别的insert, update, upsert和delete能力来简化增量数据处理和数据管道开发.Upsert指的是将记录插入到现有 ...

  8. 写入Apache Hudi数据集

    这一节我们将介绍使用DeltaStreamer工具从外部源甚至其他Hudi数据集摄取新更改的方法, 以及通过使用Hudi数据源的upserts加快大型Spark作业的方法. 对于此类数据集,我们可以使 ...

  9. Apache Hudi 0.5.1版本重磅发布

    历经大约3个月时间,Apache Hudi 社区终于发布了0.5.1版本,这是Apache Hudi发布的第二个Apache版本,该版本中一些关键点如下 版本升级 将Spark版本从2.1.0升级到2 ...

随机推荐

  1. kindeditor编辑器微软雅黑样式font-family值变成&quot;

    http://www.100cm.cn/article-126-764.html kindeditor编辑器中选中文字, 修改字体(字体名称中带有空格, 例如"Microsoft YaHei ...

  2. JAVA配置系统变量

    CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar JAVA_HOME = C:/Program Files/Java/jdk1 ...

  3. no_expand优化案例

    bond 来看一个烂语句: select a.*,b.dn from temp_allcrmuser a, phs_smc_user b  where a.USERNUMBER=b.dn  and ( ...

  4. 后缀数组 + LCP加速多模式匹配算法 O(m+logn)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  5. AWS Credentials 使用

    AWS的文档系统真是烂到家了!!!!! To connect to any of the supported services with the AWS SDK for Java, you must ...

  6. PhpStorm terminal无法输入命令的解决方法

    下面小编就为大家带来一篇PhpStorm terminal无法输入命令的解决方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   在使用PhpStorm时,点击下面的 ...

  7. linux 存取 I/O 内存

    在一些平台上, 你可能逃过作为一个指针使用 ioremap 的返回值的惩罚. 这样的使用不 是可移植的, 并且, 更加地, 内核开发者已经努力来消除任何这样的使用. 使用 I/O 内 存的正确方式是通 ...

  8. Loj2604开车旅行

    Loj2604开车旅行 我完全没有看出这道题哪里是DP 首先,一个位置向后的最近和第二近我们可以通过set去简单实现 通过维护最大和次大即可 至于高度相同的情况我们可以通过先在set中查询小的来实现 ...

  9. JUnit4---Hamcrest匹配器常用方法总结

    一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expres ...

  10. Linux 内核 标准 PCI 配置寄存器

    一些 PCI 配置寄存器是要求的, 一些是可选的. 每个 PCI 设备必须包含有意 义的值在被要求的寄存器中, 而可选寄存器的内容依赖外设的实际功能. 可选的字段不被 使用, 除非被要求的字段的内容指 ...