Menggunakan Athena untuk menanyakan kumpulan data Apache Hudi - Amazon Athena

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan Athena untuk menanyakan kumpulan data Apache Hudi

Apache Hudi adalah kerangka kerja manajemen data sumber terbuka yang menyederhanakan pemrosesan data tambahan. Tindakan sisipan level catatan, pembaruan, upsert, dan hapus diproses jauh lebih terperinci, mengurangi overhead. Upsert mengacu pada kemampuan untuk menyisipkan catatan ke dalam set data yang ada jika mereka belum ada atau untuk memperbaruinya jika mereka sudah ada.

Hudi menangani peristiwa penyisipan dan pembaruan data tanpa membuat banyak file kecil yang dapat menyebabkan masalah performa untuk analisis. Apache Hudi secara otomatis melacak perubahan dan menggabungkan file sehingga ukurannya tetap optimal. Ini untuk menghindari kebutuhan untuk membangun solusi kustom yang memantau dan menulis ulang banyak file kecil ke dalam file besar yang lebih sedikit.

Set data Hudi cocok untuk kasus penggunaan berikut:

Kumpulan data yang dikelola oleh Hudi disimpan di Amazon S3 menggunakan format penyimpanan terbuka. Saat ini, Athena dapat membaca set data Hudi yang dipadatkan tetapi tidak menulis data Hudi. Athena mendukung hingga Hudi versi 0.8.0 dengan mesin Athena versi 2, dan Hudi versi 0.14.0 dengan mesin Athena versi 3. Ini dapat berubah. Athena tidak dapat menjamin kompatibilitas baca dengan tabel yang dibuat dengan versi Hudi yang lebih baru. Untuk informasi tentang versi mesin Athena, lihat Versi mesin Athena. Untuk informasi selengkapnya tentang fitur dan pembuatan versi Hudi, lihat dokumentasi Hudi di situs web Apache.

Jenis tabel dataset Hudi

Sebuah set data Hudi dapat menjadi salah satu dari tipe berikut:

  • Copy on Write (CoW) – Data disimpan dalam format kolom (Parquet), dan setiap pembaruan membuat versi file baru selama penulisan.

  • Merge on Read (MoR) – Data disimpan menggunakan kombinasi kolom (Parquet) dan format berbasis baris (Avro). Pembaruan dicatat ke file delta berbasis baris dan dipadatkan sesuai kebutuhan untuk membuat file kolom versi baru.

Dengan set data CoW, setiap kali ada pembaruan ke catatan, file yang berisi catatan ditulis ulang dengan nilai yang diperbarui. Dengan set data MoR, setiap kali ada pembaruan, Hudi hanya menulis baris untuk catatan yang berubah. MoR lebih cocok untuk beban kerja tulis atau perubahan berat dengan lebih sedikit pembacaan. CoW lebih cocok untuk beban kerja pembacaan berat pada data yang jarang berubah.

Hudi menyediakan tiga tipe kueri untuk mengakses data:

  • Kueri snapshot — Kueri yang melihat snapshot terbaru dari tabel sebagai tindakan komit atau pemadatan yang diberikan. Untuk tabel MoR, kueri snapshot memapar status terbaru tabel dengan menggabungkan file dasar dan delta potongan file terbaru pada pada saat kueri.

  • Kueri tambahan — Kueri hanya melihat data baru yang ditulis ke tabel, karena komit/pemadatan yang diberikan. Ini secara efektif menyediakan pengaliran perubahan untuk mengaktifkan data pipeline tambahan.

  • Baca kueri yang dioptimalkan — Untuk tabel MoR, kueri melihat data terbaru yang dipadatkan. Untuk tabel CoW, kueri melihat data terbaru yang dikomit.

Tabel berikut menunjukkan kemungkinan tipe kueri Hudi untuk setiap tipe tabel.

Jenis tabel Kemungkinan jenis kueri Hudi
Copy On Write Snapshot, tambahan
Merge On Read snapshot, tambahan, dioptimalkan baca

Saat ini, Athena mendukung kueri snapshot dan dioptimalkan baca, tetapi tidak kueri tambahan. Pada tabel MoR, semua data yang terpapar untuk mengkueri dioptimalkan baca dipadatkan. Ini memberikan performa yang baik tetapi tidak termasuk komit delta terbaru. Kueri snapshot berisi data terbaru tetapi dikenai beberapa overhead komputasi, yang membuat performa kueri ini tidak terlalu baik.

Untuk informasi selengkapnya tentang pengorbanan antara tipe tabel dan kueri, lihat Jenis Tabel & Kueri dalam dokumentasi Apache Hudi.

Perubahan terminologi Hudi: Tampilan sekarang menjadi kueri

