Amazon EMR Serverless で Spark ジョブをサーバーレスに実行 - クラスタ管理不要のビッグデータ処理
EMR Serverless による Spark/Hive ジョブの実行、ジョブランの設計、コスト最適化を解説します。
EMR Serverless の概要
EMR Serverless は Spark と Hive のジョブをサーバーレスに実行するビッグデータ処理サービスで、最大 400 vCPU のワーカーリソースまで自動スケールします。EMR on EC2 がクラスタのインスタンスタイプ、ノード数、Auto Scaling の設定を必要とするのに対し、EMR Serverless はジョブを投入するだけでリソースが自動的にプロビジョニングされます。
ジョブランとコスト最適化
アプリケーションを作成し、Spark または Hive のジョブランを投入します。ジョブランは vCPU とメモリの最大リソースを指定し、実際の使用量に対してのみ課金されます。事前初期化ワーカーはアプリケーションにワーカーを事前にプールし、ジョブの起動時間を数秒に短縮します。S3 のデータレイクに対して Spark SQL でクエリを実行し、Glue Data Catalog のテーブル定義を参照します。Iceberg テーブルフォーマットと組み合わせることで、ACID トランザクションとタイムトラベルクエリを実現します。
アプリケーション設計と Hive 統合
EMR Serverless のアプリケーションは Spark または Hive のランタイムを選択して作成します。 Spark アプリケーションでは PySpark スクリプトを S3 に配置し、ジョブランで実行します。 Hive アプリケーションでは HiveQL スクリプトで ETL 処理を記述し、 Glue データカタログをメタストアとして使用します。事前初期化ワーカーを設定すると、ジョブ開始時のコールドスタートを回避し、数秒でジョブが開始されます。ジョブランのドライバーとエグゼキューターの vCPU ・メモリを個別に指定でき、ジョブの特性に合わせたリソース配分が可能です。 S3 のデータを Parquet 形式で格納し、パーティション化することでクエリパフォーマンスを最適化します。 Spark の活用事例を知るうえで関連書籍 (Amazon)が参考になります。
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 より有利です。