Amazon EMR Serverless で Spark ジョブをサーバーレスに実行 - クラスタ管理不要のビッグデータ処理

EMR Serverless による Spark/Hive ジョブの実行、ジョブランの設計、コスト最適化を解説します。

EMR Serverless の概要

EMR Serverless は Spark と Hive のジョブをサーバーレスに実行するビッグデータ処理サービスで、最大 400 vCPU のワーカーリソースまで自動スケールします。EMR on EC2 がクラスタのインスタンスタイプ、ノード数、Auto Scaling の設定を必要とするのに対し、EMR Serverless はジョブを投入するだけでリソースが自動的にプロビジョニングされます。クラスタのパッチ適用やバージョンアップグレードも不要で、運用負荷をジョブの開発に集中させます。

自動スケーリングと従量課金の仕組み

EMR Serverless の中核的な価値は、ジョブ実行中のみリソースが存在し、完了後にゼロへスケールダウンする点にあります。ジョブ投入時にドライバーとエグゼキューターの vCPU・メモリ上限を指定しますが、実行中はデータ量に応じてエグゼキューター数が秒単位で増減します。課金は実際に消費した vCPU 秒とメモリ GB 秒の積算で、ジョブが終了すればコストはゼロになります。この仕組みにより、1 日 1 回しか走らないバッチ ETL でもクラスタを起動しっぱなしにする無駄がなく、EMR on EC2 で常時稼働クラスタを維持する場合と比較して、稼働率が低いワークロードでは大幅なコスト削減を実現します。

アプリケーション設計と Hive 統合

EMR Serverless のアプリケーションは Spark または Hive のランタイムを選択して作成します。Spark アプリケーションでは PySpark スクリプトを S3 に配置し、ジョブランで実行します。Hive アプリケーションでは HiveQL スクリプトで ETL 処理を記述し、Glue データカタログをメタストアとして使用します。事前初期化ワーカーを設定すると、ジョブ開始時のコールドスタートを回避し、数秒でジョブが開始されます。ジョブランのドライバーとエグゼキューターの vCPU・メモリを個別に指定でき、ジョブの特性に合わせたリソース配分が可能です。S3 のデータを Parquet 形式で格納し、パーティション化することでクエリパフォーマンスを最適化します。 Spark の活用事例を知るうえで関連書籍 (Amazon)が参考になります。

EMR on EC2 / Glue との使い分け

EMR Serverless と似た選択肢に EMR on EC2 と Glue があり、ワークロード特性で使い分けます。EMR on EC2 は GPU インスタンスの利用、カスタム AMI、Presto/Trino クラスタなど Serverless が未対応の機能が必要な場合や、クラスタ稼働率が高く Reserved Instance の割引を活かせる場合に有利です。Glue ETL はビジュアルエディタで ETL パイプラインを構築でき、Data Catalog との一体化とジョブブックマーク (再開機能) が強みですが、Spark のチューニングパラメータへのアクセスが限定的で、大規模な Spark SQL 分析ワークロードには EMR Serverless の方が柔軟です。判断の目安として、ジョブが Spark/Hive の標準機能で完結し、クラスタ稼働率が低い場合は EMR Serverless、Spark 以外のフレームワーク (Flink, HBase) が必要なら EMR on EC2、コーディング不要のビジュアル ETL を優先するなら Glue が適します。

設計のベストプラクティスと落とし穴

EMR Serverless で安定運用するための設計ポイントを 3 つ挙げます。第一に、ジョブランの最大リソース上限を必ず設定し、無限スケールによるコスト暴走を防ぎます。上限未設定のジョブがデータスキューで大量のエグゼキューターを生成し続けると、想定外の請求につながります。第二に、事前初期化ワーカーはジョブ頻度が高い (1 時間に複数回) 場合のみ有効にします。アイドル中も課金されるため、日次バッチに設定すると 23 時間分のアイドルコストが発生し、Serverless の利点を相殺します。第三に、Iceberg テーブルを使う場合はコンパクション戦略を計画します。小さなファイルが蓄積すると Spark のタスク数が爆発し、ジョブ起動時間が長期化します。定期的な OPTIMIZE コマンドの実行をジョブパイプラインに組み込むことで、クエリ性能を維持します。

EMR Serverless の料金

EMR Serverless は vCPU 時間とメモリ GB 時間の従量課金です。vCPU は 1 時間あたり約 0.052 ドル、メモリは 1 GB 時間あたり約 0.0057 ドルです。ジョブが実行されていない間は課金されないため、散発的なバッチ処理で EMR on EC2 より大幅にコスト効率が向上します。事前初期化ワーカーはアイドル状態でも課金されるため、ジョブの頻度に応じて有効・無効を判断します。ジョブランのリソース上限を設定して暴走ジョブのコストを制御し、タイムアウトで自動停止させます。EMR on EC2 との損益分岐点は、クラスターの稼働率が約 30% を下回る場合に Serverless が有利になる傾向があります。

まとめ

EMR Serverless はクラスタ管理不要で Spark/Hive ジョブを実行するサービスです。従量課金でアイドルコストを排除し、事前初期化ワーカーでコールドスタートを回避します。Glue データカタログをメタストアとして使用し、S3 上の Parquet データに対する効率的な ETL 処理を実現します。クラスター稼働率が 30% を下回る環境で EMR on EC2 より有利であり、リソース上限の設定と事前初期化ワーカーの適切な管理がコスト最適化の鍵です。