1. 引入

Apache Hudi是一个开源的增量数据处理框架,提供了行级insert、update、upsert、delete的细粒度处理能力(Upsert表示如果数据集中存在记录就更新;否则插入)。

Hudi处理数据插入和更新,不会创建太多的小文件(小文件会导致查询端性能降低),Apache Hudi自动管理及合并小文件,让其保持指定大小,这避免了自建解决方案来监控和重写小文件为大文件。

Hudi数据集在如下场景下非常适用

  • 使用GDPR和CCPA法规来删除用户个人信息或修改个人信息用途。
  • 处理传感器或IoT设备的流式数据,涉及数据插入和更新。
  • 实现CDC系统

Hudi使用开放的数据格式管理S3的数据集。现在Athena可以查询Hudi数据集,但暂还不支持写入,Athena使用Apache Hudi 0.5.2-incubating版本,0.5.2-incubating版本信息可参考这里

2. Hudi数据集类型

Hudi数据集有如下类型

  • Copy on Write (CoW) – 使用Parquet列式存储,每次更新将会创建一个新版本。
  • Merge on Read (MoR) – 使用Parquet列式 + Avro行式存储,更新将会写入delta日志文件,后面将会和Parquet列式文件进行压缩生成新版本列式文件。

对于CoW数据集,对记录更新时,包含记录的文件将会被重写;对于MoR数据集,对记录更新时,Hudi仅仅只会写更新的值。因此MoR更适合重写的场景,CoW更适合重读场景(数据很少变更)。

Hudi提供了三种逻辑视图来访问数据:

  • Read-optimized 视图 – 提供CoW表最新提交的数据集和MoR表最新压缩的数据集,均读取Parquet文件。
  • Incremental 视图 – 提供CoW表中两次提交的变更流,便于下游ETL作业。
  • Real-time 视图 – 提供MoR表最新提交的数据,在查询时合并列式和行式文件。

现在Athena只支持Read-optimized视图,这提供了更好的查询性能但未包含最新的delta提交。关于数据集类型做的tradeoff,可以参考Hudi文档Storage Types & Views

3. 考虑及限制

  • Athena对Hudi数据集仅支持查询Read-optimized视图

    • 对于CoW类型,Athena支持快照查询;
    • 对于MoR类型,Athena支持读优化查询;
  • Athena对Hudi数据集不支持CTASINSERT INTO,更多关于如何写入Hudi数据集,可参考
  • Athena对Hudi表不支持使用MSCK REPAIR TABLE。如果需要加载非Glue创建的Hudi表,请使用ALTER TABLE ADD PARTITION

4. 创建Hudi表

本部分将提供Athena中创建分区和非分区Hudi表的建表示例。

如果已经在AWS Glue中创建了Hudi表,那么可以直接使用Athena查询。如果在Athena中创建Hudi表,在查询之前必须运行ALTER TABLE ADD PARTITION 来加载数据。

4.1 Copy on Write (CoW)建表示例

4.1.1 非分区CoW表

下面示例会在Athena中创建非分区CoW表

