「はじめてのモダンデータ解析基盤」でデータレイクを学ぶ

オンラインセミナー「はじめてのモダンデータ解析基盤」でハンズオンを受講しました
2020.07.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、崔です。

7/21(火)に開催されたAWSJのオンラインセミナー「はじめてのモダンデータ解析基盤」に参加しましたので、そのハンズオンを振返りたいと思います。

ハンズオン概要

ハンズオンの概要は次のとおりです。

本セミナーでは、AWS のデータ解析基盤サービス群の説明を中心に、進化するデータ解析基盤のコンセプトであるモダンデータ解析基盤についてご紹介します。 またセミナー後半では、実際の AWS データ解析サービス群である、Amazon Athena,AWS Glue, Amazon Redshift Spectrum, Amazon S3 Select について体験いただくハンズオンを実施します。 前半のセッション部分のみの参加も、セッションおよびハンズオン両方の参加も可能です。

アジェンダ

  • 【前半】AWSのデータ解析基盤サービス群のご紹介
  • 【後半】Amazon Athena, AWS Glue, Amazon Redshift Spectrum, Amazon S3 Select のハンズオン

本ブログでは、セミナー後半のハンズオンを振返ります。

ハンズオンについては、ドキュメントが提供され、その手順に沿って実施していく形でした。
気になる方は、8/18(火)にも開催予定のようですので、興味を持たれた方はぜひ参加してみて下さい。

昼間の時間帯に参加が難しい方は、8/4(火)の夜にJAWS-UGとしても開催されるようですので、こちらもぜひ。

はじめに

ハンズオンの資料から今回のゴールを引用します。

幅広いデータソースからの構造化データ、または非構造化データの集中リポジトリとして使用できる Data Lake は、データの保存と分析の方法として多くの企業に取り入れられています。 AWS のビッグデータ関連サービスを使用して実際に分析パイプラインを構築することを通して、Data Lake とビッグデータ分析基盤構築の実感を持って頂くことをゴールとしています。

主に4つのセクションからハンズオンが構成されていました。

  • 準備
  • アプリケーションログの永続化と長期間データの分析と可視化
  • クラウドDWHを使用したデータ分析
  • サーバーレスでデータのETL処理

これらのセクションを通じて、長期間のデータをバッチ分析する環境の構築について、体験することができます。
今回は、ログデータをS3に安価に長期保存しながら、アドホックにログデータを直接クエリしたり、DWHで細かく分析をおこなったり、ETL処理を行ったり、と一通り実行できます。

1.準備

これから実施する3つのセクションについて、ベースとなる環境を構築します。
CloudFormation のテンプレートが用意されていて、実行するだけでした。
EC2 上のサンプルアプリケーションからログが出力されていて、Kinesis Data Firehose に送信後、S3に長期保存されるようになっています。
(ハンズオン資料から抜粋)

2.アプリケーションの永続化と長期間データの分析と可視化

このセクションでは、Kinesis Data Firehose 経由で S3 に保存されたデータを、Amazon Athena を用いて、アドホックな分析を行います。また、S3 Selectでも確認します。

EC2のロールに権限を追加する

まず、上記で作成されたロールに次のポリシーを追加します。

  • AWSGlueServiceRole
  • AmazonS3ReadOnlyAccess

また、「信頼関係の編集」にて、Serviceの箇所にGlueを追加します。

Glue でクローラーの実行

AWS Glueでクローラを追加します。
データストアの追加で、準備で作成したS3バケットを指定します。

IAMロールの選択で、先程ポリシーを追加したロールを選択します。

データベースを追加し、クローラを作成します。

作成したクローラを実行します。
テーブルやスキーマ定義が作成されます。

Athenaでクエリ実行

次にAthenaの設定から、「クエリの結果の場所」を設定します。

次に、コンソールの左側から、データベース「minilake」とテーブル「minilake_in1」を選択し、「テーブルのプレビュー」を選択すると、データを確認することができます。

また、様々なSQLを実行することで、データの中身を確認することが可能です。

S3 Selectでクエリ実行

次に、作成したS3バケットを選択し、ログが出力されている階層まで移動します。
対象のログを選択し,メニュー「アクション」から「S3 Select」を選択します。

ファイル形式「JSON」を選び、SQL式にSQLを入力します。
これで、S3 Selectでデータを確認できました。

これで、EC2からKinesis Data Firehose 経由で S3 に保存されたデータに対して、Glueを用いてテーブルを作成し、Athenaでデータを確認したり、直接 S3 Selectでデータを確認することができました。

3.クラウドDWHを使用したデータ分析

このセクションでは、同じS3のデータを、Redshift や Redshift Spectrumで確認します。

Redshiftの構築

まず、Redshiftの設定から「サブネットグループ」を作成します。

次に、クラスターを作成します。

5~10分ほどでクラスターが構築されます。

RedshiftにIAMロールを付与

次に、RedshiftからS3にアクセスして、データをロードする準備をします。

まず、新規にIAMロールを作成します。
「信頼されたエンティティの種類を選択」で、「AWSサービス」を選択し、「Redshift」、「Redshift - Customizable」を選択します。

「Attach アクセス権限ポリシー」で「S3ReadOnlyAccess」を選択し、IAMロールを作成します。

次に、作成したIAMロールをRedshiftクラスターにアタッチします。
まず、作成したRedshiftクラスターを選択し、アクションの「IAMロールの管理」から、先程作成したIAMロールを選択します。

Redshiftにデータをロード

