AWSのサービスを活用したビッグデータ分析基盤
今日、様々なサービスで大量のデータが発生し、それを分析するニーズが出てきています。
その中で、ビッグデータ分析基盤としてAWSの各サービスを組み合わせる例が増えてきています。
ここでは下記の流れでどうやって分析基盤を構成するかを考えてみます。
IoTのデータや、サービスのログなどをKinesis FirehoseでS3に保存(前段としてAWS IoTがあったり、サービス自体が出しているログがあったり、など)
↓
AWS Glueでカタログ(Athenaで分析するためのテーブルのようなもの)作成
↓
Athenaでクエリを投入、分析
(さらに、QuickSightで可視化など)
サービスの追加やアップデートなどで今後もっと組み合わせやすくなる可能性はあります。
それぞれの設定の仕方
Kinesis Firehoseの設定
クラスメソッドのブログに詳細な設定方法を記載していただいています。
https://dev.classmethod.jp/cloud/kinesis-firehose-tokyo/
こちらのスライドも非常に詳しいです。
また、サンプルデータの投入にも対応しているため、
とりあえずFirehoseの設定を行えば、以後のテストも行えます。
実際には動かしているサービスだったり、AWS IoTだったり、様々なソースを選択することになります。
今回はS3に保存するケースで考えます。
S3に保存したデータに対して、AWS Glueでカタログ作成をします。
(※現状ここで少々問題があるのですが、ここではあえて無視して後述します。)
コンソールでAWS Glueを選択
↓
Crawlers→Add Crawlerを選択してクローラーを作成
↓
画面に従ってクローラーを設定。データベースは任意で作成。S3バケットはKinesis Firehoseで作られたバケットを指定。
※細かな設定は色々ありますが、とりあえず動かして、あとで調整する、でよいかと。
クローラーの定義の仕方はクラスメソッドさんのブログにスクリーンショット入りで細かく書いてくれています。
https://dev.classmethod.jp/cloud/aws/aws-glue-tutorial/
↓
クローラーを実行
ここまでの流れでAthenaのクエリを投げるためのテーブルができる…と言いたいところなのですが、現状では下記の問題があり、上手く実現できません。
FirehoseではS3に/YYYY/MM/DD/hh/〜のようなフォルダ構成でファイル保存するのですが、GlueではAthenaの自動パーティション認識が可能な「/year=YYYY/month=MM/day=DD/〜」のようにkey=value形式でないと、うまくパーティションを作ってくれません。
の、はずなのですが、自分が実際にやってみると、同じようにデータを入れているのに正しくパーティションを切ってくれるケースと、全くうまくいかないケースが分かれてしまい、ここはもう少し検証が必要なポイントです。
年、月、日という典型的なパーティションの切り方についてはGlue、Athenaのほうで対応してくれると非常に助かるポイントですね…。
パーティションが設定されたら、最後にAthenaで任意のクエリを投入します。
AthenaではパーティションをWhere句に指定せずにクエリを実行したりすると、大量のデータを参照してしまいものすごいデータ量になったりするので、パーティションの設定は忘れないようにしましょう。
ちなみに、パーティションが自動で設定されない場合は手動でクエリを投げて、一つ一つ設定する必要があります…。
参考
https://dev.classmethod.jp/cloud/aws/athena-partition-reinvent/
AthenaであればS3のデータに対してクエリ(参照系のみ)を直接投げられるので、S3に適切にデータが入っていれば特別なことをせずそれだけで分析が行なえます。
素晴らしいですね。
課題や今後の希望など
途中で書いたとおり、Firehoseで年月日のフォルダ構成で保存されるものに対して、Glueのクローラーを実行した時に年月日でパーティションを設定する(もしくは、Athenaが自動でパーティション認識する)、というのが正常に行えるようになると、上記の構成が楽に行えるようになります。
現状だと手作業でパーティションを設定しなければならず、非常に煩雑です。
Lambdaを使ってフォルダ配置をいじって認識してくれる形式に直すというのもアリかもしれませんが…。
まとめ
まだ課題は残っているものの、AWSのサービスを利用すれば大規模分析基盤がかなり楽に作れそう、という状態です。
通常であればこれだけの基盤を作るのは消して簡単ではないのですが、クラウドサービスとしてAWSのリソースを使うことによって、個人レベルでも簡単にそれだけの基盤を利用することが出来るようになります。
さらに使いやすくなるように今後のアップデートにも是非期待したいですね。