なぜAmazon AthenaはAWS Glueとの使用が推奨されるのか
こんにちは、DWS二人目の大島です。
本日は、 AWSにてよくベストプラクティスとして使用されている組み合わせである、
「Amazon Athena + S3 + AWS Glue」が、
「Amazon Athena + S3」のみを使用する場合と比べてどのように便利なのか、
二つのケースを実際に使って試してみました。
この記事は、AWSをあまり触ったことがない方、AWSを勉強中!といった方に向けての記事となります。
私自身エンジニアになってから日が浅いため、
なぜ「AWS Glue」を併用すると便利なのか、がいまいち文字で読むだけでは腹まで落ちてきませんでした。
同じような境遇の方に役立てば、幸いです。
※各種サービスの使用には課金が発生しますので、ご自身でよく判断の上実施ください。
Amazon Athena とは
Amazon Athena はインタラクティブなクエリサービスで、Amazon S3 内のデータを標準 SQL を使用して簡単に分析できます。Athena はサーバーレスなので、インフラストラクチャの管理は不要です。実行したクエリに対してのみ料金が発生します。
AWS公式ページより
S3の中のデータに対して、直接SQLを実行して分析とかができるよ、って感じですが、
文章では、いまいちわかりづらいので、手取り早く使ってみましょう。
まずは、Amazon Athena + S3 のみで実行してみます。
Amazon Athena + S3
まずはSQLを実行する対象のサンプルデータを用意する必要があります。
サンプルデータとS3の準備
今回は以下の、横浜市のオープンデータを使用します。
「外国人人口ー行政区」が、csvでわかりやすく、かつ、日付毎にデータが揃っていて、
結果の確認が簡単そうであったので、使用しています。
外国人人口-行政区 - データセット - 横浜市オープンデータポータル
S3のバケットを作成して中にyokohamaフォルダを作成しています。
こちらのサンプルデータを適当に4つほど、にアップロードします。
バケットは全てデフォルトの設定で作成しています。
今回は2022年7~10月の4つのcsvをアップロードしました。
Amazon Athena の準備
Amazon Athena をコンソールで開き、クエリエディタを選択します。
クエリエディタの画面から、「設定」を選択し、「管理」を押下します。
そこでクエリ結果の出力場所を作成したS3バケットの最上位層とします。
データベースを作成します。
私がひよっこなため理解できていなかったのはこの部分なのですが、
Amazon AthenaでS3に対して、SQLを実行するにはS3内のデータをデータベース化してやらないといけないんですね。
(ここがわかると、AWS Glueを使用する理由も少し腑に落ちます)
ここではtestdatabaseというデータベースを作成しています。
クエリを実行すると、データベースのプルダウンから、先ほど作成したtestdatabaseが選択できるようになるので、
選択肢します。
続いて、データベース内にテーブルを作成していきます。
テーブルととビューのプルダウンから作成を選択し、S3バケットデータを選択します。
テーブル名をtest-yokohamaとします。
データセットでは、データベース化したい対象データを選択するので、
先ほど作成したS3バケットを選択します。
データ形式の部分で、ファイル形式を今回扱うCSVへ変更します。
「列の詳細」にてデータカラムを用意していきます。
csvを確認すると、↓のような感じデータ形式です。
↓のような形で day, code, city, population と4つほどカラムを用意しました。
(全部を定義するのは非常に面倒なので、一旦4つにしました)
ページ最下部まで行き、テーブルを作成を実行すると、クエリが実行されます。
↓のような形でテーブルが作成されています。
クエリの実行
右の「+」ボタンを押して、新しいクエリを記載していきます。
データベースの状態を確認したいので、テーブルから全てのデータを取得します。
↓が取得結果です。
多少空行が入っており無骨ですが、指定したデータはしっかり取得できていますね。
このようにAmazon Athenaでは、
S3の中身に対してデータベースを定義してあげることで、SQLを実行してデータを取得が可能なんですね。
では、次にベストプラクティスとされているAWS Glueを加えて実行していきましょう。
AWS Glueとは
AWS Glue は、サーバーレスなデータ統合サービスで、分析、機械学習 (ML)、アプリケーション開発用に、複数のソースからデータを検出、準備、移動、統合することをより容易にします。
AWS公式ページより
Amazon Athena以上に初心者には難しい表現ですね。
AWS GlueはいわゆるETLツールだそうで、データのExtract(抽出)・Transform(変換)・Load(格納)といった操作を行い、データを加工して集約し、扱いやすくするためのツールだそうです。
早速AWS GlueをAmazon Athenaと組み合わせてみましょう。
AWS Glueの準備
AWS Glueには色々機能があるのですが、今回はその中の「Crawlers」という機能を扱います。
こちらからCreate crawlerを選択して作成していきます。
名前をyokohama-testとします。
「Add a data source」から先ほどのS3バケットをデータソースとして追加します。
データソースの「S3 path」へ、作成したバケットを入力します。
作成したバケットからyokohamaフォルダを選択します。
次のページで、IAMロールの作成を行います。
「Create new IMA role」から必要なロールを作成して、作成したロールを検索して設定します。
次のページへいき、「Output configuration」にて、
先ほどAmazon Athenaで作成したデータベースを選択します。
さらに次のページへ進み、「Create crawler」から実際に作成を行います。
crawlerが作成されたので、実行してみます。
crawlerの実行が完了したので、Amazon Athenaの画面へ移り、
作成されたデータベースを確認してみると、
自動でcsvを解釈して、テーブル内にカラムを作成してくれています!
一つ一つ自分で定義していく必要がなく、非常に手っ取り早いですね。
クエリの実行
↓のように実際にデータを全て取得してみると、
↓のようにしっかりと全てのデータがSQLで取り扱えるようになっています。
まとめ
Amazon Athena でS3にクエリを実行する場合の手順は、
- S3バケット作成
- データベース定義
- クエリ分析
となりますが、このデータベース定義の部分をAWS Glueが自動化してくれます!
手動でやると一つ一つカラムを入力していかなければならないので非常に大変です。
ちょっとしたデータを分析するのであれば、AWS Glueのcrawler作成の方が手間ですが、
基本的にはAWS Glueを併用したほうが圧倒的に楽になります。
以上となります!
Athena + AWS Glue がベストプラクティスとされている所以が触ってみるとよくわかりました。
是非とも試してみてください!