すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:Hudi Metastore の使用

最終更新日:Jan 11, 2025

このトピックでは、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.typeHudi メタデータの実装モード。有効な値:
  • LOCAL:Hudi のネイティブメタデータテーブルを使用します。
  • METASTORE:EMR の Hudi Metastore のメタデータテーブルを使用します。
hoodie.metadata.enableHudi のネイティブメタデータテーブルを使用するかどうかを指定します。有効な値:
  • false:Hudi のネイティブメタデータテーブルを使用しません。
    説明 このパラメーターを false に設定した場合にのみ、EMR の Hudi Metastore のメタデータテーブルを使用できます。
  • true: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 の高速化機能を有効にする方法について説明します。

  1. SSH モードで EMR クラスタにログオンします。 詳細については、「クラスタへのログオン」をご参照ください。
  2. 次のコマンドを実行して、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>
  3. 次のコマンドを実行して、Hudi テーブルを作成します。
    create table h0(
      id bigint,
      name string,
      price double
    ) using hudi
    tblproperties (
       primaryKey = 'id',
       preCombineField = 'id'
    ) location '/tmp/hudi_cases/h0';
  4. 次のコマンドを実行して、テーブルにデータを挿入します。
    insert into h0 select 1, 'a1', 10;
  5. 次のコマンドを実行して、Spark SQL CLI を終了します。
    exit;
  6. 次のコマンドを実行して、Hudi テーブルの hoodie.properties[.hoodie] ディレクトリにある ファイルを表示します。
    hdfs dfs -cat /tmp/hudi_cases/h0/.hoodie/hoodie.properties
    出力に hoodie.metastore.type=METASTOREhoodie.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"]}]}