CREATE EXTERNAL TABLE `non_partition_cow`(
`_hoodie_commit_time` string,
`_hoodie_commit_seqno` string,
`_hoodie_record_key` string,
`_hoodie_partition_path` string,
`_hoodie_file_name` string,
`event_id` string,
`event_time` string,
`event_name` string,
`event_guests` int,
`event_type` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://bucket/folder/non_partition_cow'

4.1.2 分区CoW表

下面示例会在Athena中创建分区CoW表

CREATE EXTERNAL TABLE `partition_cow`(
`_hoodie_commit_time` string,
`_hoodie_commit_seqno` string,
`_hoodie_record_key` string,
`_hoodie_partition_path` string,
`_hoodie_file_name` string,
`event_id` string,
`event_time` string,
`event_name` string,
`event_guests` int)
PARTITIONED BY (
`event_type` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://bucket/folder/partition_cow'

下面ALTER TABLE ADD PARTITION示例会添加两个分区到partition_cow

ALTER TABLE partition_cow ADD
PARTITION (event_type = 'one') LOCATION 's3://bucket/folder/partition_cow/one/'
PARTITION (event_type = 'two') LOCATION 's3://bucket/folder/partition_cow/two/'

4.2 Merge on Read (MoR)建表示例

Hudi对于MoR类型将会在Hive Metastore中创建两张表:一张由你指定的表,可提供Read-optimized视图,另一张以_rt结尾的表,可提供Real-time视图。然而当你在Athena创建MoR表时,也只能查询read-optimized视图(real-time视图支持社区正在进行代码Review,不久后可用)。

4.2.1 非分区MoR表

下面示例会在Athena中创建非分区MoR表

CREATE EXTERNAL TABLE `nonpartition_mor_ro`(
`_hoodie_commit_time` string,
`_hoodie_commit_seqno` string,
`_hoodie_record_key` string,
`_hoodie_partition_path` string,
`_hoodie_file_name` string,
`event_id` string,
`event_time` string,
`event_name` string,
`event_guests` int,
`event_type` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://bucket/folder/nonpartition_mor'

4.2.2 分区MoR表

下面示例会在Athena中创建分区MoR表

CREATE EXTERNAL TABLE `partition_mor_ro`(
`_hoodie_commit_time` string,
`_hoodie_commit_seqno` string,
`_hoodie_record_key` string,
`_hoodie_partition_path` string,
`_hoodie_file_name` string,
`event_id` string,
`event_time` string,
`event_name` string,
`event_guests` int)
PARTITIONED BY (
`event_type` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://bucket/folder/partition_mor'

下面ALTER TABLE ADD PARTITION示例会添加两个分区到partition_mor_ro

ALTER TABLE partition_cow ADD
PARTITION (event_type = 'one') LOCATION 's3://bucket/folder/partition_mor/one/'
PARTITION (event_type = 'two') LOCATION 's3://bucket/folder/partition_mor/two/'

官宣!AWS Athena正式可查询Apache Hudi数据集的更多相关文章

  1. 实战 | 将Apache Hudi数据集写入阿里云OSS

    1. 引入 云上对象存储的廉价让不少公司将其作为主要的存储方案,而Hudi作为数据湖解决方案,支持对象存储也是必不可少.之前AWS EMR已经内置集成Hudi,也意味着可以在S3上无缝使用Hudi.当 ...

  2. 写入Apache Hudi数据集

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

  3. Apache Hudi + AWS S3 + Athena实战

    Apache Hudi在阿里巴巴集团.EMIS Health,LinkNovate,Tathastu.AI,腾讯,Uber内使用,并且由Amazon AWS EMR和Google云平台支持,最近Ama ...

  4. 基于 Apache Hudi + Presto + AWS S3 构建开放Lakehouse

    认识Lakehouse 数据仓库被认为是对结构化数据执行分析的标准,但它不能处理非结构化数据. 包括诸如文本.图像.音频.视频和其他格式的信息. 此外机器学习和人工智能在业务的各个方面变得越来越普遍, ...

  5. Apache Hudi助力nClouds加速数据交付

    1. 概述 在nClouds上,当客户的业务决策取决于对近实时数据的访问时,客户通常会向我们寻求有关数据和分析平台的解决方案.但随着每天创建和收集的数据量都在增加,这使得使用传统技术进行数据分析成为一 ...

  6. Apache Hudi C位!云计算一哥AWS EMR 2020年度回顾

    1. 概述 成千上万的客户在Amazon EMR上使用Apache Spark,Apache Hive,Apache HBase,Apache Flink,Apache Hudi和Presto运行大规 ...

  7. 使用Apache Flink 和 Apache Hudi 创建低延迟数据湖管道

    近年来出现了从单体架构向微服务架构的转变.微服务架构使应用程序更容易扩展和更快地开发,支持创新并加快新功能上线时间.但是这种方法会导致数据存在于不同的孤岛中,这使得执行分析变得困难.为了获得更深入和更 ...

  8. 重磅!Vertica集成Apache Hudi指南

    1. 摘要 本文演示了使用外部表集成 Vertica 和 Apache Hudi. 在演示中我们使用 Spark 上的 Apache Hudi 将数据摄取到 S3 中,并使用 Vertica 外部表访 ...

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

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

随机推荐

  1. Solaris 11.4安装,映像包管理系统(IPS)搭建

    文章目录 1.下载地址 2. IPS安装准备 2.1 repo包 2.1 install-repo.ksh 2.2 校验文本 3. Solaris系统安装 3.1 虚拟机软件 3.2 安装os 3.3 ...

  2. 进阿里真的这么难?P8大佬告诉你,你和阿里之间缺的只是这份笔记

    一转眼今年已经到六月份了,在这个过去的半年里有人选择了安稳,有的人偏偏不... 最近小编就有个朋友,去面了个[P8 级架构师],也算是摸摸行情,为后面的一些安排提前做好规划~ 先给大家介绍一下我这个朋 ...

  3. Web前端年后跳槽面试复习指南

    <pliga' 1,="" 'onum'="" 'kern'="" 1;="" margin:="&qu ...

  4. 来看下css边框阴影怎么设置?这些方法掌握后工作更轻松

    我们在网页设计中,通常会使用ps工具来达到图片或者边框阴影.立体等效果.但是如果一些基础效果都需要用p图来完成那就显得效率比较低了.其实可以使用CSS来设置边框阴影,下面本篇文章来给大家介绍一下. 在 ...

  5. 记一次实际开发过程中遇到事务报错问题 Transaction synchronization is not active

    一:问题场景 在一次http请求的后台接口中返回结果中出现了这个错误信息“Transaction synchronization is not active”,意思是“事务同步器没有激活”,但是被调用 ...

  6. python入门008

    目录 一.for循环 作用:for循环是因为在循环取值(即遍历值)时for循环比while循环的使用更为简洁 1.for循环语法: 2.应用案例: 注意:break 与 continue也可以用于fo ...

  7. 如何使用CSS3 调节 tab的高度

    包含大量代码的网页(比如文档或教程)在样式上面对着无法回避的挑战.我们通常使用 <pre> 和 <code> 元素来显示代码,它们具有浏览器所赋予的默认样式.这些默认样式往往是 ...

  8. day05 程序与用户交互和基本运算符

    程序与用户交互和基本运算符 目录 程序与用户交互和基本运算符 1.程序与用户交互 1.1什么是与用户交互 1.2为什么要与用户交互 1.3如何与用户交互 1.3.1格式化输出 2基本运算符 2.1算数 ...

  9. day28 封装

    目录 一.什么是封装 二.将封装的属性进行隐藏操作 1 如何隐藏: 1.1 强行访问: 1.2 内部逻辑 三.为何要封装 一.什么是封装 封装是面向对象的三大特性中最核心的一个特性 封装<==& ...

  10. java 基本语法(十七)Lambda (四)构造器引用与数组引用

    1.构造器引用格式:类名::new 2.构造器引用使用要求:和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致.抽象方法的返回值类型即为构造器所属的类的类型 3.构造器引用举例: / ...