(レポート) BDT205: AWSによる初めてのビックデータアプリケーション #reinvent

2015.10.11

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

業務でAWSを活用したデータ分析基盤の構築やコンサルしておりますが、本セッションはAWSを利用してデータ分析をご検討の方が、どのサービスをどのように組み合わせたら良いかについて、最新のトピックを具体的かつ簡潔に解説しています。

BDT205: Your First Big Data Application on AWS

概要

セッションの解説より

Amazonのビッグデータ・ウェブ・サービスを利用して、AWSの上で最初のビッグデータアプリケーションを起動する方法をより知りたいですか? Amazon EMR 、Amazon Redshift、Amazon kinesis、Amazon DynamoDB、Amazon S3を使用してリアルタイムでのビッグデータアプリケーションを構築する旅にご参加ください。 AWS上のビッグデータ・ソリューションのアーキテクチャ設計パターンを確認し、再構築し、アプリケーションを自分でカスタマイズすることができるように私たちのラボへのあなたご招待します!

 はじめに

データ分析の流れ

 

bdt205-2

データ分析は、集める(Collect)処理する(Process)分析する(Analyze)の3つ手順を踏みます。

  • 集める(Collect)は、データソースとしてデータ収集のサービスやデータストアです。
  • 処理する(Process)は、集められたデータを定期的もしくは溜まったタイミングでデータを取り出し(Event Processing)と、コード変換、フォーマット変換、データクレンジング、一次集計といったデータの処理(Data Processing)です。いわゆるETLを意味します。
  • 分析する(Analyze)は、構造化されたETL済みのデータからELT、マートの作成を作成し、分析データとして利用できるデータとなります。
  • 機械学習は構造化されたETL済みのデータをデータソースします。また、機械学習の結果を分析データにフィードバックします。

初めてのビックデータアプリケーション〜データフロー

bdt205-3

Kinesisに集められたログストリームを定期的にAmazon S3にデータを保存します。そのデータをAmazon EMRでETLして、構造化したETL済み中間データをAmazon S3に保存します。Amazon Redshiftに構造化データをロードし、マート作成して、BIツールなどで視覚化します。

AWS CLI によるセットアップ

Amazon Kinesis

ログデータの入力に1つのシャードを作ります。

bdt205-8

 

Amazon S3

S3バケットの作成です。

bdt205-9

Amazon EMR

2ノードのEMRクラスタを作成します。(下記では、emr-4.0.0ですが、最新は4.1.0です)

 

bdt205-10

Amazon Redshift

シングルノードクラスタを作成します。

bdt205-11

初めてのビックデータアプリケーション〜コンポーネントと役割

bdt205-12

  1. 集める(Collect):Log4Jを使ってストリームデータをKinesisに保存
  2. 処理する(Process):EMRのSparkとHiveを使ってデータを処理
  3. 分析する(Analyze):分析データをRdedsiftに入れてSQLで使う

集める(Collect)

Amazon Kinesis Log4J AppenderによるログのPut

Amazon Kinesis Log4J Appender をウェブアプリケーションに組み込んで、アプリケーションから直接KinesisにログストリームをPutできます。

Amazon Kinesis Log4j Appender JAR をダウンロードします。

kinesis-log4j-appender-1.0.0.jar をダウンロードしたフォルダに、AwsCredentials.properties というファイルを作成し、ご自分の認証情報を指定して編集します: accessKey=<your_access_key> secretKey=<your_secret_key> <your_access_key> と <your_secret_key> をご自分の AWS アカウントの accessKey と secretKey に置き換えてください。アクセスキーの詳細については、「How Do I Get Security Credentials?」を参照してください。

サンプルアクセスログファイル access_log_1 をダウンロードして、認証情報と JAR ファイルを保存したディレクトリと同じディレクトリに保存します。

Linux、UNIX、Mac OS X ユーザー:

${JAVA_HOME}/bin/java -cp .:kinesis-log4j-appender-1.0.0.jar  \
  com.amazonaws.services.kinesis.log4j.FilePublisher access_log_1

Windows ユーザー:

%JAVA_HOME%/bin/java -cp .;kinesis-log4j-appender-1.0.0.jar  \
  com.amazonaws.services.kinesis.log4j.FilePublisher access_log_1

Spark

bdt205-17

  • 大規模データ処理の向けの、高速かつ多目的エンジン
  • Java、Scala、Pythonによって素早くアプリケーショが書ける
  • (方言ありですが)SQL互換、ストリーミング処理、複雑な分析

