はじめに
じゅんじゅんです。
私は以前EMRを使ってETL処理を行っていたデータエンジニアの1人だったのですが、最近またEMRを手軽に使ってみたいと考えるようになり、この検証をしようと考えた次第です。
当時はEC2を選定してその上でEMRを起動させる方法を使っていたのですが、最近だと手軽に始められるEMR StudioやEMR Serverlessのアップデートがあったため、そちらを検証できればと思います。
これからEMRを利用する方々のご助力になれば幸いです。
EMR Studioの初期設定
こちら を参考にEMR Studioの初期設定を行ないます。
まず、AWSコンソールからEMRのサービスページにアクセスし、
EMR Studioの"Studios"から"Studioを作成"
設定オプションをインタラクティブワークロード、その他のリソース名を任意でつけて、作成します。(リソース名はデフォルトのままで問題ありません)
これでStudioの作成ができました。
Studiosに先ほど命名したStudioが生成されたことを確認できます。
そしてこのStudio名をクリックするとEMR Studioの画面に遷移します。
WorkSpacesから先ほど作成したWorkSpaceをクリックすると見慣れたJupyterの画面に遷移します。
こちらでデータ処理の作業を行なっていきます。
Notebook上での作業
このタイミングでEMR StudioのServeless→Applicationsを確認するとServerless_Interactive_App_junjun(初期設定で命名した名前)が起動されていることがわかります。
こちらがNotebookの裏で動いているサーバーの設定となります。logやlimitの制限など多数の設定項目が確認できます。今回は検証なので何もいじらずに進めます。
データの変換およびSQL
s3://inu-is-dog/japan_population_tsv/
配下に以下の日本人口の推移を記録したtsvファイルが配置されています。
このtsvファイルをS3から読み取って男性比率のカラムを追加し、parquetに変換してs3://inu-is-dog/japan_population_parquet/
に出力する をやってみます。
コードを書く前にEMR StudioがS3に対して読み書きをする権限が必要なので、IAMにて、初期設定でアタッチしたEMR StudioのロールにS3へのアクセスの権限を付与します。
今回はインラインポリシーで対応しました。
Jupyterの画面に戻りまして、まずS3のデータを読み取るコードを実行します。
# データの読み取り先のS3パス(ファイル指定でも、フォルダ指定で複数ファイルでもOK)
input_s3_path = "s3://inu-is-dog/japan_population_tsv/"
# S3からtsvファイルを読み取ってデータフレーム(df)に格納する
df = spark.read.csv(input_s3_path, sep=r'\t', header=True)
# データフレームの中身の確認のため標準出力する(デフォルト20行)
df.show()
では、男性比率のカラムman_ratio
を追加するコードを実行しましょう
今回はSpark SQLを使ってみます。
# データフレームをSpark SQLで使えるように登録する
df.createOrReplaceTempView("population_tbl")
# SQLの実行、および実行結果をoutput_dfに格納する
output_df = spark.sql("""
SELECT
*,
man_population / all_population as man_ratio
FROM
population_tbl
""")
# データフレームの中身の確認のため標準出力する
output_df.show()
無事、man_ratioのカラムを追加できました。
では次にこのデータをparquet形式で出力します。
せっかくなのでyear
ごとにパーティション分割した形で出力してみます
output_s3_path = "s3://inu-is-dog/japan_population_parquet/"
output_df.write.mode("overwrite").partitionBy("year").parquet(output_s3_path)
S3の方を見てみましょう。
綺麗にパーティション分割されていますね。素晴らしいです。
これにて検証は以上になります。
終了処理
検証が終わったのでリソースを終了させます。
WorkSpacesから使用していたWorkSpaceを選択し"Stop"の状態にします。
(リソースがもう必要ないということであればDeleteを選択してください)
またApplicationsから使用していたApplicationをStop Applicationします。
EMR Studioの料金
こちらより、
EMR StudioはEMR Serverlessの料金だけを気にすれば良さそうです。
EMR Serverlssの料金は使用するvCPU、メモリ、およびストレージリソースに基づいた従量課金制です。
※2025/02/25時点 東京リージョンの場合
■Linux/x86
1 時間あたりのvCPU 単位:USD 0.065728
1 時間あたりのGB単位:USD 0.007189
■Linux/ARM
1 時間あたりのvCPU 単位:USD 0.052585
1 時間あたりのGB単位:USD 0.005746
所感・まとめ
以前はデータ処理の負荷に応じてEC2を選定してデータ処理を行うというのがルーチン化してしていたのですが、それがないだけでかなりストレスフリーだと感じました。また、Notebookでインタラクティブに結果がわかるのもかなり好感触でした。
今回は、検証ということでEMR StudioのVPCや権限やセキュリティはかなり緩めに設定していたのですが、本格的に使うときにはその設定も必要そうです。それでもEMRは敷居が高いというイメージを払拭できる可能性を感じられました。