Verwenden von Athena zum Abfragen von Apache-Hudi-Datensätzen - Amazon Athena

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden von Athena zum Abfragen von Apache-Hudi-Datensätzen

Apache Hudi ist ein Open-Source-Datenmanagement-Framework, das die inkrementelle Datenverarbeitung vereinfacht. Einfüge-, Aktualisierungs-, Upsert- und Löschaktionen auf Datensatzebene werden viel granularer verarbeitet, wodurch der Overhead reduziert wird. Upsert bezieht sich auf die Möglichkeit, Datensätze in einen vorhandenen Datensatz einzufügen, wenn sie noch nicht vorhanden sind, oder sie zu aktualisieren, wenn dies der Fall ist.

Hudi verarbeitet Dateneinfügungs- und Aktualisierungsereignisse, ohne viele kleine Dateien zu erstellen, die Leistungsprobleme bei der Analyse verursachen können. Apache Hudi verfolgt automatisch Änderungen und führt Dateien zusammen, damit sie die optimale Größe behalten. Dadurch entfällt die Notwendigkeit, benutzerdefinierte Lösungen zu erstellen, die viele kleine Dateien überwachen und in weniger große Dateien umschreiben.

Hudi-Datensätze eignen sich für die folgenden Anwendungsfälle:

  • Einhaltung von Datenschutzbestimmungen wie der Datenschutz-Grundverordnung (GDPR) und dem California Consumer Privacy Act (CCPA), die das Recht der Menschen auf Entfernung personenbezogener Daten oder Änderung der Verwendung ihrer Daten durchsetzen.

  • Arbeiten mit Streaming-Daten von Sensoren und anderen IoT-Geräten (Internet of Things), die bestimmte Dateneinfüge- und Aktualisierungsereignisse erfordern.

  • Implementieren eines Change-Data-Capture (CDC)-Systems.

Von Hudi verwaltete Datensätze werden mithilfe von offenen Speicherformaten in Amazon S3 gespeichert. Derzeit kann Athena komprimierte Hudi-Datensätze lesen, aber keine Hudi-Daten schreiben. Athena unterstützt bis zu Hudi-Version 0.8.0 mit Athena-Engine-Version 2 und Hudi-Version 0.14.0 mit Athena-Engine-Version 3. Änderungen sind vorbehalten. Athena kann die Lesekompatibilität mit Tabellen, die mit späteren Versionen von Hudi erstellt wurden, nicht garantieren. Weitere Informationen zum Athena-Engine-Versioning finden Sie unter Athena-Engine-Versionierung. Weitere Informationen zu Hudi-Features und Versionsverwaltung finden Sie in der Hudi-Dokumentation auf der Apache-Website.

Hudi-Datensatz-Tabellen-Typen

Ein Hudi-Datensatz kann einen der folgenden Typen haben:

  • Copy on Write (CoW, Beim Schreiben kopieren) – Daten werden in einem spaltenbasierten Format (Parquet) gespeichert, und jedes Update erstellt während eines Schreibvorgangs eine neue Version von Dateien.

  • Merge on Read (MoR, Beim Lesen zusammenführen) – Daten werden mit einer Kombination aus spalten- (Parquet) und zeilenbasierten (Avro) Formaten gespeichert. Updates werden in zeilenbasierten delta-Dateien protokolliert und nach Bedarf komprimiert, um neue Versionen der Spaltendateien zu erstellen.

Bei CoW-Datasets wird jedes Mal, wenn ein Datensatz aktualisiert wird, die Datei, die den Datensatz enthält, mit den aktualisierten Werten neu geschrieben. Bei einem MoR-Datensatz schreibt Hudi jedes Mal, wenn es eine Aktualisierung gibt, nur die Zeile für den geänderten Datensatz. MoR eignet sich besser für schreib- oder änderungsintensive Workloads mit weniger Lesevorgängen. CoW eignet sich besser für leseintensive Workloads für Daten, die sich seltener ändern.

Hudi bietet drei Abfragetypen für den Zugriff auf die Daten:

  • Snapshots – Abfragen, die den neuesten Snapshot der Tabelle ab einer bestimmten Commit- oder Komprimierungsaktion anzeigen. Bei MoR-Tabellen stellen Snapshot-Abfragen den neuesten Status der Tabelle dar, indem die Basis- und Deltadateien des letzten Datei-Slices zum Zeitpunkt der Abfrage zusammengeführt werden.

  • Inkrementelle Abfragen – Abfragen sehen nur neue Daten, die seit einem bestimmten Commit/Komprimierung in die Tabelle geschrieben wurden. Dies bietet effektiv Änderungsströme, um inkrementelle Data-Pipelines zu ermöglichen.

  • Lesen von optimierten Abfragen – Bei MoR-Tabellen sehen Abfragen die neuesten komprimierten Daten. Bei CoW-Tabellen sehen Abfragen die neuesten festgeschriebenen Daten.

