Amazon EMR Serverless が GA になったので使ってみた

2022.06.02

いわさです。

これまでプライベートプレビューだった、Amazon EMR Serverless がこの度 GA となりました。

このサービスは re:Invent 2021で発表されたものです。

Amazon EMRではいくつかのデプロイオプションが用意されています。
従来のEC2やEKSではクラスターの柔軟なカスタマイズができる反面、クラスターの運用や管理が必要で事前に適切なインスタンスのプロビジョニングも必要でした。
EMR Serverlessでは必要なタイミングで必要なリソースが割り当てられるので、需要の増減が予測出来ない場合やクラスターの運用・管理を避けたい場合に適しています。

本日時点では以下4つのリージョンで利用が可能です。

  • 米国東部(バージニア北部) us-east-1
  • 米国西部(オレゴン) us-west-2
  • アジアパシフィック(東京) ap-northeast-1
  • 欧州(アイルランド) eu-west-1

本日は東京リージョンでアプリケーションとジョブを作成し、実行してみました。

アプリケーション作成

利用の流れとしては、アプリケーションを作成し、アプリケーションに対してジョブを作成します。
これらは、EMR Studioから管理を行います。

まず、アプリケーションの基本設定としてはTypeRelease versionを指定が必要です。
TypeSparkHiveを選択します。
Release versionは本日時点ではemr-6.6.0のみです。v5やv4は使えないのでご注意ください。

なお、EMR Serverless 6.6.0は、Spark 3.2.0 と Hive 3.1.2 をサポートします。
詳細は以下をご確認ください。

Release versions - Amazon EMR

アプリケーション作成時にはクラスターのスペックやインフラ構成のような要素をオプションで指定が可能です。

以下が設定可能です。

  • ウォームプールのための事前の初期化容量の指定
  • コスト管理のためのアプリケーションがスケールアップできる最大容量を指定
  • ジョブ起動・終了時のアプリケーション動作を指定
  • EMRからVPCリソースへアクセスするためのネットワーク構成

なお、EMR Serverlessはリージョナルサービスとなっており、ジョブが送信されると任意のAZで実行されます。
AZに障害が発生した場合は、別の正常なAZで自動的に実行されます。
そのため、VPCリソースにアクセスする場合は、EMR ServerlessのネットワークもマルチAZで構成することが推奨されています。

料金

EMR Serverlessは、ジョブ処理中にワーカーを自動的にスケールアップ/スケールダウンします。
ワーカーが実行を開始してから停止するまでに使用されたvCPU、メモリ、ストレージの合計に対して最小1分で課金されます。

料金詳細は以下をご確認ください。

ジョブ作成

アプリケーション自体はデフォルトあるいはオプションをいくつか選択するだけなのですぐに作成できると思います。
実際にどういう処理を行うかはジョブで定義します。

スクリプトとデータを準備

この記事では以下のサンプルスクリプトを実行したいと思います。

ただし、私のほうで本日東京リージョンで確認した限りではジョブ実行中にタイムアウトが発生し失敗していました。
上記サンプルスクリプトは以下の公開バケットから大量のデータを取得し、集計するものとなっています。

$ aws s3 ls s3://noaa-gsod-pds/2022/
2022-06-01 00:27:50      22729 01001099999.csv
2022-06-01 00:26:43      28333 01001499999.csv
2022-06-01 00:28:36        954 01003099999.csv
2022-06-01 00:27:08       1193 01006099999.csv
2022-06-01 00:27:28      18093 01007099999.csv
2022-06-01 00:27:34      33983 01008099999.csv
2022-06-01 00:27:28        528 01009099999.csv
2022-06-01 00:26:58      33238 01010099999.csv
2022-06-01 00:27:27        535 01015099999.csv
2022-06-01 00:27:27       1193 01016099999.csv
2022-06-01 00:28:00        533 01020099999.csv
2022-06-01 00:28:19      33983 01023099999.csv
2022-06-01 00:28:39      31407 01023199999.csv
2022-06-01 00:28:09        532 01024099999.csv
2022-06-01 00:27:36      33536 01025099999.csv
2022-06-01 00:28:13      21525 01026099999.csv
2022-06-01 00:27:03      21333 01027099999.csv
2022-06-01 00:27:57       4521 01028099999.csv
2022-06-01 00:27:27       1689 01030099999.csv
2022-06-01 00:28:15        528 01033099999.csv
2022-06-01 00:28:39      17859 01036099999.csv
2022-06-01 00:28:18        765 01037099999.csv
2022-06-01 00:27:11        537 01042099999.csv
2022-06-01 00:28:35      28947 01044099999.csv
2022-06-01 00:28:07      23445 01045099999.csv
:

