翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 リリース履歴」を参照してください。また、「Iceberg でクラスターを使用する」のセクションを参照して、さまざまなフレームワークで Amazon EMR でサポートされている Iceberg 機能を確認してください。
サポートされている最新の Iceberg バージョンを利用するには、最新の Amazon EMR バージョンを使用することをお勧めします。このセクションのコード例と設定は、Amazon EMR リリース emr-7.8.0 を使用していることを前提としています。
Iceberg を使用した Amazon EMR クラスターの作成
Iceberg がインストールされた Amazon EC2 に Amazon EMR クラスターを作成するには、Amazon EMR ドキュメントの指示に従います。
具体的には、クラスターは次の分類で設定する必要があります。
[{ "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }]
Amazon EMR Serverless または Amazon EMR on Amazon EKS を、Amazon EMR 6.6.0 以降の Iceberg ワークロードのデプロイオプションとして使用することもできます。
Amazon EMR での Iceberg アプリケーションの開発
Iceberg アプリケーションの Spark コードを開発するには、Amazon EMR Studio を使用できます。Amazon EMR Studio は、Amazon EMR クラスターで実行されるフルマネージド Jupyter ノートブック用のウェブベースの統合開発環境 (IDE) です。
Amazon EMR Studio ノートブックの使用
Amazon EMR Studio Workspace ノートブックで Spark アプリケーションをインタラクティブに開発し、それらのノートブックを Amazon EC2 クラスターの Amazon EMR または Amazon EKS マネージドエンドポイントの Amazon EMR に接続できます。Amazon EC2 で Amazon EMR 用の EMR Studio を、Amazon EKS で Amazon EMR を設定する手順については、 AWS のサービス ドキュメントを参照してください。
EMR Studio で Iceberg を使用するには、次の手順に従います。
-
「Iceberg がインストールされたクラスターを使用する」の説明に従って、Iceberg を有効にした Amazon EMR クラスターを起動します。
-
EMR Studio をセットアップします。手順については、「Amazon EMR Studio のセットアップ」を参照してください。
-
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>.type": "glue", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }
各パラメータの意味は次のとおりです。
-
<catalog_name>
は Iceberg Spark セッションカタログ名です。任意の名前に置き換え、このカタログに関連付けられているすべての設定で参照を必ず変更してください。コードでは、次のように Spark セッションカタログ名を含む完全修飾テーブル名を使用して Iceberg テーブルを参照できます。<catalog_name>.<database_name>.<table_name>
または、デフォルトのカタログを、 をカタログ名に設定して定義した Iceberg カタログ
spark.sql.defaultCatalog
に変更することもできます。この 2 番目のアプローチでは、カタログプレフィックスなしでテーブルを参照できるため、クエリを簡素化できます。 -
<catalog_name>.warehouse
は、データとメタデータを保存する Amazon S3 パスを指します。 -
カタログを にするには AWS Glue Data Catalog、
spark.sql.catalog.<catalog_name>.type
を に設定しますglue
。このキーは、カスタムカタログ実装の実装クラスを指すために必要です。このガイドの後半にある一般的なベストプラクティスセクションでは、Iceberg がサポートするさまざまなカタログについて説明します。
-
-
他の 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 EC2 クラスターで Amazon EMR に作業を送信するためのさまざまなオプションの概要と各オプションの詳細な手順については、「クラスターに作業を送信する」を参照してください。
-
Amazon EMR on Amazon EKS については、StartJobRun を使用した Spark ジョブの実行」を参照してください。
-
Amazon EMR Serverless については、「ジョブの実行」を参照してください。
以下のセクションでは、各 Amazon EMR デプロイオプションの例を示します。
Amazon EC2 での Amazon EMR
Iceberg Spark ジョブを送信するには、次の手順に従います。
-
ワークステーションに次のコンテンツ
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>.type=glue", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
-
太字で強調表示されている Iceberg 設定オプションをカスタマイズして、特定の Spark ジョブの設定ファイルを変更します。
-
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:
-
ワークステーションに次のコンテンツ
emr_serverless_iceberg.json
を含む ファイルを作成します。{ "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "name": "iceberg-test-job", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [] } }, "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>.type": "glue", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "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/" } } } }
-
太字で強調表示されている Iceberg 設定オプションをカスタマイズして、特定の Spark ジョブの設定ファイルを変更します。
-
を使用してジョブを送信します 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 に送信するには:
-
Amazon EMR Serverless ドキュメントの指示に従ってください。
-
ジョブ設定では、 に用意されている Spark の Iceberg 設定を使用し AWS CLI 、Iceberg の強調表示されたフィールドをカスタマイズします。詳細な手順については、Amazon EMR ドキュメントの「Using Apache Iceberg with EMR Serverless」を参照してください。
Amazon EKS での Amazon EMR
を使用して Iceberg Spark ジョブを Amazon EMR on Amazon EKS に送信するには AWS CLI:
-
ワークステーションに次のコンテンツ
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>.type": "glue", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "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/" } } } }
-
太字で強調表示されている Iceberg 設定オプションをカスタマイズして、Spark ジョブの設定ファイルを変更します。
-
を使用してジョブを送信します 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 CloudWatch のオペレーティングシステム (OS) と YARN メトリクスをモニタリングして、ピーク負荷時のシステムのボトルネック (CPU、メモリ、ストレージ、I/O) を特定し、適切なハードウェアを選択します。
-
チューニング
spark.sql.shuffle.partitions
—spark.sql.shuffle.partitions
プロパティをクラスター内の仮想コア (vCores の合計数、またはその値の倍数 (通常は vCoresの合計数の 1~2 倍) に設定します。この設定は、書き込み分散モードとしてハッシュと範囲のパーティショニングを使用する場合、Spark の並列処理に影響します。データを整理するために書き込む前にシャッフルをリクエストするため、パーティションの整列が保証されます。 -
マネージドスケーリングを有効にする – ほとんどのユースケースでは、マネージドスケーリングと動的割り当てを有効にすることをお勧めします。ただし、予測可能なパターンを持つワークロードがある場合は、自動スケーリングと動的割り当てを無効にすることをお勧めします。マネージドスケーリングが有効になっている場合は、コストを削減するためにスポットインスタンスを使用することをお勧めします。コアノードまたはマスターノードの代わりに、タスクノードにスポットインスタンスを使用します。スポットインスタンスを使用する場合は、フリートごとに複数のインスタンスタイプのインスタンスフリートを使用して、スポットの可用性を確保します。
-
可能な場合はブロードキャスト結合を使用する – テーブルの 1 つが最小ノードのメモリに収まるほど小さく (MBs の順)、等号 (=) 結合を実行している限り、ブロードキャスト (マップサイド) 結合が最も最適な結合です。完全外部結合を除くすべての結合タイプがサポートされています。ブロードキャスト結合は、メモリ内のすべてのワーカーノードに小さなテーブルをハッシュテーブルとしてブロードキャストします。小さなテーブルがブロードキャストされたら、そのテーブルを変更することはできません。ハッシュテーブルは Java 仮想マシン (JVM) にローカルに存在するため、ハッシュ結合を使用して結合条件に基づいて大きなテーブルと簡単にマージできます。ブロードキャスト結合は、シャッフルオーバーヘッドが最小限であるため、高いパフォーマンスを提供します。
-
ガベージコレクターを調整する – ガベージコレクション (GC) サイクルが遅い場合は、パフォーマンスを向上させるために、デフォルトの並列ガベージコレクターから G1GC に切り替えることを検討してください。GC のパフォーマンスを最適化するために、GC パラメータを微調整できます。GC のパフォーマンスを追跡するには、Spark UI を使用してモニタリングできます。理想的には、GC 時間はタスクランタイム全体の 1% 以下である必要があります。