Dimulai pada rilis versi 0.5.1, Apache Hudi mengubah beberapa terminologi. Yang sebelumnya tampilan kini disebut kueri dalam rilis berikutnya. Tabel berikut merangkum perubahan antara istilah lama dan baru.

Istilah lama Istilah baru

CoW: tampilan dioptimalkan baca

MoR: tampilan waktu nyata

Kueri snapshot

Tampilan tambahan Kueri tambahan
Tampilan dioptimalkan baca MoR Kueri dioptimalkan baca

Tabel dari operasi bootstrap

Mulai di Apache Hudi versi 0.6.0, fitur operasi bootstrap memberikan performa yang lebih baik dengan set data Parquet yang ada. Sebagai ganti menulis ulang set data, operasi bootstrap dapat menghasilkan metadata saja, meninggalkan set data di tempat.

Anda dapat menggunakan Athena untuk mengkueri tabel dari operasi bootstrap seperti tabel lain berdasarkan data di Amazon S3. Di pernyataan CREATE TABLE, tentukan jalur tabel Hudi Anda di klausa LOCATION.

Untuk informasi lebih lanjut tentang membuat tabel Hudi menggunakan operasi bootstrap di AmazonEMR, lihat artikel Fitur baru dari Apache Hudi tersedia di Amazon EMR di Blog AWS Big Data.

Daftar metadata Hudi

Apache Hudi memiliki tabel metadata yang berisi fitur pengindeksan untuk meningkatkan kinerja seperti daftar file, melewatkan data menggunakan statistik kolom, dan indeks berbasis filter mekar.

Dari fitur-fitur ini, Athena saat ini hanya mendukung indeks daftar file. Indeks daftar file menghilangkan panggilan sistem file seperti “daftar file” dengan mengambil informasi dari indeks yang memelihara partisi ke pemetaan file. Ini menghilangkan kebutuhan untuk daftar secara rekursif setiap partisi di bawah jalur tabel untuk mendapatkan tampilan sistem file. Saat Anda bekerja dengan kumpulan data besar, pengindeksan ini secara drastis mengurangi latensi yang seharusnya terjadi saat mendapatkan daftar file selama penulisan dan kueri. Ini juga menghindari kemacetan seperti pembatasan batas permintaan pada panggilan Amazon S3. LIST

catatan

Athena tidak mendukung lompatan data atau pengindeksan filter mekar saat ini.

Mengaktifkan tabel metadata Hudi

Daftar file berbasis tabel metadata dinonaktifkan secara default. Untuk mengaktifkan tabel metadata Hudi dan fungsionalitas daftar file terkait, atur properti hudi.metadata-listing-enabled tabel ke. TRUE

Contoh

ALTER TABLE SET TBLPROPERTIESContoh berikut memungkinkan tabel metadata pada tabel contohpartition_cow.

ALTER TABLE partition_cow SET TBLPROPERTIES('hudi.metadata-listing-enabled'='TRUE')

Pertimbangan dan batasan

  • Pertanyaan tambahan - Athena tidak mendukung kueri tambahan.

  • CTASAthena tidak mendukung CTASatau INSERT INTO pada data Hudi. Jika Anda ingin dukungan Athena untuk menulis set data Hudi, kirim umpan balik ke .

    Untuk informasi selengkapnya tentang penulisan data Hudi, lihat sumber daya berikut:

  • MSCKREPAIRTABLE— Menggunakan tabel MSCK REPAIR TABLE Hudi di Athena tidak didukung. Jika Anda perlu memuat tabel Hudi yang tidak dibuat AWS Glue, gunakanALTER TABLE ADD PARTITION.

  • Melewatkan objek S3 Glacier tidak didukung - Jika objek di tabel Apache Hudi berada dalam kelas penyimpanan Amazon S3 Glacier, menyetel properti tabel agar tidak berpengaruh. read_restored_glacier_objects false

    Misalnya, Anda mengeluarkan perintah berikut:

    ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')

    Untuk tabel Iceberg dan Delta Lake, perintah menghasilkan kesalahan Kunci properti tabel Tidak didukung: read_restored_glacier_objects. Untuk tabel Hudi, ALTER TABLE perintah tidak menghasilkan kesalahan, tetapi objek Amazon S3 Glacier masih belum dilewati. Menjalankan SELECT kueri setelah ALTER TABLE perintah terus mengembalikan semua objek.

  • Kueri stempel waktu — Saat ini, kueri yang mencoba membaca kolom stempel waktu dalam tabel waktu nyata Hudi gagal atau menghasilkan hasil kosong. Batasan ini hanya berlaku untuk kueri yang membaca kolom stempel waktu. Kueri yang hanya menyertakan kolom non-stempel waktu dari tabel yang sama berhasil.

    Kueri yang gagal mengembalikan pesan yang mirip dengan berikut ini:

    GENERIC_ INTERNAL _ERROR: kelas org.apache.hadoop.io. ArrayWritabletidak dapat dilemparkan ke kelas org.apache.hadoop.hive.serde2.io. TimestampWritableV2 (org.apache.hadoop.io. ArrayWritable dan org.apache.hadoop.hive.serde2.io. TimestampWritableV2 berada dalam modul loader io.trino.server yang tidak disebutkan namanya. PluginClassLoader @75c67992)

