Amazon EMR Serverless
Apache Spark や Hive のジョブをクラスター管理なしで実行し、処理に使用した vCPU とメモリの時間に対してのみ課金されるサーバーレスビッグデータ処理サービス
概要
Amazon EMR Serverless は、Apache Spark や Hive のジョブをサーバーレスで実行するビッグデータ処理サービスです。クラスターの構築、スケーリング、パッチ適用が一切不要で、ジョブを投入するだけで必要なリソースが自動的にプロビジョニングされます。処理完了後はリソースが解放され、実際に使用した vCPU 時間とメモリ時間に対してのみ課金されます。EMR Runtime for Apache Spark により、OSS 版 Spark に対して最大 3.5 倍の高速化が追加料金なしで適用されます。
アプリケーションとジョブ実行のライフサイクル
EMR Serverless ではまずアプリケーションを作成します。アプリケーションは Spark または Hive のランタイム環境を定義するコンテナで、EMR リリースバージョン (emr-6.x、emr-7.x) を指定します。アプリケーションは CREATED、STARTED、STOPPED の 3 つの状態を持ち、STARTED 状態でジョブを受け付けます。ジョブの投入は StartJobRun API で行い、Spark の場合は JAR ファイルまたは Python スクリプトの S3 パスとエントリポイントを指定します。ジョブが投入されると、EMR Serverless がワーカーを自動的にプロビジョニングし、処理を開始します。ワーカーの起動時間は通常 15-30 秒で、事前初期化ワーカー (Pre-initialized Workers) を設定すれば起動時間をほぼゼロに短縮できます。ジョブの完了後、ワーカーは自動的に解放されます。アプリケーションの自動停止機能を有効にすると、一定時間ジョブがない場合にアプリケーション自体も STOPPED 状態に遷移し、待機コストを完全に排除できます。
ワーカー構成とコスト制御
EMR Serverless のワーカーは vCPU とメモリの組み合わせで定義され、ジョブの特性に応じてカスタマイズできます。デフォルトでは Spark ドライバーに 4 vCPU / 16 GB、エグゼキューターに 4 vCPU / 16 GB が割り当てられますが、メモリ集約型の処理では 4 vCPU / 30 GB のように調整できます。最大ワーカー数を設定することで、ジョブあたりのリソース消費量に上限を設けられます。コスト制御の要は、アプリケーションレベルの最大リソース設定です。maxCapacity で vCPU とメモリの上限を指定すると、すべてのジョブの合計リソースがこの上限を超えないよう制御されます。料金は vCPU 時間あたり約 0.052 USD、メモリ GB 時間あたり約 0.0057 USD で、EMR on EC2 のオンデマンド料金と比較すると単価は高めですが、アイドル時間のコストがゼロのため、バッチ処理やアドホック分析では総コストが低くなるケースが多いです。ジョブの実行ログは S3 に自動出力され、Spark UI も S3 上のログから再構築して確認できます。
S3 データレイクとの統合パターン
EMR Serverless の典型的なアーキテクチャは、S3 をデータレイクとして Spark ジョブで ETL 処理を実行するパターンです。入力データは S3 上の Parquet、ORC、CSV、JSON ファイルで、Glue Data Catalog をメタストアとして使用します。Spark SQL で Glue Data Catalog のテーブルを直接参照でき、パーティションプルーニングやプレディケートプッシュダウンが自動的に適用されます。Apache Iceberg テーブルへの読み書きもサポートされており、ACID トランザクション、スキーマ進化、タイムトラベルクエリを活用した堅牢なデータパイプラインを構築できます。Step Functions と組み合わせて、日次の ETL パイプラインをオーケストレーションするパターンが実務で広く使われています。Step Functions のタスクステートから StartJobRun API を呼び出し、ジョブの完了を待機して次のステップに進む構成です。EventBridge Scheduler で日次トリガーを設定すれば、完全にサーバーレスな定期バッチ処理パイプラインが完成します。