Apache Hudi使用问题汇总(一)
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
决定)。
对于insert
或bulk_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使用问题汇总(一)的更多相关文章
- Apache Hudi异步Compaction方式汇总
本篇文章对执行异步Compaction的不同部署模型一探究竟. 1. Compaction 对于Merge-On-Read表,数据使用列式Parquet文件和行式Avro文件存储,更新被记录到增量文件 ...
- 使用Apache Hudi构建大规模、事务性数据湖
一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk 关于Nishith Agarwal更详细的介绍,主 ...
- 在AWS Glue中使用Apache Hudi
1. Glue与Hudi简介 AWS Glue AWS Glue是Amazon Web Services(AWS)云平台推出的一款无服务器(Serverless)的大数据分析服务.对于不了解该产品的读 ...
- 基于Apache Hudi构建数据湖的典型应用场景介绍
1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...
- Apache Hudi 介绍与应用
Apache Hudi Apache Hudi 在基于 HDFS/S3 数据存储之上,提供了两种流原语: 插入更新 增量拉取 一般来说,我们会将大量数据存储到HDFS/S3,新数据增量写入,而旧数据鲜 ...
- 使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据
将数据存储在Amazon S3中可带来很多好处,包括规模.可靠性.成本效率等方面.最重要的是,你可以利用Amazon EMR中的Apache Spark,Hive和Presto之类的开源工具来处理和分 ...
- 官宣!Amazon EMR正式支持Apache Hudi
Apache Hudi是一个开源的数据管理框架,其通过提供记录级别的insert, update, upsert和delete能力来简化增量数据处理和数据管道开发.Upsert指的是将记录插入到现有 ...
- 写入Apache Hudi数据集
这一节我们将介绍使用DeltaStreamer工具从外部源甚至其他Hudi数据集摄取新更改的方法, 以及通过使用Hudi数据源的upserts加快大型Spark作业的方法. 对于此类数据集,我们可以使 ...
- Apache Hudi 0.5.1版本重磅发布
历经大约3个月时间,Apache Hudi 社区终于发布了0.5.1版本,这是Apache Hudi发布的第二个Apache版本,该版本中一些关键点如下 版本升级 将Spark版本从2.1.0升级到2 ...
随机推荐
- [转]Node.js中package.json中^和~的区别
webpack 项目的package.json 文件列出了项目所依赖的插件和库,同时也给出了对应的版本说明,但是在版本说明前面还有个符号:'^'(插入符号)和'~'(波浪符号),总结了下他们之间的区别 ...
- Cookie内不能直接存入中文,cookie转码以及解码
如果在cookie中存入中文,极易出现问题. js在存入cookie时,利用escape() 函数可对字符串进行编码, 用unescape()进行解码 顺序是先把cookie用escape()函数编码 ...
- pip安装python包时报字符编码错
比如安装scikit-learn时报错: django ascii’ codec can’t encode character 原因是用户目录或用户名存在中文,ascii不能解码,解决办法是在Pyth ...
- springboot2.0.2+redis+spring-session 解决session共享的问题
准备工作 新建两个springboot2.0.2版本的服务,配置文件添加: #在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为 eurek ...
- cccc初赛 L3-003 长城
L3-009. 长城 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 邓俊辉 正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长 ...
- C# double 好用的扩展
在很多代码需要使用数学计算,在用到 double 很难直接判断一个值是 0 或者 1 ,判断两个值相等. 本文提供一个数学扩展,让大家可以简单使用到 double 判断 在开始看本文之前,希望大家是知 ...
- P1050 全排列
题目描述 给定一个正整数n, 按照递增顺序打印数字1到n的所有排列. 输入格式 一个整数n(1<=n<=7). 输出格式 按照递增的顺序输出n的所有排列, 详见样例.请注意,每行末尾不能有 ...
- idea启用列模式的方式小结
(1)alt+鼠标左键----实现的是几个连续列要向上或者向下拉,能够同时操作多行数据. (2)Shift+alt+鼠标左键----可以实现点选跨行的列模式同时操作,而且不通行可以点选不通列,进行跨行 ...
- Python涉及的各个领域以及技术应用
WEB开发 完全主义者高效率框架Django 异步高并发Tornado框架 短小精悍Flask,Bottle框架 网络编程 高并发Twisted网络框架 Python3引入的asyncio异步编程 爬 ...
- ZR 8.31
ZR8.31 题目链接:http://www.zhengruioi.com/contest/388 版权原因,不放题面 A 首先,排序肯定要根据工作经验排序,因为这样便于选择 之后,如果两个人工作经验 ...