Amazon EMR での Apache Iceberg の使用 - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon EMR での Apache Iceberg の使用

Amazon EMR は、Apache Spark、Apache Hive、Flink、Trino などのオープンソースフレームワークを使用して、ペタバイト規模のデータ処理、インタラクティブ分析、機械学習をクラウドで提供します。

注記

このガイドでは、例に Apache Spark を使用します。

Amazon EMR は、Amazon EC2 の Amazon EMR、Amazon EKS の Amazon EMR、Amazon EMR Serverless、 の Amazon EMR の複数のデプロイオプションをサポートしています AWS Outposts。ワークロードのデプロイオプションを選択するには、「Amazon EMR のよくある質問」を参照してください。

バージョンと機能の互換性

Amazon EMR バージョン 6.5.0 以降のバージョンでは、Apache Iceberg がネイティブにサポートされています。各 Amazon EMR リリースでサポートされている Iceberg バージョンのリストについては、Amazon EMR ドキュメントの「Iceberg リリース履歴」を参照してください。また、Amazon EMR で Iceberg を使用する際の考慮事項と制限事項を確認して、さまざまなフレームワークで Amazon EMR でサポートされている Iceberg 機能を確認してください。

サポートされている最新の Iceberg バージョンを利用するには、最新の Amazon EMR バージョンを使用することをお勧めします。このセクションのコード例と設定は、Amazon EMR リリース emr-6.9.0 を使用していることを前提としています。

Iceberg を使用した Amazon EMR クラスターの作成

Iceberg がインストールされた Amazon EC2 に Amazon EMR クラスターを作成するには、Amazon EMR ドキュメント の指示に従います。 

具体的には、クラスターは次の分類で設定する必要があります。