Die folgende Tabelle zeigt die möglichen Hudi-Abfragetypen für jeden Tabellentyp.

Tabellentyp Mögliche Hudi-Abfragetypen
Kopieren Sie beim Schreiben Snapshot, inkrementell
Beim Lesen zusammenführen Snapshot, inkrementell, leseoptimiert

Derzeit unterstützt Athena-Snapshot-Abfragen und lese-optimierte Abfragen, aber keine inkrementellen Abfragen. In MoR-Tabellen werden alle Daten, die leseoptimierten Abfragen ausgesetzt sind, komprimiert. Dies bietet eine gute Leistung, enthält jedoch nicht die neuesten Delta-Commits. Snapshot-Abfragen enthalten die aktuellsten Daten, verursachen jedoch einen gewissen Rechenaufwand, wodurch diese Abfragen weniger leistungsfähig sind.

Weitere Informationen zu den Kompromissen zwischen Tabellen- und Abfragetypen finden Sie unter Tabellen- und Abfragetypen in der Apache-Hudi-Dokumentation.

Hudi Terminologieänderung: Ansichten sind jetzt Abfragen

Ab Version 0.5.1 hat Apache Hudi einige seiner Terminologie geändert. Was früher Ansichten waren, werden in späteren Versionen Abfragen genannt. In der folgenden Tabelle werden die Änderungen zwischen dem alten und dem neuen Term zusammengefasst.

Alter Begriff Neuer Begriff

CoW: Lese-optimierte Ansicht

MoR: Echtzeitansicht

Snapshotabfragen

Inkrementelle Ansicht Inkrementelle Abfrage
MoR-Lese-optimierte Ansicht Leseoptimierte Abfrage

Tabellen aus Bootstrap-Operation

Ab Apache Hudi Version 0.6.0 bietet das Bootstrap-Feature eine bessere Leistung mit vorhandenen Parquet-Datensätzen. Anstatt den Datensatz neu zu schreiben, kann ein Bootstrap-Vorgang nur Metadaten generieren und den Datensatz an Ort und Stelle belassen.

Sie können Athena verwenden, um Tabellen aus einem Bootstrap-Vorgang abzufragen, genau wie andere Tabellen, die auf Daten in Amazon S3 basieren. Geben Sie in Ihrer CREATE TABLE-Anweisung den Hudi-Tabellenpfad in Ihrer LOCATION-Klausel an.

Weitere Informationen zum Erstellen von Hudi-Tabellen mithilfe der Bootstrap-Operation in Amazon EMR finden Sie im Artikel Neue Funktionen von Apache Hudi, die in Amazon EMR verfügbar sind, im Big Data-Blog. AWS

Liste der Hudi-Metadaten

Apache Hudi verfügt über eine Metadatentabelle, die Indizierungs-Feature für eine verbesserte Leistung enthält, wie z. B. das Auflisten von Dateien, das Überspringen von Daten mithilfe von Spaltenstatistiken und einen auf Bloomfiltern basierenden Index.

Von diesen Features unterstützt Athena derzeit nur den Dateiauflistungsindex. Der Dateiauflistungsindex eliminiert Dateisystemaufrufe wie „Dateien auflisten“, indem er die Informationen aus einem Index abruft, der die Zuordnung von Partitionen zu Dateien verwaltet. Dadurch entfällt die Notwendigkeit, jede einzelne Partition unter dem Tabellenpfad rekursiv aufzulisten, um einen Überblick über das Dateisystem zu erhalten. Wenn Sie mit großen Datensätzen arbeiten, reduziert diese Indizierung die Latenz, die sonst beim Abrufen der Dateiliste bei Schreib- und Abfragen auftreten würde, drastisch. Außerdem werden Engpässe wie die Drosselung von Anforderungslimits Amazon-S3-LIST-Aufrufen vermieden.

Anmerkung

Athena unterstützt derzeit weder das Überspringen von Daten noch die Bloom-Filter-Indizierung.

Die Hudi-Metadatentabelle aktivieren

Die auf Metadatentabellen basierende Dateiauflistung ist standardmäßig deaktiviert. Um die Hudi-Metadatentabelle und die zugehörige Dateiauflistungsfunktion zu aktivieren, setzen Sie die hudi.metadata-listing-enabled-Tabelleneigenschaft auf TRUE.

Beispiel

Im folgenden ALTER TABLE SET TBLPROPERTIES-Beispiel wird die Metadatentabelle in der partition_cow-Beispieltabelle aktiviert.

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