Sumber daya tambahan

Untuk sumber daya tambahan tentang penggunaan Apache Hudi dengan Athena, lihat sumber daya berikut.

Video

Video berikut menunjukkan bagaimana Anda dapat menggunakan Amazon Athena untuk mengkueri set data Apache dioptimalkan baca dalam danau data berbasis Amazon S3 Anda.

Unggahan blog

Posting Blog AWS Big Data berikut mencakup deskripsi tentang bagaimana Anda dapat menggunakan Apache Hudi dengan Athena.

Membuat tabel Hudi

Bagian ini memberikan contoh CREATE TABLE pernyataan di Athena untuk tabel data Hudi yang dipartisi dan tidak dipartisi.

Jika Anda memiliki tabel Hudi yang sudah dibuat AWS Glue, Anda dapat menanyakannya langsung di Athena. Saat Anda membuat tabel Hudi yang dipartisi di Athena, Anda harus menjalankan ALTER TABLE ADD PARTITION untuk memuat data Hudi sebelum Anda dapat menanyakannya.

Copy on write (CoW) buat contoh tabel

Tabel CoW yang tidak dipartisi

Contoh berikut membuat tabel CoW tidak dipartisi di Athena.

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://DOC-EXAMPLE-BUCKET/folder/non_partition_cow/'

Tabel CoW yang dipartisi

Contoh berikut membuat tabel CoW dipartisi di Athena.

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://DOC-EXAMPLE-BUCKET/folder/partition_cow/'

Contoh ALTER TABLE ADD PARTITION berikut menambahkan dua partisi ke contoh tabel partition_cow.

ALTER TABLE partition_cow ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_cow/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_cow/two/'

Gabungkan pada read (MoR) buat contoh tabel

Hudi membuat dua tabel di metastore untuk MoR: tabel untuk mengkueri snapshot, dan tabel untuk mengkueri dioptimalkan baca. Kedua tabel dapat dikueri. Dalam versi Hudi sebelum 0.5.1, tabel untuk mengkueri dioptimalkan baca memilini nama yang Anda tentukan saat Anda membuat tabel. Mulai versi Hudi 0.5.1, nama tabel diakhiri dengan _ro secara default. Nama tabel untuk mengkueri snapshot adalah nama yang Anda tentukan ditambah _rt.

Penggabungan yang tidak dipartisi pada tabel baca (MoR)

Contoh berikut membuat tabel MoR tidak dipartisi di Athena kueri yang dioptimalkan baca. Perhatikan bahwa dioptimalkan baca menggunakan format input HoodieParquetInputFormat.

CREATE EXTERNAL TABLE `nonpartition_mor`( `_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://DOC-EXAMPLE-BUCKET/folder/nonpartition_mor/'

Contoh berikut membuat tabel MoR tidak dipartisi di Athena untuk mengkueri snapshot. Untuk kueri snapshot, gunakan format input HoodieParquetRealtimeInputFormat.

CREATE EXTERNAL TABLE `nonpartition_mor_rt`( `_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.realtime.HoodieParquetRealtimeInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/nonpartition_mor/'

Penggabungan yang dipartisi pada tabel baca (MoR)

Contoh berikut membuat tabel MoR dipartisi di Athena untuk mengkueri dioptimalkan baca.

CREATE EXTERNAL TABLE `partition_mor`( `_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://DOC-EXAMPLE-BUCKET/folder/partition_mor/'

Contoh ALTER TABLE ADD PARTITION berikut menambahkan dua partisi ke contoh tabel partition_mor.

ALTER TABLE partition_mor ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/two/'

Contoh berikut membuat tabel MoR dipartisi di Athena untuk mengkueri snapshot.

CREATE EXTERNAL TABLE `partition_mor_rt`( `_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.realtime.HoodieParquetRealtimeInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/'

Demikian pula, contoh berikut ALTER TABLE ADD PARTITION menambahkan dua partisi ke tabel partition_mor_rt contoh.

ALTER TABLE partition_mor_rt ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/two/'

Sumber daya tambahan