そこで、今回は独自で用意したバケットにデータファイルをいくつかコピーし、スクリプトもそのバケットを参照するようにだけ変更したいと思います。

ファイルは以下のように独自バケットに3つだけコピーしました。

$ aws s3 ls s3://hoge0602emr/2022/
2022-06-02 07:25:18          0 
2022-06-02 07:25:29      22729 01001099999.csv
2022-06-02 07:25:29      28333 01001499999.csv
2022-06-02 07:25:30        954 01003099999.csv

そしてスクリプトは以下のようにハイライト部分を変更したものを独自バケットにアップロードしています。

extreme_weather2.py

:

if __name__ == "__main__":
    """
    Usage: extreme-weather [year]

    Displays extreme weather stats (highest temperature, wind, precipitation) for the given, or latest, year.
    """
    spark = SparkSession.builder.appName("ExtremeWeather").getOrCreate()

    if len(sys.argv) > 1:
        year = sys.argv[1]
    else:
        year = date.today().year

    df = spark.read.csv(f"s3://hoge0602emr/{year}/", header=True, inferSchema=True)
    print(f"The amount of weather readings in {year} is: {df.count()}\n")

:

ポリシー作成

EMR Serverlessではひとつのアプリケーションを共有して複数のジョブを実行出来ますが、ジョブごとにIAMロールを指定することが出来ます。
これによってS3バケットへのアクセスポリシーなどをジョブごとに細かく制御することが出来ます。

ここではS3バケットへのアクセスを許可したIAMロールを作成します。
IAMロールはEMR Serverlessを信頼する必要がありますが、ここでのポイントとしては事前に用意されたAMazon EMR Serverless Service Roleではなく、本日時点ではカスタム信頼ポリシーで設定が必要という点です。

以下はジョブで利用するためのユースケースはありません。

以下のようにカスタム信頼ポリシーでemr-serverless.amazonaws.comを指定します。

ジョブ作成

ここまでで下準備はすんだので、あとはジョブを作成します。
作成したIAMロールやスクリプトを指定します。
今回のサンプルスクリプトでは標準出力に集計結果をprintしているので、そちらを確認するためにAdditional settingsにてS3へのログ出力設定を行っています。

ジョブが実行されるとステータスがRunningとなり、完了するとSuccessに変更されます。

実行結果の確認

ジョブを開くと実行にどの程度の時間がかかって、リソースをどの程度利用したのかが確認出来ます。

前述のとおり標準出力に集計結果が出力されるので確認してみましょう。

$ aws s3 cp s3://hoge0602emr/logs/applications/00f1d743qfq83a25/jobs/00f1d786clh8in01/SPARK_DRIVER/stdout.gz - | gunzip
The amount of weather readings in 2022 is: 222

Here are some extreme weather stats for 2022:
  Highest temperature: 68.0°F on 2022-04-22 at SORSTOKKEN, NO (59.791925, 5.34085)
  Highest all-day average temperature: 61.5°F on 2022-04-22 at SORSTOKKEN, NO (59.791925, 5.34085)
  Highest wind gust: 60.4mph on 2022-03-20 at JAN MAYEN NOR NAVY, NO (70.9333333, -8.6666667)
  Highest average wind speed: 33.6mph on 2022-01-03 at JAN MAYEN NOR NAVY, NO (70.9333333, -8.6666667)
  Highest precipitation: 0.35inches on 2022-01-18 at JAN MAYEN NOR NAVY, NO (70.9333333, -8.6666667)

値の妥当性はここでは検証しませんが、サーバーレス環境でスクリプトが動作して出力出来ていることが確認出来ました。

さいごに

本日はGAとなったEMR Serverlessを使ってみました。

EMRも事前にプロビジョニング計画を立てたりなど、準備に気を使う類のサービスかなと思っていたので、今回サーバーレスになったことでGlueのように気軽に利用してみようというケースが今後増えるのかもしれませんね。

昨年のre:Invent 2021で発表されていましたが、プライベートプレビューだったこともあって情報が少なくどういうものなのか気になっていた方もいらっしゃると思いますが、今回GAになったので今後は誰でも利用可能です。
今後は情報が少しづつ出てくるのかなと期待しています。