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

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

EMR Serverless の概要

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

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

EMR Serverless のアプリケーションは、既定ではジョブの投入で自動的に起動し、15 分アイドルが続くと自動的に停止します。ジョブ投入時にドライバーとエグゼキューターの vCPU / メモリ上限を指定しますが、実行中はデータ量に応じてエグゼキューター数が増減します。課金は、ジョブが使った vCPU やメモリなどのリソースの量に応じて決まります。この仕組みにより、1 日 1 回しか走らないバッチ ETL でもクラスターを起動しっぱなしにする無駄がなく、EMR on EC2 で常時稼働クラスターを維持する場合と比較して、稼働率が低いワークロードではコストを抑えやすくなります。

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

EMR Serverless のアプリケーションは Spark または Hive のランタイムを選択して作成します。Spark アプリケーションでは PySpark スクリプトを S3 に配置し、ジョブランで実行します。Hive アプリケーションでは HiveQL スクリプトで ETL 処理を記述し、Glue データカタログをメタストアとして使用します。事前初期化ワーカーを設定すると、ジョブ開始時のコールドスタートを避けられます。ジョブランのドライバーとエグゼキューターの vCPU / メモリを個別に指定でき、ジョブの特性に合わせたリソース配分が可能です。S3 のデータを Parquet 形式で格納し、パーティション化すると、クエリで読むデータの量を抑えられます。

EMR on EC2 / Glue との使い分け

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

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

EMR Serverless で安定運用するための設計ポイントを 3 つ挙げます。第一に、アプリケーションの最大容量を設定し、想定外のスケールによるコストの増加を防ぎます。最大容量を設定していないアプリケーションでは、ジョブがデータスキューで大量のエグゼキューターを生成し続けると、想定外の請求につながります。第二に、事前初期化ワーカーは、ジョブの頻度が高い場合に向きます。事前初期化した容量はアプリケーションの停止で解放されます。第三に、Iceberg テーブルを使う場合はコンパクション戦略を計画します。小さなファイルがたまると Spark のタスク数が増え、ジョブの起動に時間がかかります。定期的なコンパクションをジョブのパイプラインに組み込み、クエリ性能を保ちます。

EMR Serverless の料金

EMR Serverless は、使ったリソースの量に応じた従量課金です。散発的なバッチ処理では、EMR on EC2 の常時稼働のクラスターよりコストを抑えやすくなります。事前初期化ワーカーはアイドル状態でも課金されるため、ジョブの頻度に応じて有効 / 無効を判断します。ジョブランのリソース上限を設定して暴走ジョブのコストを制御し、タイムアウトで自動停止させます。

まとめ

EMR Serverless はクラスター管理不要で Spark/Hive ジョブを実行するサービスです。従量課金とアイドル時の自動停止でコストを抑え、事前初期化ワーカーでコールドスタートを避けます。Glue データカタログをメタストアとして使用し、S3 上の Parquet データに対する ETL 処理を実行できます。リソースの上限の設定と事前初期化ワーカーの管理が、コストを抑える要点です。

参考資料 (AWS 公式)

本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。

本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。

共有する