Überlegungen und Einschränkungen

  • Athena unterstützt keine inkrementellen Abfragen.

  • Athena unterstützt CTAS oder INSERT INTO auf Hudi-Daten nicht. Wenn Sie Athena-Unterstützung beim Schreiben von Hudi-Datensätzen wünschen, senden Sie Feedback an .

    Weitere Informationen zum Schreiben von Hudi-Daten finden Sie in den folgenden Ressourcen:

  • Die Verwendung von MSCK REPAIR TABLE auf Hudi-Tabellen in Athena wird nicht unterstützt. Wenn Sie eine Hudi-Tabelle laden müssen, die nicht in erstellt wurde, verwenden Sie. AWS GlueALTER TABLE ADD PARTITION

  • Überspringen von S3-Glacier-Objekten wird nicht unterstützt – Wenn sich Objekte in der Apache–Hudi-Tabelle in einer Amazon-S3-Glacier-Speicherklasse befinden, hat das Setzen der Tabelleneigenschaft read_restored_glacier_objects auf false keine Auswirkung.

    Angenommen, Sie führen den folgenden Befehl aus:

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

    Bei Iceberg- und Delta-Lake-Tabellen erzeugt der Befehl den Fehler Unsupported table property key: read_restored_glacier_objects. Bei Hudi-Tabellen erzeugt der ALTER TABLE-Befehl keinen Fehler, aber Amazon-S3-Glacier-Objekte werden immer noch nicht übersprungen. Beim Ausführen von SELECT-Abfragen nach dem ALTER TABLE-Befehl werden weiterhin alle Objekte zurückgegeben.

Weitere Ressourcen

Weitere Ressourcen zur Verwendung von Apache Hudi mit Athena finden Sie in den folgenden Ressourcen.

Video

Das folgende Video zeigt, wie Sie mit Amazon Athena ein leseoptimierter Apache-Hudi-Datensatz in Ihrem Amazon-S3-basierten Data Lake abfragen können.

Blog-Posts

In den folgenden AWS Big-Data-Blogbeiträgen wird beschrieben, wie Sie Apache Hudi mit Athena verwenden können.

Erstellen von Hudi-Tabellen

Dieser Abschnitt enthält Beispiele für CREATE-TABLE-Anweisungen in Athena für partitionierte und nicht partitionierte Tabellen von Hudi-Daten.

Wenn Sie bereits Hudi-Tabellen erstellt haben AWS Glue, können Sie diese direkt in Athena abfragen. Wenn Sie in Athena partitionierte Hudi-Tabellen erstellen, müssen Sie ALTER TABLE ADD PARTITION ausführen, um die Hudi-Daten zu laden, bevor Sie sie abfragen können.

Copy on Write (CoW), Tabellenbeispiele erstellen

Nicht partitionierte CoW-Tabelle

Im folgenden Beispiel wird eine unpartitionierte CoW-Tabelle in Athena erstellt.

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/'

Partitionierte CoW-Tabelle

Im folgenden Beispiel wird eine partitionierte CoW-Tabelle in Athena erstellt.

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/'

Im folgenden ALTER TABLE ADD PARTITION-Beispiel werden der partition_cow-Beispieltabelle zwei Partitionen hinzugefügt.

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/'

„Beim Lesen zusammenführen (MoR)“ Tabellenbeispiele erstellen

Hudi erstellt zwei Tabellen im Metastore für MoR: eine Tabelle für Snapshot-Abfragen und eine Tabelle für leseoptimierte Abfragen. Beide Tabellen können abgefragt werden. In Hudi-Versionen vor 0.5.1 hatte die Tabelle für leseoptimierte Abfragen den Namen, den Sie beim Erstellen der Tabelle angegeben haben. Ab Hudi-Version 0.5.1 wird dem Tabellennamen standardmäßig ein _ro angehängt. Der Name der Tabelle für Snapshot-Abfragen ist der Name, den Sie mit angehängtem _rt angegeben haben.

Nicht partitionierte Merge-on-Read (MoR)-Tabelle

Im folgenden Beispiel wird eine nicht partitionierte MoR-Tabelle in Athena für leseoptimierte Abfragen erstellt. Beachten Sie, dass leseoptimierte Abfragen das Eingabeformat HoodieParquetInputFormat verwenden.

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/'

Im folgenden Beispiel wird eine nicht partitionierte MoR-Tabelle in Athena für Snapshot-Abfragen erstellt. Verwenden Sie für Snapshot-Abfragen das Eingabeformat 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/'

Partitionierte Merge-on-Read-(MoR)-Tabelle

Im folgenden Beispiel wird eine partitionierte MoR-Tabelle in Athena für leseoptimierte Abfragen erstellt.

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/'

Im folgenden ALTER TABLE ADD PARTITION-Beispiel werden der partition_mor-Beispieltabelle zwei Partitionen hinzugefügt.

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/'

Im folgenden Beispiel wird eine partitionierte MoR-Tabelle in Athena für Snapshot-Abfragen erstellt.

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/'

Ebenso werden im folgenden ALTER TABLE ADD PARTITION-Beispiel der partition_mor_rt-Beispieltabelle zwei Partitionen hinzugefügt.

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/'

Weitere Ressourcen