Amazon Kinesis と Spark Streaming

bdt205-18

KinesisはSpark Stremingによって直接EMRにデータを受け渡すことができる。また、KCL(Kinesis Client Liblary)を使ってDynamoDBにデータを投入することも可能です。

Amazon EMR の Spark Streaming の使い方

EMRクラスタにログイン:

ssh -o TCPKeepAlive=yes -o ServerAliveInterval=30 \
  -i YOUR-AWS-SSH-KEY hadoop@YOUR-EMR-HOSTNAME

EMRクラスタ上でKCLをダウンロード:

wget http://repo1.maven.org/maven2/com/amazonaws/amazon-kinesis-client/1.6.0/amazon-kinesis-client-1.6.0.jar

※ 最新は amazon-kinesis-client-1.6.1 です。

 

コンソールノイズの除去:

sudo sed -i 's/INFO/ERROR/g' /usr/lib/spark/conf/spark-default.conf
sudo sed -i 's/INFO/ERROR/g' /usr/lib/spark/conf/log4j.properties

Spark shell の起動:

spark-shell \
--jars /usr/lib/spark/extras/lib/spark-streamingkinesis-asl.jar,amazon-kinesis-client-1.6.0.jar \
--driver-javaoptions "-Dlog4j.configuration=file:///etc/spark/conf/log4j.properties"

インポートライブラリ

bdt205-21

spark-shellの再設定

bdt205-22

Spark Streaming による Kinesisからの読み込み

KinesisClientのインスタンスの生成

bdt205-23

KinesisClientの開始

bdt205-24

S3の確認

aws s3 la s3://YOUR-S3-BUCKET/access-log-raw/ --recursive

処理する(Process)

Spark SQL

SQLによる構造化データ操作のためのSparkのモジュール構成

bdt205-27

変更を加えることなく、既存のデータのHiveクエリを走らせることができます。

EMRでSparkSQLを使う方法

EMRクラスタにログイン:

ssh -i YOUR-AWS-SSH-KEY hadoop@YOUR-EMR-HOSTNAME

※資料は、"ssh -i YOUR-AWS-SSH-KEY YOUR-EMR-HOSTNAME" と記載されていた。

Spark shell の起動:

spark-sql \
--driver-javaoptions "-Dlog4j.configuration=file:///etc/spark/conf/log4j.properties"

S3バケットにテーブルを作成する際のポイント

bdt205-29

Spark SQL でクエリーを実行

bdt205-30

Amazon Redshiftにインポートする前にやるべきこと

  • Hiveのユーザー定義関数(UDF)を使って、from_unixtime、unix_timestamp、hourは変換する。
  • 「時」の値が重要です。これは分割とAmazon S3に書き込む前に、出力ファイルを整理するために使用されるものです。これらの分割は、並列「COPY」コマンドを使用して、私たちはより効率的に、後のLabではAmazon Redshiftにデータをロードすることができます。
  • 「時」の値が重要です。これはAmazon S3に書き込む際にdのように分割したり、まとめるのに役立つからです。このようにファイルを分割することで、並列COPYを利用して、Amazon Redshiftへ効率的にデータをロードすることができます。

S3の外部テーブルの作成

bdt205-32

分割と圧縮を設定

bdt205-33

S3への書き込み

bdt205-34

S3の出力ファイルの確認

bdt205-35

 分析する(Analyze)

Redshiftにテーブルを作成〜データのロード

bdt205-38

bdt205-39

分析結果の視覚化

bdt205-42

  • (上記の)クライアントサイドJavaScriptの例はD3によって作られたライブラリPlottableを使っています。
  • ほんの僅かな期間Amazon S3上でホストされています。
  • Lambda 関数は、Redshiftをクエリーするために使用します。

※ 視覚化の手段として、Tableau 等の選択肢もあります。今後は QuickSight 有力な選択肢となるでしょう。

AWS Cloud をお試しください...

(一時間あたりの)コストは、約コーヒー一杯分です。

bdt205-43

まとめ

当初は200番台の初級者向けの、昨年のセッションの焼き直しかと思っていましたが、実際には最新のKinesisによるデータ収集、最新EMR(Spark)によるSparkStreamingとETLについて、ステップ・バイ・ステップで解説された貴重なセッションでした。思わず手を動かさずにはいられなくなったのではないかと思います。