AWSを活用したアドホックデータ分析入門

膨大な構造化データ、半構造化データを抱え、その中から必要な情報を素早く分析したい。でも、システムに組み込むような本格的な分析ではなく、アドホックに分析したい。そんな時、一体何から始めたら良いのか途方に暮れた事はありませんか?

  • 原因調査・仮説検証などスポット的なデータ分析を効率化したい
  • データ量が多く処理時間・コストを短縮するためにデータを圧縮したい
  • 可視化ツールを活用してレポートを作成したい

本記事では、 上記のような課題を解消するために、Amazon Athenaを用いて効率的にデータ化し、実行時間とスキャンデータ量を削減する方法と、Amazon Managed Grafanaを活用したデータ可視化方法をご紹介します。具体的な手順やサンプルを交えながら、Athenaでのクエリ作成からGrafanaでのダッシュボード構築までを解説します。データ可視化にお困りの方は、ぜひ読んでみてください。

アドホックなデータ分析をAWSで実現する3つのステップ

アドホックデータ分析は、従来のデータウェアハウス構築・運用では時間やコストがかかりすぎるという課題があります。 Amazon AthenaではSQL文により、これらのデータを直接分析できるため、迅速なデータ分析が可能です。

  1. Athenaに対応するファイル形式のデータをAWS S3に保存します。
  2. データ変換やパーティショニングなどの前処理が必要な場合はAmazon Athenaを用いてSQLベースで実行し、分析に適した形式に整えます。
  3. 整形されたデータをAmazon Managed Grafanaに接続し、動的なダッシュボードと可視化ツールを用いて分析、洞察の抽出を行います。
S3は大容量データの保管に適したストレージであり、AthenaはS3に保管したファイルに対してSQLを用いたデータ操作が可能なため、データ準備に最適です。Grafanaは多様なデータソースに対応した可視化ツールで、Athenaで準備したデータを用いて効果的なデータ分析を実現できます。

どのようなデータ構造に対応しているの?

構造化データと半構造化データは、Athenaでのクエリが可能です。CSVやParquetなどの形式は構造化データとして、JSONやAvroは半構造化データとして扱われます。これらのデータ形式はAthenaで容易に分析が行えます。一方で、非構造化データは、Athenaで直接分析するのが難しく、別途構造化や前処理が必要です。

データ形式 概要 Amazon Athena対応
構造化データ スキーマを持つデータ
例:CSV、Parquet、ORCなど
半構造化データ 部分的にスキーマを持つデータ
例:JSON、Avroなど
非構造化テキストデータ 明確なスキーマを持たないデータ
例:Logstashログなど
非構造化データ 明確なスキーマを持たないデータ
例:PDF、画像、動画
×

どのようなファイル形式に対応しているの?

Amazon Athenaで取り扱い可能なファイル形式は、構造化データ形式(CSV、TSV、カスタム区切り、 Apache Parquet、ORC )、半構造化データ形式(JSON、Apache Avro、Amazon Ion、CloudTrailログ)、ログファイル形式(Apache WebServerログ、Logstashログ)です。

ファイル形式 説明
Amazon Ion JSONと互換性のあるデータ形式
Apache Avro データシリアライズフレームワーク
Apache Parquet 列指向ストレージ形式
Apache WebServer ログ パターンマッチングが可能なテキストデータ形式
CloudTrail ログ JSON形式
CSV カンマ区切り値
カスタム区切り ユーザー定義の区切り文字で分けられたテキストデータ形式
JSON 階層型データフォーマット
Logstash ログ パターンマッチングが可能なテキストデータ形式
ORC 列指向ストレージ形式
TSV タブ文字で区切られたテキストデータ形式
 

データの可視化は簡単にできますか?

Athenaのクエリ結果をAmazon Managed Grafanaのデータソースとして設定することで、簡単に連携が可能です。 Amazon Managed Grafanaは、複数のビルトインデータソースをサポートしており、さまざまなAWSサービスやその他のデータソースを可視化できます。Athenaのクエリ結果を動的なダッシュボードで表示し、多様な可視化オプションによりカスタマイズすることができます。

 

データ保管場所

分析対象のデータとクエリ実行結果は以下のようにS3バケット内の別々のフォルダに保存します。

データファイル保管場所: s3://<バケット>/athena/orgdata/sample.csv
Athenaは指定されたLocation内のサブフォルダを再帰的にスキャンするので、スキャン対象以外のファイルは別のフォルダに保管します。

Athenaによるデータ分析の準備

Athenaを用いたアドホック データの取り込み、データ形式の変換、パーティショニング、アクセス用テーブルについて解説し、それぞれのテーブルの実行時間とスキャンデータ量を比較します。

データ取込みテーブル作成

本ステップでは、S3に保存されたデータ(今回はCSVファイルを使用)を読み込むための外部テーブルを作成します。データ構造をAthenaに伝え、データを読み込めるように準備します。 

CREATE EXTERNAL TABLE IF NOT EXISTS csv (
  中略
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
	"separatorChar" = ",",
	"quoteChar" = "`",
	"escapeChar" = "\\"
)
LOCATION 's3://<bucket>/athena/orgdata/'
TBLPROPERTIES ('skip.header.line.count' = '1');

 

 

ROW FORMAT SERDE や SERDEPROPERTIES で適切なフォーマットを指定している点が重要です。

