官宣!AWS Athena正式にApache Hudiデータセットを検索可能


1.導入
Apache Hudiはオープンソースのインクリメンタルデータ処理フレームワークであり、行レベルinsert、update、upsert、deleteの細粒度処理能力を提供している(Upsertは、データセットにレコードがある場合は更新し、そうでない場合は挿入することを示す).
Hudiはデータの挿入と更新を処理し、小さなファイルをあまり作成しない(小さなファイルはクエリー側のパフォーマンスを低下させる)、Apache Hudiは自動的に小さなファイルを管理し、統合し、指定したサイズを維持し、小さなファイルを大きなファイルとして監視および書き換えるための自己構築ソリューションを回避します.
Hudiデータセットは、次のようなシーンで非常に適しています.
  • は、GDPRおよびCCPA法規を使用して、ユーザの個人情報を削除するか、または個人情報の用途を変更する.
  • は、センサまたはIoTデバイスのストリームデータを処理し、データの挿入および更新に関する.
  • CDCシステム
  • を実現
    Hudiは、オープンデータフォーマットを用いてS 3のデータセットを管理する.AthenaはHudiデータセットを問い合わせることができますが、書き込みはしばらくサポートされていません.AthenaはApache Hudi 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は、データにアクセスするための3つの論理ビューを提供します.
  • Read-optimizedビュー–CoWテーブルが最新にコミットされたデータセットとMoRテーブルが最新に圧縮されたデータセットを提供し、Parquetファイルを読み込みます.
  • ncrementalビュー–CoWテーブルに2回コミットされた変更フローを提供し、下流ETLジョブを容易にします.
  • Real-timeビュー–MoRテーブルが最新にコミットしたデータを提供し、クエリー時にカラムファイルとローファイルをマージします.

  • AthenaはRead-optimizedビューのみをサポートし、最新のdeltaコミットは含まれていませんが、より良いクエリーパフォーマンスを提供します.
    3.考慮及び制限
  • Athena対HudiデータセットはクエリRead-optimizedビュー
  • のみをサポートする
    CoWタイプの場合、Athenaはスナップショットクエリーをサポートします.
    MoRタイプの場合、Athenaは読み取り最適化クエリーをサポートします.
  • Athenaは、CTASまたはINSERT INTOをサポートしないHudiデータセットについて、
  • を参照してください.
    Amazon EMRリリースガイドでHudiデータセットを遊ぶApache Hudiドキュメント:Hudiテーブルを書く
  • Athena対HudiテーブルではMSCK REPAIR TABLEの使用はサポートされていません.Glue以外で作成したHudiテーブルをロードする必要がある場合は、ALTER TABLE ADD PARTION
  • を使用します.
    4.Hudiテーブルの作成
    このセクションでは、Athenaでパーティションおよび非パーティションHudiテーブルを作成するテーブルの例を示します.
    AWSグローバルにHudiテーブルが既に作成されている場合は、Athenaクエリを直接使用できます.AthenaでHudiテーブルを作成する場合は、クエリーの前にALTER TABLE ADD PARTIONを実行してデータをロードする必要があります.
    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_に2つのパーティションを追加します.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に2つのテーブルが作成されます.1つはあなたが指定したテーブルで、Read-optimizedビューを提供し、もう1つは_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_に2つのパーティションを追加します.mor_ロ表
    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/'
    

    ここを見てくれてありがとう.私はプログラマーの麦冬です.java開発業者で、深耕業界は6年になりました.毎日javaに関する技術文章や業界情報を共有しています.
    皆さんの関心と転送を歓迎して、後期には福祉の贈り物があります!