

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

# Amazon EMR での Iceberg の使用
<a name="iceberg-emr"></a>

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

**注記**  
このガイドでは、Apache Spark を例として使用します。

Amazon EMR は、EC2 上の Amazon EMR、EKS 上の Amazon EMR、Amazon EMR Serverless、Amazon EMR の複数のデプロイオプションをサポートしています AWS Outposts。ワークロードのデプロイオプションを選択するには、[Amazon EMR のよくある質問](https://aws.amazon.com/emr/faqs/)を参照してください。

## バージョンと機能の互換性
<a name="emr-version"></a>

Amazon EMR バージョン 6.5.0 以降のバージョンでは、Apache Iceberg がネイティブにサポートされています。各 Amazon EMR リリースでサポートされている Iceberg バージョンのリストについては、Amazon EMR ドキュメントの[「Iceberg リリース履歴](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/Iceberg-release-history.html)」を参照してください。また、「[Iceberg でクラスター](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-cluster.html)を使用する」のセクションを参照して、さまざまなフレームワークで Amazon EMR でサポートされている Iceberg 機能を確認してください。

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

## Iceberg を使用した Amazon EMR クラスターの作成
<a name="emr-cluster"></a>

Iceberg がインストールされた Amazon EC2 に Amazon EMR クラスターを作成するには、[Amazon EMR ドキュメント](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-cluster.html)の指示に従います。 

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

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

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

## Amazon EMR での Iceberg アプリケーションの開発
<a name="emr-apps"></a>

Iceberg アプリケーションの Spark コードを開発するには、[Amazon EMR Studio を使用できます。Amazon EMR Studio](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio.html) は、Amazon EMR クラスターで実行されるフルマネージド Jupyter ノートブック用のウェブベースの統合開発環境 (IDE) です。 

### Amazon EMR Studio ノートブックの使用
<a name="emr-notebooks"></a>

Amazon EMR Studio Workspace ノートブックで Spark アプリケーションをインタラクティブに開発し、それらのノートブックを EC2 クラスターの Amazon EMR または EKS マネージドエンドポイントの Amazon EMR に接続できます。[EC2](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-set-up.html) での Amazon EMR 用 EMR Studio と [EKS での Amazon EMR ](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-create-eks-cluster.html)のセットアップ手順については、 AWS のサービス ドキュメントを参照してください。

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

1. 「Iceberg がインストールされたクラスターを使用する[」の説明に従って、Iceberg を有効にした Amazon EMR クラスター](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-cluster.html)を起動します。 

1. EMR Studio をセットアップします。手順については、[「Amazon EMR Studio のセットアップ](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-set-up.html)」を参照してください。

1. 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`。このキーは、カスタムカタログ実装の実装クラスを指すために必要です。このガイドの後半にある[一般的なベストプラクティス](best-practices-general.md)セクションでは、Iceberg がサポートするさまざまなカタログについて説明します。

1. 他の 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](https://aws.amazon.com/blogs/big-data/build-a-high-performance-acid-compliant-evolving-data-lake-using-apache-iceberg-on-amazon-emr/)」を参照してください。 

### Amazon EMR での Iceberg ジョブの実行
<a name="emr-running-iceberg"></a>

Iceberg ワークロードの Spark アプリケーションコードを作成したら、Iceberg をサポートする任意の Amazon EMR デプロイオプションで実行できます ([Amazon EMR のよくある質問](https://aws.amazon.com/emr/faqs/#Deployment_options)を参照）。

他の Spark ジョブと同様に、ステップを追加するか、Spark ジョブをマスターノードにインタラクティブに送信することで、Amazon EMR on EC2 クラスターに作業を送信できます。Spark ジョブを実行するには、次の Amazon EMR ドキュメントページを参照してください。
+ EC2 クラスターで Amazon EMR に作業を送信するためのさまざまなオプションの概要と各オプションの詳細な手順については、[「クラスターに作業を送信する](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)」を参照してください。
+ Amazon EMR on EKS については、[StartJobRun を使用した Spark ジョブの実行](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs.html)」を参照してください。
+ EMR Serverless については、[「ジョブの実行](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs.html)」を参照してください。

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

#### Amazon EMR on EC2
<a name="emr-ec2"></a>

以下の手順を使用して 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>.type=glue",
           "--conf",
           "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/",
           "s3://YOUR-BUCKET-NAME/code/iceberg-job.py"
       ]
   }]
   ```

1. 太字で強調表示されている Iceberg 設定オプションをカスタマイズして、特定の Spark ジョブの設定ファイルを変更します。

1.  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
<a name="emr-serverless"></a>

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

1. ワークステーションに次のコンテンツ`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/"
               }
           }
       }
   }
   ```

1. 太字で強調表示されている Iceberg 設定オプションをカスタマイズして、特定の Spark ジョブの設定ファイルを変更します。

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

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

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

1. [EMR Serverless ドキュメント](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs-studio.html)の指示に従ってください。

1. **ジョブ設定**では、 に用意されている Spark の Iceberg 設定を使用し AWS CLI 、Iceberg の強調表示されたフィールドをカスタマイズします。詳細な手順については、Amazon [EMR ドキュメントの「Using Apache Iceberg with EMR Serverless](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/using-iceberg.html)」を参照してください。

#### Amazon EMR on EKS
<a name="emr-eks"></a>

を使用して Iceberg Spark ジョブを Amazon EMR on EKS に送信するには 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>.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/"
               }
           }
       }
   }
   ```

1. 太字で強調表示されている Iceberg 設定オプションをカスタマイズして、Spark ジョブの設定ファイルを変更します。

1. を使用してジョブを送信します 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](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/tutorial-iceberg.html) の使用」を参照してください。 

## Amazon EMR のベストプラクティス
<a name="emr-best-practices"></a>

このセクションでは、Amazon EMR で Spark ジョブを調整して、Iceberg テーブルへのデータの読み取りと書き込みを最適化するための一般的なガイドラインを提供します。Iceberg 固有のベストプラクティスについては、このガイドの後半にある[「ベストプラクティス](best-practices.md)」セクションを参照してください。
+ **Amazon EMR の最新バージョン**を使用する – Amazon EMR は、Amazon EMR Spark ランタイムで Spark 最適化をすぐに提供します。 AWS は、新しいリリースごとに Spark ランタイムエンジンのパフォーマンスを向上させます。
+ **Spark ワークロードに最適なインフラストラクチャを決定する** – Spark ワークロードでは、最適なパフォーマンスを確保するために、ジョブ特性ごとに異なるタイプのハードウェアが必要になる場合があります。Amazon EMR は、すべてのタイプの処理要件をカバーするために、[複数のインスタンスタイプ (コンピューティング最適化、メモリ最適化、汎用、ストレージ最適化など) をサポートしています](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-supported-instance-types.html)。新しいワークロードをオンボードするときは、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% 以下である必要があります。