はじめに
こんにちは!クラウドプラットフォーム部の土井です。
今年6月にAmazon EMR ServerlessがGAとなったので遅ればせながらですが、既存のAmazon EMRサービスとの違いにも簡単に触れつつ触ってみたいと思います。
前提知識(Amazon EMR)
Amazon EMR
コンソール操作で自動的にサーバのプロビジョニングとオープンソースの処理フレームワークのデプロイと設定を行い、迅速にビッグデータ処理のためのクラスタを構築できるAWSのManagedサービスです。
処理フレームワークにはビッグデータ処理において主流なSpark、Hive、Prestoなどが利用できるため、データ加工や集計、機械学習など、データ活用の分野において幅広いユースケースで利用することができます。
Amazon EMR Serverlessとは?
- サーバーレスで使えるAmazon EMRです
- 新しいサービスというよりは、従来のEC2やEKSに次ぐ新しいデプロイオプションです
- プロビジョニングやサイジング不要でアプリケーションを作って投げるだけでデータの処理を実行できます
EMRは本来処理フレームワークを使うために必要となる複雑なデプロイ作業を簡素化し、データ活用の敷居を下げることのできる便利なサービスですが、コスト・パフォーマンス共に最適に利用するためにはデータと処理量の需要予測やそれに応じたインスタンスやクラスタのサイジングといった、検討や管理の作業がどうしても必要になります。
EMR Serverlessは文字通りサーバーレスのアーキテクチャで、タスクの実行に必要なクラスタリソースを自動的に割り当て・サイジングしてくれるため、既存のEMRで必要だった検討や管理が不要になります。
Amazon EMR Serverlessをさわってみた
ということで実際にEMR Serverlessのをさわっていきたいと思います。
EMR Serverlessでは処理フレームワークとしてSparkかHiveのいずれかを選択できますが、今回はHiveジョブを実行します。
なお、以降の実施の流れや、準備で使用しているポリシーは基本的にEMR Serverlessの公式ドキュメントを参考にしています。
事前準備
関連AWSリソースの準備
EMR Serverlessは他のAWSサービスと協調して動作するため、それらのリソース自体あるいは、連携を許可するためのIAMロールの準備が必要になります。
連携するサービスは以下です。
サービス | 役割 |
---|---|
Amazon S3 | ・処理対象のデータ格納 ・実行するコードの配置 ・ジョブの出力やログの書き込み先 |
AWS Glue Data Catalog | ・EMR上で作成されたテーブルのメタデータの管理 |
◆S3バケットの作成
S3バケットに関してはこれといって細かい要件はないので作成過程の画面は割愛させていただきます。
つくったもの↓
◆IAMロールの作成
EMR Serverlessでは、IAMロールを使用することでジョブ実行の際にどのAWSサービスのどのリソースに対してアクセスできるか?というアクセス許可を行うことができます。
今回はGlue Data Catalogと上記で作成したS3バケットに対してアクセスができるように設定していきたいと思います。
ロールの作成
IAMコンソールのロールの作成からロール作成画面を開き、以下のようにカスタム信頼ポリシーを設定します。S3、Glue Data Catalogへのアクセス許可ポリシーの作成
ロールに追加するために、S3、Glue Data Catalogへのアクセス許可ポリシーを作成します。
赤枠部分は作成したバケット名に変更します。ロールに対してS3、Glue Data Catalogへのアクセス許可ポリシーをアタッチ
作成したアクセス許可ポリシーをロールにアタッチします。
データの準備
今回は以下のオープンデータを使用してジョブを実行します。
https://registry.opendata.aws/noaa-gsod/
作成したバケットにデータをコピーします。
※全量使うと実行に結構時間がかかりそうだったので、データを一部だけ持ってきて使用することにします。
$ aws s3 cp s3://noaa-gsod-pds/2022/A5125600451.csv s3://poc4emrs/data/2022/
クエリの準備
AWS公式のサンプルクエリを参考にS3バケットに用意したCSVデータのスキーマオンリードを実行します。
https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/hive
以下のようにクエリを作成し、S3にアップロードします。
createdbAndTable.sql
CREATE DATABASE IF NOT EXISTS poc4emrs_db; CREATE EXTERNAL TABLE IF NOT EXISTS `poc4emrs_db`.`noaa_gsod_pds`( `station` string, `date` string, `latitude` string, `longitude` string, `elevation` string, `name` string, `temp` string, `temp_attributes` string, `dewp` string, `dewp_attributes` string, `slp` string, `slp_attributes` string, `stp` string, `stp_attributes` string, `visib` string, `visib_attributes` string, `wdsp` string, `wdsp_attributes` string, `mxspd` string, `gust` string, `max` string, `max_attributes` string, `min` string, `min_attributes` string, `prcp` string, `prcp_attributes` string, `sndp` string, `frshtt` string) PARTITIONED BY (`year` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' LOCATION 's3://poc4emrs/data/' TBLPROPERTIES ('skip.header.line.count'='1'); ALTER TABLE poc4emrs_db.noaa_gsod_pds ADD IF NOT EXISTS PARTITION (year='2022') LOCATION 's3://poc4emrs/data/2022/'; SELECT * FROM poc4emrs_db.noaa_gsod_pds LIMIT 5;
s3 cpコマンドでアップロード。
$ aws s3 cp createAndSelectTable.ql s3://poc4emrs/emr-serverless-hive/query/
以上で事前準備は完了です!!
EMR ServerlessでHiveアプリケーションを作成して実行する
ここからは実際にアプリケーションを実行して結果を見ていきます。
実行までのステップはシンプルで、①アプリケーションの作成、②ジョブの実行 の2ステップでジョブが実行できます。
EMRアプリケーションの作成
アプリケーションの作成はEMR Studioから実行できます。
アプリケーションの名前、タイプ、EMRリリースバージョン、アプリケーションの設定を指定。
なお、ミニマムの設定としてはこれだけでokですので今回はこのまま実行しますが、要件に応じて以下の項目も追加で設定することができます。
- ウォームプールの設定
- ジョブ実行中にアプリケーションがスケールできる最大容量の指定
- ジョブ起動とアプリケーション実行の連動、アイドル状態の待機時間、などのアプリケーションの動作
- EMRからVPCリソース(EC2、RDS、VPCエンドポイント+S3など)にアクセスする際のネットワーク構成
ジョブの実行
アプリケーションの作成が完了したら、いよいよジョブを実行していきます。
IAMロールやスクリプトロケーションには先ほど作成したIAMロールの名前とスクリプトを配置したS3ロケーションを指定します。
また、今回は結果もテーブル作成後の確認としてテーブルのSELECTも仕込んでいるので、内容確認のためにログの出力先も設定します。
ジョブがSubmitされるとアプリケーションが起動されてジョブが実行されます。
アプリケーションの起動ステータスとジョブの実行ステータスはアプリケーションの画面から確認ができます。
ジョブの実行ステータスがSuccessになりました!
出力の設定もしたのでログの方から問題なく実行されているかを確認します。
$ aws s3 cp s3://poc4emrs/emr-serverless-hive/log/applications/00f4c24s6jq7vp0l/jobs/00f4ca12nm6p1u01/HIVE_DRIVER/stdout.gz - | gunzip ... A5125600451 2022-01-01 36.6985 -93.4022 411.2 BRANSON WEST MUNICIPAL EMERSON FIELD AIRPORT, MO US 50.0 19 9999.9 0 9999.9 0 956.5 19 3.2 19 4.9 19 14.0 22.0 57.2 * 26.6 * 99.99 999.9 111000 2022 A5125600451 2022-01-02 36.6985 -93.4022 411.2 BRANSON WEST MUNICIPAL EMERSON FIELD AIRPORT, MO US 18.1 24 14.7 24 9999.9 0 970.5 24 6.5 24 8.6 24 15.0 22.9 24.8 * 14.0 * 99.99 999.9 001000 2022 A5125600451 2022-01-03 36.6985 -93.4022 411.2 BRANSON WEST MUNICIPAL EMERSON FIELD AIRPORT, MO US 23.4 24 15.0 24 9999.9 0 979.2 24 10.0 24 2.6 24 7.0 12.0 42.8 * 14.0 * 0.00 I 999.9 000000 2022 A5125600451 2022-01-04 36.6985 -93.4022 411.2 BRANSON WEST MUNICIPAL EMERSON FIELD AIRPORT, MO US 34.4 24 21.0 24 9999.9 0 970.5 24 10.0 24 5.7 24 14.0 27.0 48.2 * 24.8 * 0.00 I 999.9 000000 2022 A5125600451 2022-01-05 36.6985 -93.4022 411.2 BRANSON WEST MUNICIPAL EMERSON FIELD AIRPORT, MO US 39.1 24 20.7 24 9999.9 0 966.0 24 10.0 24 7.9 24 15.9 22.0 46.4 * 28.4 * 0.00 I 999.9 000000 2022
若干出力は見辛いですが、問題なくテーブルに対してSELECTできていることが確認できました。
ちなみに今回はテーブル作成のジョブだったのでGlue Data Catalogの画面上で作成したテーブルの確認もできます。
さいごに
今回は6月にGAされたEMR Serverlessのジョブ実行をさわってみました。
印象としては細かなリソースの設定が不要でクイックにジョブの実行ができてかなりお手軽に感じました。今回のように簡単なジョブの動作確認にも使えますし、上述の通り処理量の予測がつかずリソースの見積もりが難しいユースケースでも力を発揮するのではないかと思います。
今後は他の分析サービスやHadoopエコシステムについても記事にしていけたらと思っています。
土井 龍史(日本ビジネスシステムズ株式会社)
Hadoopインフラ畑出身のデータエンジニア。主にAzure/AWSのデータ基盤開発を担当しています。最近はデータベース技術全般やデータモデリングに関心があります。
担当記事一覧