このトピックでは、E-MapReduce(EMR)で Hudi Metastore を使用する方法について説明します。
背景情報
Hudi がデータに対して操作を実行するたびに、インスタントが追加されます。 データを照会すると、各インスタントのメタデータが読み取られ、インスタントに関連する有効なパーティションまたはファイルが取得されます。 読み取りプロセス中に、システムはパーティション一覧表示操作とファイル一覧表示操作の実行に長時間費やします。これは、これらの操作が大量の I/O ワークロードを引き起こすためです。
データレイクには、インスタントや複数のバージョンのファイルなど、独自のメタデータがあります。 データレイクのスキーマは、従来のテーブルのスキーマとは異なります。 そのため、EMR チームは、Hudi テーブルのインスタントメタデータをホストするためにクラウドに Hudi Metastore を導入し、パーティションとファイルのライフサイクル管理システムを設計しました。 Hudi Metastore を使用することで、パーティションとファイルの一覧表示を高速化できます。
前提条件
EMR V3.45.0 以降のマイナーバージョンのクラスタ、または EMR V5.11.0 以降のマイナーバージョンのクラスタが中国(杭州)、中国(上海)、または中国(北京)リージョンに作成されており、[DLF 統合メタデータ] が [メタデータ] に選択されています。
パラメーター
Hudi Metastore を使用するには、次の操作を実行します。Hudi サービスページの [構成] タブで、[hudi.default.conf] タブをクリックします。 次に、次の表に示すパラメーターを構成します。
| パラメーター | 説明 |
| hoodie.metastore.type | Hudi メタデータの実装モード。有効な値:
|
| hoodie.metadata.enable | Hudi のネイティブメタデータテーブルを使用するかどうかを指定します。有効な値:
|
- メタデータテーブルを使用しない
hoodie.metastore.type=LOCAL hoodie.metadata.enable=false - Hudi のネイティブメタデータテーブルを使用する
hoodie.metastore.type=LOCAL hoodie.metadata.enable=true - EMR の Hudi Metastore のメタデータテーブルを使用する(デフォルト)
hoodie.metastore.type=METASTORE hoodie.metadata.enable=false
例
次の例では、EMR の Hudi Metastore のメタデータテーブルを使用し、Spark SQL CLI を使用して Hudi Metastore の高速化機能を有効にする方法について説明します。
- SSH モードで EMR クラスタにログオンします。 詳細については、「クラスタへのログオン」をご参照ください。
- 次のコマンドを実行して、Spark SQL CLI を開きます。 この例では、Spark 3 を使用します。
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> - 次のコマンドを実行して、Hudi テーブルを作成します。
create table h0( id bigint, name string, price double ) using hudi tblproperties ( primaryKey = 'id', preCombineField = 'id' ) location '/tmp/hudi_cases/h0'; - 次のコマンドを実行して、テーブルにデータを挿入します。
insert into h0 select 1, 'a1', 10; - 次のコマンドを実行して、Spark SQL CLI を終了します。
exit; - 次のコマンドを実行して、Hudi テーブルの hoodie.properties[.hoodie] ディレクトリにある ファイルを表示します。
hdfs dfs -cat /tmp/hudi_cases/h0/.hoodie/hoodie.properties出力にhoodie.metastore.type=METASTOREとhoodie.metastore.table.idが含まれている場合、Hudi Metastore が使用されています。hoodie.metastore.catalog.id= hoodie.table.precombine.field=id hoodie.datasource.write.drop.partition.columns=false hoodie.table.type=COPY_ON_WRITE hoodie.archivelog.folder=archived hoodie.timeline.layout.version=1 hoodie.table.version=5 hoodie.metastore.type=METASTORE hoodie.table.recordkey.fields=id hoodie.datasource.write.partitionpath.urlencode=false hoodie.database.name=test_db hoodie.table.keygenerator.class=org.apache.hudi.keygen.NonpartitionedKeyGenerator hoodie.table.name=h0 hoodie.datasource.write.hive_style_partitioning=true hoodie.metastore.table.id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx hoodie.table.checksum=3349919362 hoodie.table.create.schema={"type"\:"record","name"\:"h0_record","namespace"\:"hoodie.h0","fields"\:[{"name"\:"_hoodie_commit_time","type"\:["string","null"]},{"name"\:"_hoodie_commit_seqno","type"\:["string","null"]},{"name"\:"_hoodie_record_key","type"\:["string","null"]},{"name"\:"_hoodie_partition_path","type"\:["string","null"]},{"name"\:"_hoodie_file_name","type"\:["string","null"]},{"name"\:"id","type"\:["long","null"]},{"name"\:"name","type"\:["string","null"]},{"name"\:"price","type"\:["double","null"]}]}