• 官宣!AWS Athena正式可查询Apache Hudi数据集


    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/'
    
  • 相关阅读:
    MSF——客户端渗透之VBScript感染
    (136)leetcode刷题Python笔记——只出现一次的数字
    两道CTF Web的题目
    (1)leetcode刷题Python笔记——两数之和
    Pikachu漏洞练习平台实验——越权漏洞(八)
    Pikachu漏洞练习平台实验——php反序列化、XXE、SSRF(九)
    MVP Docs Champion (2020)
    Azure DevOps Server 集成操作Windows系统文件管理器
    Azure DevOps Server (TFS) 数据分析Analytics(一):使用OData扩展分析服务数据
    Azure DevOps Server (TFS)搜索功能三:wiki维基搜索
  • 原文地址:https://www.cnblogs.com/leesf456/p/13384444.html
Copyright © 2020-2023  润新知