Amazon EMR で Hudi を使用する際の考慮事項と制限事項 - Amazon EMR

Amazon EMR で Hudi を使用する際の考慮事項と制限事項

  • レコードキーフィールドを null または空にすることはできない - レコードキーフィールドとして指定するフィールドには、null または空の値を指定できません。

  • upsert および insert でスキーマがデフォルトで更新される — Hudi にはインターフェイス HoodieRecordPayload が備わっており、これにより、入力 DataFrame と既存の Hudi データセットをマージして、新しい更新されたデータセットを生成する方法が決定されます。Hudi には、このクラスのデフォルト実装 OverwriteWithLatestAvroPayload があります。これにより、入力 DataFrame で指定されているように既存のレコードが上書きされ、スキーマが更新されます。マージおよび部分的な更新を実装するためにこのロジックをカスタマイズするには、DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY パラメータを使用して HoodieRecordPayload インターフェイスの実装を提供できます。

  • 削除にはスキーマが必要 - 削除するときは、レコードキー、パーティションキー、事前結合キーのフィールドを指定する必要があります。他の列は null または空にすることができますが、完全なスキーマが必要です。

  • MoR テーブルの制限 — MOR テーブルではセーブポイントはサポートされていません。Spark SQL、Presto、または Hive から、読み取り最適化ビューまたはリアルタイムビュー (tableName_rt) を使用して MoR テーブルをクエリできます。読み取り最適化ビューを使用した場合、ベースファイルデータのみが公開され、ベースデータとログデータのマージされたビューは公開されません。

  • [Hive]

    • テーブルを Hive メタストアに登録する場合、Hudi では、Hive Thrift サーバーがデフォルトのポート 10000 で実行されていると想定されます。このポートをカスタムポートで上書きする場合は、以下の例に示すように HIVE_URL_OPT_KEY オプションを渡します。

      .option(DataSourceWriteOptions.HIVE_URL_OPT_KEY, "jdbc:hive2://localhost:override-port-number
    • Spark の timestamp データ型は、Hive の timestamp 型としてではなく、Hive の long データ型として登録されます。

  • Presto

    • Presto では、Hudi バージョン 0.6.0 未満の場合、MoR リアルタイムテーブルの読み取りはサポートされていません。

    • Presto は、スナップショットクエリのみをサポートしています。

    • Presto で Hudi データセット列が正しく解釈されるためには、hive.parquet_use_column_names 値を true に設定します。

      • セッションの値を設定するには、Presto シェルで以下のコマンドを実行します。

        set session hive.parquet_use_column_names=true
      • クラスターレベルで値を設定するには、以下の例に示すように、presto-connector-hive 設定分類を使用して hive.parquet.use_column_namestrue に設定します。詳細については、「アプリケーションの設定」を参照してください。

        [ { "Classification": "presto-connector-hive", "Properties": { "hive.parquet.use-column-names": "true" } } ]
  • HBase インデックス

    • Hudi の構築に使用した HBase のバージョンが、EMR リリースガイドに記載されているバージョンと異なる場合があります。Spark セッションに対して正しい依存関係をプルインするには、次のコマンドを実行します。

      spark-shell \ --jars /usr/lib/spark/external/lib/spark-avro.jar,/usr/lib/hudi/cli/lib/*.jar \ --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \ --conf "spark.sql.hive.convertMetastoreParquet=false"