Amazon EMR で実行する Apache Spark - ビッグデータ処理のクラスタ設計とコスト最適化

EMR による Spark クラスタの構築、EMR Serverless との使い分け、スポットインスタンス活用によるコスト最適化を解説します。

EMR の概要

EMR は Apache Spark、Hive、Presto、Flink など 20 以上のビッグデータフレームワークをマネージドクラスタで実行するサービスです。クラスタはマスターノード、コアノード、タスクノードで構成され、EMR がプロビジョニング、設定、パッチ適用を自動管理します。EMR Serverless は 2022 年に GA となったモードで、クラスタの管理が完全に不要です。Spark ジョブを投入するだけで、必要なリソースが自動的にプロビジョニングされます。

コスト最適化

EMR のコスト最適化はインスタンス構成の設計が鍵です。マスターノードとコアノードはオンデマンドインスタンスで安定性を確保し、タスクノードにスポットインスタンスを使用します。タスクノードはデータを保持しないため、スポットの中断時にデータ損失のリスクがありません。インスタンスフリートで複数のインスタンスタイプを指定し、スポットの可用性を向上させます。EMR Serverless は断続的なジョブに適しており、ジョブ実行中のみ課金されます。

Spark チューニングとデータフォーマット

Spark ジョブのパフォーマンスはパーティション数、エグゼキューター設定、データフォーマットの選択に大きく依存します。 spark.sql.shuffle.partitions をデータ量に応じて調整し、デフォルトの 200 から適切な値に変更します。 Parquet 形式はカラムナーストレージで、必要なカラムのみを読み込むため、 CSV と比較してスキャン量と処理時間を大幅に削減します。 Adaptive Query Execution (AQE) を有効にすると、実行時の統計に基づいてシャッフルパーティション数やジョイン戦略を自動最適化します。 Delta Lake や Apache Iceberg のテーブルフォーマットを使うと、 ACID トランザクション、タイムトラベル、スキーマ進化をデータレイク上で実現できます。 EMR に関する実践的なノウハウはAmazon の関連書籍でも確認できます。

EMR クラスターのコスト管理

インスタンスフリートを使うと、複数のインスタンスタイプを指定してスポットの可用性を最大化できます。オンデマンドとスポットの混合比率を設定し、ベースラインをオンデマンドで確保しつつ追加キャパシティをスポットで賄います。EMR Serverless はクラスター管理が不要で、ジョブ実行時間分のみの課金のため、散発的なバッチ処理に最適です。長時間稼働するクラスターには Savings Plans を適用し、コミットメント割引を活用します。CloudWatch メトリクスで YARN のリソース使用率を監視し、過剰なクラスターサイズを検出して適正化します。

まとめ

EMR はビッグデータフレームワークをマネージドに実行するサービスです。Adaptive Query Execution で Spark ジョブのパフォーマンスを自動最適化し、Parquet 形式と適切なパーティション設計でクエリ効率を向上させます。インスタンスフリートでスポットの可用性を最大化し、EMR Serverless で散発的なバッチ処理のコスト効率を高めます。