Redshiftに接続後、エディタからSQLを実行し、ロード対象のテーブルを作成します。

create table ec2log (
 timestamp varchar,
 alarmlevel varchar,
 host varchar,
 number int2,
 text varchar );

続いて、S3からデータをコピーします。

copy ec2log from 's3://20200726-handson-minilake/minilake-in1'
 format as json 'auto'
 iam_role 'arn:aws:iam::123456789012:role/handson-minilake-dwh';

これで、テーブルに対して、クエリが実行できます。

select count(timestamp) from ec2log;

Redshift Spectrumの利用

まず、Redshift Spectrumのスキーマとデータベースを作成できるように、IAMロールにポリシーを追加します。
Redshiftに付与したIAMロールを選択し、ポリシー「AWSGlueServiceRole」をアタッチします。

Redshiftに戻り、SQLを実行し、外部スキーマを作成します。

create external schema my_first_external_schema
  from data catalog database 'spectrumdb'
  iam_role 'arn:aws:iam::123456789012:role/handson-minilake-dwh'
  create external database if not exists;

次に、外部テーブルを作成します。

create external table my_first_external_schema.ec2log_external (
 timestamp varchar(max),
 alarmlevel varchar(max),
 host varchar(max),
 number int2,
 text varchar(max) ) 
partitioned by (
 year char(4),
 month char(2),
 day char(2),
 hour char(2)) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ( 'paths'='timestamp,alarmlevel,host,number,text') 
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location 's3://20200726-handson-minilake/minilake-in1';

次に外部テーブルにパーティションを追加します。

ALTER TABLE my_first_external_schema.ec2log_external 
ADD PARTITION (year='2020', month='07', day='26', hour='05') 
LOCATION 's3://20200726-handson-minilake/minilake-in1/2020/07/26/05';

これで、データが投入されましたので、クエリを実行してデータを確認できます。

select count(*) from my_first_external_schema.ec2log_external;

これで、S3のデータをRedshiftにロードしたり、S3上のデータをRedshift Spectrumに取り込むことで、DWHでのデータ読み込みができました。

4.サーバーレスでデータのETL処理

このセクションでは、Glueを使用してParquet形式にデータのETL処理を行い、Athenaで確認します。

IAMロールにポリシーを追加

IAMロールに「AmazonS3FullAccess」ポリシーを追加します。

GlueでETLジョブの作成

最初に作成したS3バケットを選択し、ETL処理の出力先のフォルダを作成します。

次に、Glueでジョブを追加します。
名前、IAMロールを設定し、モニタリングオプションで「ジョブメトリクス」にチェックを入れます。

次に、セキュリティ設定、スクリプトライブラリおよびジョブパラメータにて、最大容量を2に設定します。

データソースとなるS3フォルダを選択し、データターゲットを選択します。
Parquet形式に変換します。

続いての画面で、ジョブの実行を行います。

ジョブが正常に終了すると、出力先のS3フォルダにParquet形式でデータが出力されます。

Glueでクローラーの実行

Glueでクローラーを追加します。
データストアの追加で、先程の出力先フォルダを選択します。

作成したクローラーを実行します。

テーブル minilake-out1 がParquet形式で作成されました。

Athenaで実行

Athenaで元のテーブルとParquet形式のテーブルに対してSQLを実行します。

SELECT count(user) FROM "minilake"."minilake_in1" 
 WHERE user='uchida' 
    AND timestamp >= '2020-07-26 09%' AND timestamp <= '2020-07-26 21%'
SELECT count(user) FROM "minilake"."minilake_out1" 
 WHERE user='uchida' 
    AND timestamp >= '2020-07-26 09%' AND timestamp <= '2020-07-26 21%'

そうすると、スキャンしたデータ量が、Parquet形式のテーブルの方が、不要なカラムを読み込まない分、圧倒的に少ないことが確認できます。

Glueジョブでパーティション作成

次に、パーティション形式で試してみます。
最初に作成したS3バケットを選択し、フォルダ minilake-out2 を作成します。

先程のGlueのジョブを選択し、「スクリプトの編集」を実行します。

write_dynamic_frame の partitionKeys オプションを使い、パーティション分割して出力指定します。
ジョブの編集が完了したら、ジョブを実行します。

Glueでクローラーの実行

先程と同様に、Glueでクローラーを追加します。
今回は、データストアの追加で、先程の出力先フォルダ minilake-out2を選択します。
作成したクローラーを実行します。

テーブル minilake-out2 がParquet形式、パーティション状態で作成されました。

Athenaで実行

Athenaで元のテーブルとParquet形式のテーブルに対してSQLを実行します。

SELECT count(user) FROM "minilake"."minilake_out2" 
 WHERE user='uchida' 
    AND timestamp >= '2020-07-26 09%' AND timestamp <= '2020-07-26 21%'

先程よりも、スキャン量の減少が確認できます。

これで、GlueでParquet形式に変換したテーブルをパーティション化し、Athenaで確認することができました。

まとめ

本ハンズオンでは、EC2からKinesis Data Firehose経由でS3上に保存されたデータに対して、AthenaやS3 Selectでの検索を試したり、S3上のデータをRedshiftに格納したり、Redshift Spectrumとして検索したり、また、Glueを利用してParquet形式にETL処理を実行したり、と一通りの機能を気軽に試すことができました。
データ分析のとっかかりとしては、非常に幅広く試すことができるハンズオンだったと思います。
気になった方は、ぜひ次回のハンズオンに参加してみて下さい。