Hudi は、Hadoop 互換のファイルシステムでデータを更新および削除し、変更されたデータを使用できるデータレイクフレームワークです。E-MapReduce (EMR) Presto は、関連する JAR パッケージをスタンドアロンの Hudi プラグインに統合します。EMR Hudi コネクタを使用して、Copy on Write (COW) テーブルと Merge on Read (MOR) テーブルをクエリできます。
背景情報
EMR Hudi の詳細については、「Hudi の概要」をご参照ください。
前提条件
Presto サービスを含む Hadoop クラスター、またはスタンドアロンの Presto クラスターが作成されている必要があります。詳細については、「クラスターの作成」をご参照ください。
制限事項
- Hudi コネクタは、EMR V3.38.0 以降の Hadoop または Presto クラスターでのみサポートされます。
- COW テーブルでは、スナップショットクエリのみがサポートされます。
- MOR テーブルでは、スナップショットクエリと読み取り最適化クエリのみがサポートされます。
- 増分クエリはサポートされていません。
Hudi コネクタの設定
Hudi コネクタの設定を変更します。詳細については、「組み込みコネクタの変更」をご参照ください。
デフォルトの Hudi コネクタ設定を表示するには、EMR コンソールの Presto サービスページに移動します。[設定] タブで、[サービス設定] セクションを見つけ、[hudi.properties] タブをクリックします。次の表にパラメーターを示します。ビジネス要件に基づいてパラメーター値を変更してください。
| パラメーター | 説明 |
| hive.recursive-directories | テーブルまたはパーティションの場所のサブディレクトリからのデータ読み取りを有効にします。これは、Hive の hive.mapred.supports.subdirectories プロパティに似ています。 |
| hive.metastore.uri | Thrift プロトコルを使用して Hive メタストアに接続するための URI です。 デフォルト値は |
| hive.config.resources | HDFS 設定ファイルのカンマ区切りリストです。これらのファイルは、すべての Presto ホストに存在する必要があります。 重要 このパラメーターは、HDFS へのアクセスが必須の場合にのみ設定してください。 |
| hive.delta-table-enabled | Presto が Delta Lake テーブルを読み取れるかどうかを指定します。有効な値は次のとおりです。
|
| hive.delta-compatible-mode-enabled | Delta Lake テーブルの互換モードを有効にするかどうかを指定します。有効な値は次のとおりです。
|
| hive.hdfs.impersonation.enabled | ユーザー偽装を有効にするかどうかを指定します。有効な値は次のとおりです。
|
例
Hudi テーブルは、外部 Hive テーブルとして保存できます。Hive コネクタを使用して、Hudi テーブル内のデータをクエリできます。Hudi テーブルを作成して Hive テーブルに同期する方法については、「Spark SQL との Hudi の統合」および「Spark を使用した Hudi へのデータ書き込み」をご参照ください。
次の例では、データを生成してクエリする方法を示します。
- SSH モードで EMR クラスターにログインします。詳細については、「クラスターへのログイン」をご参照ください。
- 次のコマンドを実行して、Spark SQL CLI を開きます。
spark-sql --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'出力に次の情報が含まれている場合、Spark SQL CLI が開かれています。spark-sql> - 次のコマンドを実行して、emr_test という名前のテストテーブルを作成します。
create table if not exists emr_test( id bigint, name string, price double ) using hudi options ( type = 'mor', primaryKey = 'id,name' ); - 次のコマンドを実行して、テストデータを挿入します。
insert into emr_test select 1, 'a2', 10; insert into emr_test select 1, 'a1', 10; insert into emr_test select 2, 'a1', 20;説明 EMR Spark SQL は、Hudi データを DLF または Hive メタストアに自動的に同期します。 - Presto クライアントでデータをクエリします。
- 次のコマンドを実行して、Presto クライアントを開きます。
presto --server emr-header-1:9090 --catalog hudi --schema default --user hadoop - 次のコマンドを実行して、テーブルをクエリします。
select * from emr_test;次の出力が返されます。_hoodie_commit_time | _hoodie_commit_seqno | _hoodie_record_key | _hoodie_partition_path | _hoodie_file_name | id | name | price ---------------------+----------------------+--------------------+------------------------+-------------------------------------------------------------------------+----+------+------- 20211025145616 | 20211025145616_0_1 | id:1,name:a2 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-20-1604_20211025145616.parquet | 1 | a2 | 10.0 20211025145629 | 20211025145629_0_1 | id:1,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-48-3211_20211025145629.parquet | 1 | a1 | 10.0 20211025145640 | 20211025145640_0_2 | id:2,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-76-4818_20211025145640.parquet | 2 | a1 | 20.0 (3 rows)
- 次のコマンドを実行して、Presto クライアントを開きます。
- Spark SQL CLI でデータを更新します。
- 次のコマンドを実行して、Spark SQL CLI を開きます。
spark-sql --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'出力に次の情報が含まれている場合、Spark SQL CLI が開かれています。spark-sql> - `id` が 2 の行の `price` を更新するには、次のコマンドを実行します。
update emr_test set price = price + 20 where id = 2;
- 次のコマンドを実行して、Spark SQL CLI を開きます。
- 更新後、Presto クライアントでデータをクエリします。
- 次のコマンドを実行して、Presto クライアントを開きます。
presto --server emr-header-1:9090 --catalog hudi --schema default --user hadoop - 次のコマンドを実行して、テーブルをクエリします。
select * from emr_test;次の出力が返されます。_hoodie_commit_time | _hoodie_commit_seqno | _hoodie_record_key | _hoodie_partition_path | _hoodie_file_name | id | name | price ---------------------+----------------------+--------------------+------------------------+-------------------------------------------------------------------------+----+------+------- 20211025145616 | 20211025145616_0_1 | id:1,name:a2 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-20-1604_20211025145616.parquet | 1 | a2 | 10.0 20211025145629 | 20211025145629_0_1 | id:1,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-48-3211_20211025145629.parquet | 1 | a1 | 10.0 20211025145640 | 20211025145640_0_2 | id:2,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-76-4818_20211025145640.parquet | 2 | a1 | 40.0 (3 rows)
- 次のコマンドを実行して、Presto クライアントを開きます。