データ変換とパーティショニング

本ステップでは、各種変換処理を行い、新しいテーブルを作成します。例えば、Unixタイムスタンプは使いやすいデータに変換してカラムを追加します。テキスト形式からParquet形式への変換は、列指向フォーマットによる特定カラムへのアクセス高速化、効率的な圧縮によるスキャンデータ量の削減、そして各種データセットへの適合性から、クエリパフォーマンスが向上します。特に、SNAPPY圧縮は高速な圧縮と解凍により、クエリ実行速度向上に効果的です。また適切なパーティショニングにより、クエリ対象のデータが絞り込まれ、スキャンデータ量の削減によるパフォーマンス向上とコスト削減を実現します。

CREATE TABLE enhanced_csv_data
WITH (
      format = 'PARQUET',
      parquet_compression = 'SNAPPY',
      external_location='s3://<bucket>/athena/parquet/',
      partitioned_by = ARRAY['year', 'month', 'day'] 
      )
AS SELECT *,
            CAST(date_format(from_unixtime(CAST(timestamp AS BIGINT) / 1000), '%Y%m%d%H%i%s') AS VARCHAR(14)) AS datetime_ymdhhmmss,
            year(from_unixtime(CAST(timestamp AS BIGINT) / 1000)) AS year,
            month(from_unixtime(CAST(timestamp AS BIGINT) / 1000)) AS month,
            day(from_unixtime(CAST(timestamp AS BIGINT) / 1000)) AS day
FROM csv;

 

前ステップで作成した外部テーブルを圧縮しようとしたところ、以下のエラーが発生しました。パーティションキーのデータ型の指定がよくなかったようです。String型で再作成する事でエラーは解消されました。

アクセス用テーブル作成

前ステップで作成したパーティション付きデータへアクセスするための外部テーブルを作成します。テーブル名やカラム名などのメタデータ定義、LOCATION句によるデータ指定、パーティション情報の取得、tblpropertiesによるデータフォーマットと圧縮形式の指定といった役割を担います。

CREATE EXTERNAL TABLE IF NOT EXISTS parquet_csv_data (
  中略
)
STORED AS PARQUET
LOCATION 's3://<bucket>/athena/parquet/'
tblproperties ("parquet.compression"="SNAPPY");

 

各テーブルの実行時間とスキャンデータ量の比較

3つのテーブルに対して同一のクエリを実行して、実行時間とスキャンデータ量を比較すると以下となりました。

対象テーブル 実行時間 スキャンデータ量
CSVデータ取込みテーブル 6.29sec 127.96MB
データ変換テーブル 6.71sec 12.69MB
アクセス用テーブル 3.84sec 9.99MB
CSVデータ取込みテーブルとアクセス用テーブルを比較すると、実行時間は38%削減されました。データ変換テーブルでCSV取込みテーブルよりも若干実行時間が増えているのはパーティションスキャンによるオーバーヘッドが考えられます。パーティションのスキャンデータ量を比較すると、列指向の特性と圧縮の効果により、スキャンデータが92%削減されました。圧縮により大幅にスキャンデータ量は削減されますが、それ以外にもテーブル構造やパーティションの違いによりクエリ実行結果に違いが出ることがわかりました。
複雑なテーブル構造はクエリ実行結果に影響を及ぼすので、パーティションの粒度や不要なカラムは除外するなど対処が必要です。

 

Grafanaによるデータ可視化

本章では、AthenaデータソースをGrafanaに設定し、Grafana Exploreでクエリを実行、ダッシュボードを作成する方法を紹介します。

アクセス制御

GrafanaからAthenaのデータ取得とS3へのログ書き込みについて、以下を参考にIAM 権限の付与を行います。

GrafanaにAthenaデータソース設定

データ転送を行うGrafana ワークスペースの[データソース]タブでAthena のデータソースを有効化し、アタッチ済みとなる事を確認します。

 

 

 

 

 

 

 

次にGrafanaのコンソールにログインし、データソースにAthenaが利用可能となっているか確認します。未利用の場合はinstall nowをクリックします。

Amazon Athenaに関するプラグイン説明画面が表示されるので、右上よりインストールします。

プラグインのインストールが完了するとAdd new data sourceと表示されるのでクリックします。

ここでは主にAthena Detailsの設定をします。

Grafana Exploreにてクエリ実行

Athenaとの接続が完了するとData Sourcesに新たに追加されるので、Exploreをクリックします。

Grafana Dashboardの作成

ここではGrafanaのデータソースとしてAthenaからの応答が正しい事をテストクエリを実行して確認します。特に問題なければ画面右上の+Addを展開してAdd to dashboardをクリックします。

次にOpen dashboard、Add visualizationをクリックするとダッシュボードのエディット画面が表示されるので、可視化を行いたいクエリを実行します。この時点では期待する結果とならない場合もありますので、Open visualization suggestionsからお好みの視覚化オプションを選択します。

視覚化オプションは多数あり、ダッシュボード上に異なるパネルを作成する事ができます。

さいごに

Amazon S3、Amazon Athena、Amazon Managed Grafanaを使ったデータ分析ワークフローを3つのステップで解説しました。本記事が皆様のデータ活用にお役立ていただければ幸いです。

タイトルとURLをコピーしました