[{ "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }]

Amazon EMR 6.6.0 以降、Amazon EMR Serverless または Amazon EMR on Amazon EKS を Iceberg ワークロードのデプロイオプションとして使用することもできます。

Amazon EMR での Iceberg アプリケーションの開発

Iceberg アプリケーションの Spark コードを開発するには、Amazon EMR Studio を使用できます。これは、Amazon EMR クラスターで実行されるフルマネージド Jupyter Notebook 用のウェブベースの統合開発環境 (IDE) です。 

Amazon EMR Studio ノートブックの使用

Amazon EMR Studio Workspace ノートブックで Spark アプリケーションをインタラクティブに開発し、それらのノートブックを Amazon EC2 クラスターの Amazon EMR または Amazon EKS マネージドエンドポイントの Amazon EMR に接続できます。Amazon Amazon EC2 で Amazon EMR 用の EMR Studio を、Amazon EKS で Amazon EMR をセットアップする手順については、 AWS のサービス ドキュメントを参照してください。

EMR Studio で Iceberg を使用するには、次の手順に従います。 

  1. 「Iceberg Installed でクラスターを使用する」の説明に従って、Iceberg を有効にして Amazon EMR クラスターを起動します。 

  2. EMR Studio をセットアップします。手順については、「Amazon EMR Studio のセットアップ」を参照してください。

  3. EMR Studio Workspace ノートブックを開き、ノートブックの最初のセルとして次のコードを実行して、Iceberg を使用するように Spark セッションを設定します。

    %%configure -f { "conf": { "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }

    各パラメータの意味は次のとおりです。

    • <catalog_name> は Iceberg Spark セッションカタログ名です。カタログの名前に置き換え、このカタログに関連付けられているすべての設定で参照を必ず変更してください。コードでは、次のように、Spark セッションカタログ名を含む完全修飾テーブル名で Iceberg テーブルを参照する必要があります。

      <catalog_name>.<database_name>.<table_name>
    • <catalog_name>.warehouse は、データとメタデータを保存する Amazon S3 パスを指します。

    • カタログを にするには AWS Glue Data Catalog、 <catalog_name>.catalog-impl を に設定しますorg.apache.iceberg.aws.glue.GlueCatalog。このキーは、カスタムカタログ実装の実装クラスを指すために必要です。このガイドの後半にある「一般的なベストプラクティス」セクションでは、Iceberg がサポートするさまざまなカタログについて説明します。

    • Amazon S3 マルチパートアップロードを利用して高並列処理を実現する<catalog_name>.io-implには、 org.apache.iceberg.aws.s3.S3FileIOとして を使用します。 Amazon S3

  4. 他の Spark アプリケーションと同様に、ノートブックで Iceberg 用の Spark アプリケーションをインタラクティブに開発できるようになりました。

Amazon EMR Studio を使用して Spark for Apache Iceberg を設定する方法の詳細については、ブログ記事「Build a high-performance, ACID compliant, evolving data lake using Apache Iceberg on Amazon EMR」を参照してください。 

Amazon EMR での Iceberg ジョブの実行

Iceberg ワークロードの Spark アプリケーションコードを作成したら、Iceberg をサポートする任意の Amazon EMR デプロイオプションで実行できます (Amazon EMR のよくある質問 を参照)。

他の Spark ジョブと同様に、ステップを追加するか、Spark ジョブをマスターノードにインタラクティブに送信することで、Amazon EC2 クラスター上の Amazon EMR に作業を送信できます。Spark ジョブを実行するには、次の Amazon EMR ドキュメントページを参照してください。

以下のセクションでは、各 Amazon EMR デプロイオプションの例を示します。

Amazon EC2 での Amazon EMR

Iceberg Spark ジョブを送信するには、次の手順に従います。

  1. ワークステーションに次のコンテンツemr_step_iceberg.jsonを含む ファイルを作成します。

    [{ "Name": "iceberg-test-job", "Type": "spark", "ActionOnFailure": "CONTINUE", "Args": [ "--deploy-mode", "client", "--conf", "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "--conf", "spark.sql.catalog.<catalog_name>=org.apache.iceberg.spark.SparkCatalog", "--conf", "spark.sql.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "--conf", "spark.sql.catalog.<catalog_name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
  2. 太字で強調表示されている Iceberg 設定オプションをカスタマイズして、特定の Spark ジョブの設定ファイルを変更します。

  3. AWS Command Line Interface () を使用してステップを送信しますAWS CLI。emr_step_iceberg.json ファイルが配置されているディレクトリで コマンドを実行します。

    aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json

Amazon EMR Serverless

を使用して Iceberg Spark ジョブを Amazon EMR Serverless に送信するには AWS CLI:

  1. ワークステーションに次のコンテンツemr_serverless_iceberg.jsonを含む ファイルを作成します。

    { "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars /usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar", "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. 太字で強調表示されている Iceberg 設定オプションをカスタマイズして、特定の Spark ジョブの設定ファイルを変更します。

  3. を使用してジョブを送信します AWS CLI。emr_serverless_iceberg.json ファイルが配置されているディレクトリで コマンドを実行します。

    aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json

EMR Studio コンソールを使用して Iceberg Spark ジョブを Amazon EMR Serverless に送信するには:

  1. 「Amazon EMR Serverless ドキュメント」の指示に従ってください。

  2. ジョブ設定 では、 に用意されている Spark の Iceberg 設定を使用し AWS CLI 、Iceberg の強調表示されたフィールドをカスタマイズします。詳細な手順については、Amazon EMR ドキュメントの「Using Apache Iceberg with EMR Serverless」を参照してください。

Amazon EKS での Amazon EMR

を使用して Iceberg Spark ジョブを Amazon EKS 上の Amazon EMR に送信するには AWS CLI:

  1. ワークステーションに次のコンテンツemr_eks_iceberg.jsonを含む ファイルを作成します。

    { "name": "iceberg-test-job", "virtualClusterId": "<VIRTUAL_CLUSTER_ID>", "executionRoleArn": "<ROLE_ARN>", "releaseLabel": "emr-6.9.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. 太字で強調表示されている Iceberg 設定オプションをカスタマイズして、Spark ジョブの設定ファイルを変更します。

  3. を使用してジョブを送信します AWS CLI。emr_eks_iceberg.json ファイルが配置されているディレクトリで次のコマンドを実行します。

    aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json

詳細な手順については、Amazon EMR on EKS ドキュメントの「Amazon EMR on EKS での Apache Iceberg の使用」を参照してください。 

Amazon EMR のベストプラクティス

このセクションでは、Amazon EMR で Spark ジョブを調整して、Iceberg テーブルへのデータの読み取りと書き込みを最適化するための一般的なガイドラインを示します。Iceberg 固有のベストプラクティスについては、このガイドの後半にある「ベストプラクティス」セクションを参照してください。

  • 最新バージョンの Amazon EMR を使用する – Amazon EMR は、Amazon EMR Spark ランタイムで Spark 最適化をすぐに提供します。 AWS は、新しいリリースごとに Spark ランタイムエンジンのパフォーマンスを向上させます。

  • Spark ワークロードに最適なインフラストラクチャを決定する – Spark ワークロードでは、最適なパフォーマンスを確保するために、ジョブ特性ごとに異なるタイプのハードウェアが必要になる場合があります。Amazon EMR は、すべてのタイプの処理要件に対応するために、複数のインスタンスタイプ (コンピューティング最適化、メモリ最適化、汎用、ストレージ最適化など) をサポートしています。新しいワークロードをオンボードするときは、M5 や M6g などの一般的なインスタンスタイプでベンチマークすることをお勧めします。Ganglia と Amazon のオペレーティングシステム (OS) と YARN メトリクスをモニタリング CloudWatch して、ピーク負荷時のシステムのボトルネック (CPU、メモリ、ストレージ、I/O) を特定し、適切なハードウェアを選択します。

  • チューニング spark.sql.shuffle.partitionsspark.sql.shuffle.partitionsプロパティをクラスター内の仮想コア (vCores ) の合計数、またはその値の倍数 (通常は vCores の合計数の 1~2 倍) に設定します。この設定は、書き込み分散モードとしてハッシュパーティショニングと範囲パーティショニングを使用する場合に、Spark の並列処理に影響します。データを整理するために書き込む前にシャッフルをリクエストするため、パーティションの配置が保証されます。

  • マネージドスケーリングを有効にする – ほぼすべてのユースケースで、マネージドスケーリングと動的割り当てを有効にすることをお勧めします。ただし、予測可能なパターンを持つワークロードがある場合は、自動スケーリングと動的割り当てを無効にすることをお勧めします。マネージドスケーリングが有効になっている場合は、スポットインスタンスを使用してコストを削減することをお勧めします。コアノードまたはマスターノードの代わりに、タスクノードにスポットインスタンスを使用します。スポットインスタンスを使用する場合は、フリートごとに複数のインスタンスタイプのインスタンスフリートを使用して、スポットの可用性を確保します。

  • 可能な場合はブロードキャスト結合を使用する – ブロードキャスト (マップサイド) 結合は、最小ノードのメモリに収まるのに十分な大きさ (MBs) のテーブルの 1 つで、等号 (=) 結合を実行している限り、最適な結合です。完全外部結合を除くすべての結合タイプがサポートされています。ブロードキャスト結合は、メモリ内のすべてのワーカーノードに小さなテーブルをハッシュテーブルとしてブロードキャストします。小さなテーブルがブロードキャストされると、そのテーブルを変更することはできません。ハッシュテーブルは Java 仮想マシン (JVM) にローカルに存在するため、ハッシュ結合を使用して結合条件に基づいて大きなテーブルと簡単にマージできます。ブロードキャスト結合は、シャッフルオーバーヘッドが最小限であるため、高いパフォーマンスを提供します。

  • ガベージコレクターを調整する – ガベージコレクション (GC) サイクルが遅い場合は、パフォーマンスを向上させるためにデフォルトの並列ガベージコレクターから G1GC に切り替えることを検討してください。GC のパフォーマンスを最適化するために、GC パラメータを微調整できます。GC のパフォーマンスを追跡するには、Spark UI を使用してモニタリングできます。GC 時間は、タスクランタイムの合計の 1% 以下であることが理想的です。