Amazon Kinesis Data Streams (KDS)とAWS Glue Streaming ETLを用いたVantageへのデータストリーミング

次のアーキテクチャは、Amazon Kinesisからのデータの流れを示しており、AWS Glueによってストリーミングされ、Teradata Vantageで分析され、最後にAmazon QuickSightで表示されるようになっています。このチュートリアルでは、シンプルなLambda関数を使用して、ストリーミングソースを実行することにします。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/0893c9ed-eb77-6a5f-c3e3-a02bbc2b08d0.png)

# 前提条件

AWS Glue Streaming ETLをTeradata Vantageで使用するには、まず、以下の前提条件を満たしていることを確認してください：

・仮想マシンにログインするためには、[Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/) (Amazon EC2)のキーペアが必要です。まだお持ちでない場合は、[新規に作成してください](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#having-ec2-create-your-key-pair)。以下の手順では、キーペアを **Teradata.pem** と名付け、ローカルマシンにダウンロードすることにします。

・[Amazon QuickSight](https://aws.amazon.com/quicksight/)のアカウントを作成します（サブスクリプションが必要です）。


# 手順

作業手順の概略は以下の通りです。
前提条件を満たした上で、以下のステップを踏んでください：

1.	Teradata Vantage Developer Editionにサブスクライブします。(この手順は、VantageがAs-a-Serviceで提供されている場合にも有効です）。
2.	 [AWS CloudFormation](https://aws.amazon.com/cloudformation/) スタックを起動しTeradata Vantageおよびその他の必要なリソースをデプロイします。
3.	 Teradata Vantageでユーザーと読み取り/書き込み可能なデータベースを作成します。
4.	AWS Glueコンソールを使用してKinesis Tableを作成する。
5.	Glue Streaming ETLジョブを作成しストリーミングを開始します。
6.	Amazon QuickSightを使用してTeradata Vantageにロードされたデータを可視化する。
7.	クリーンアップを行います。

# ステップ1：Teradata Vantage Developer Editionのサブスクライブ

以下の手順に従って、Teradata Vantage Developer にサブスクライブしてください：

- [AWSアカウント](https://aws.amazon.com/console/)にログインします。
- AWS Marketplaceの[Teradata Vantage Developer (Free, DIY)](https://aws.amazon.com/marketplace/pp/B06Y4Z54R5?qid=1587421493636&sr=0-1&ref_=srh_res_product_title)のリストにアクセスします。
- 右上の「Continue to Subscribe」を選択します。
- 「Accept Terms」を選択します。


選択すると条件に同意したことになりお客様のアカウントでこのAWS Marketplaceのソフトウェアを使用することができます。

# ステップ2：AWS CloudFormation Stackを起動しVantageをデプロイする

AWS CloudFormation は、クラウド環境における AWS およびサードパーティのアプリケーションリソースのモデリングとプロビジョニングを行うための共通言語を提供します。Vantage をデプロイするには、次の手順に従います：

Launch Stack をクリックして、Teradata Vantage Developer Edition をこのチュートリアルの完了に必要なすべてのリソースと一緒にデプロイします。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/c7fdc135-ac55-9880-5a6a-5370ba9cc4b7.png)

CloudFormationコンソールページにテンプレートURLが入力されたらドロップダウンからAWS Key Pair 「**Teradata.pem** as per prerequisites」を選択します。

他のパラメータはすべて自動入力されているのでスクロールダウンしてIAMリソースの作成を確認しチェックボックスにチェックを入れ「Create Stack」をクリックします。

![画像3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/b48bfbdb-7d81-7f89-1e01-959b07f2bcee.png)

Kinesis Streams、Lambda関数、IAMロールなど必要な前提条件をすべて備えたTeradata Vantage Developer Editionが、お客様のアカウントにデプロイされるようになりました。これには最大で20分かかる場合があります。デプロイが完了したら、[Stack Output](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/outputs?filteringText=&filteringStatus=active&viewNested=true&hideStacks=false&stackId=Upsolver-DevDay-Kinesis)タブに移動し、そこに記載されているすべての詳細をメモしてください。今後のステップで必要になります。

# ステップ3：GlueでAmazon Kinesisカタログテーブルを作成する
以下のステップでは、Glue Streaming ETLジョブのソースとして使用するKinesisカタログテーブルを作成するための設定を説明します。

Kinesis Stream用のGlue Catalogテーブルを作成しましょう。Catalogの「**Tables**」をクリックし、「**Add Tables**」ボタンで、「**Add Tables Manually**」を選択します。
次の画面で、「TeradataKinesisStream」という名前を指定します。ドロップダウンからデータベースを選択します。まだデータベースが作成されていない場合は、[Working with Glue Databases](https://docs.aws.amazon.com/glue/latest/dg/console-databases.html)を参照してデータベースを作成します。

「**Add a Data store**」ページで 「**Next**」 をクリックしソースの種類を 「**Kinesis**」 に、Stream Nameを 「**TeradataKinesisStream**」 に、KinesisソースのURLを [https://kinesis.${AWS::Region}.amazonaws.com](https://docs.aws.amazon.com/glue/latest/dg/console-databases.html) に入力します。
最後にAWS::Regionを自分の地域に置き換えてください。nextをクリックして続行します。(CloudFormationの出力欄にも同じ情報があります)

![画像4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/4653f2b6-7a61-4eac-39df-1aa178a59d11.png)

次のページで「Classification as JSON」を選択しNextをクリックします。スキーマの定義画面で「Add Column」をクリックし以下のタイプのカラム名を指定します。

|Type|Column Name|
|:----|:-----------|
|String|searchword, countrycode, useragent,languagecode, sourceip, visityearmonth, desturl, customer|
|BigInt|yearmonthkey, visitdate, duration, custkey|

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/b54dae89-2df0-1aaf-03f4-d21e4391882f.png)

「next」をクリックして確認し次の画面で「Finish」をクリックするとKinesisテーブルの作成が完了します。

# ステップ4：KinesisからVantageにデータをストリーミングするGlue Streaming ETLジョブのオーサリング

以下の手順でTeradata JDBCドライバをダウンロードしAmazon S3の任意の場所にロードしてGlueストリーミングETLジョブでVantageデータベースに接続するために使用することができます。

- 最新の[Teradata JDBCドライバ](https://downloads.teradata.com/download/connectivity/jdbc-driver)をダウンロードします。
- ダウンロードしたファイルから**tdjdcb4.jar**を解凍します。
- [Amazon S3バケットを作成します。](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)
- S3バケットに**tdjdbc4.jar**をアップロードします。

では、[AWS GlueのETLジョブ](https://console.aws.amazon.com/glue/home?region=us-east-1#etl:tab=jobs)タブからストリーミングETLジョブをオーサリングしてみましょう。左側のパネルからJobsをクリックし「Add Job」ボタンをクリックします。
次のページでは
- Name：Kinesis2Teradata
- IAM Role：ドロップダウンから TeradataGlueKinesisRole
- Type：Spark Streaming
- This Job Runs：Proposed Script generated by AWS Glue
を指定します。他はデフォルトのまま、下にスクロールします。

![画像6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/a8c17587-a11e-a3a8-31be-9a7054f3628a.png)

同じウィンドウ内で「Security Configuration, script libraries, and job parameters (optional)」を選択し、セクションを展開します。

Dependent jars pathフィールドにS3バケットのパスとTeradata JDBCドライバーのキー名を入力します。**s3://<あなたのバケット名>/terajdbc4.jar** のような形式である必要があります。:

![画像7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/e9da7089-8585-e2f2-2f2b-6d46229f4070.png)

残りのパラメータはデフォルト値のまま下にスクロールし「Next」を選択します。
Data Sourceペインが表示されますので、上記で作成したTeradataKinesisStreamテーブルのラジオボタンを選択し「Next」をクリックします。

![画像8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/a8b318b1-082b-c403-017e-739c710d58d0.png)

Data Targetペインが表示されます。同じTeradataKinesisStreamを選択し「Next」をクリックします。ここでは、代わりにスクリプトで宛先を変更します。

![画像9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/eea4ebcd-41f0-7667-5407-a73db2a63ed5.png)

次のウィンドウには、ソースカラムとターゲットカラムのマッピングが表示されます。変更の必要はありません。

![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/ee5559bb-06ef-9a10-2a4b-cdb3359851be.png)

ジョブの保存をクリックしスクリプトを編集します。またスクリプトに以下の変更を加えてください：

- 33行目で、**windowSize** を**100秒** から**5秒** に変更します。
 
![画像11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/e4d3ce9e-2cd9-299d-16c7-b0c49295c983.png)

- 32行目で「datasink1＝」の行を複製し、元のバージョンをコメントアウトします。これらの値を使用して、Teradata JDBCドライバの詳細を示す以下のスニペットを追加し、この中でvantage ip/hostnameを更新することを確認します。

```:additional_step
datasink1 = glueContext.write_dynamic_frame.from_options(frame = apply_mapping, connection_type = "jdbc", connection_options = {"url": "jdbc:teradata://ec2-XX-YYY-ZZZ-AA.us-west-2.compute.amazonaws.com/DATABASE=GlueDB,TMODE=ANSI","driver":"com.teradata.jdbc.TeraDriver","dbtable": "TeradataKinesisStream","database": "GlueDB","user": "GlueUser","password": "aws"}, transformation_ctx = "datasink1")
```

ページの上部にある「Save」をクリックします。最後に「Run Job」をクリックするとKinesisからVantageへのデータのストリームを開始します。
ジョブの起動には数分かかります。

# Step 5: Lambda Streaming Stimulator - Kinesis Producerを起動する。

Glueジョブを実行しながら[CloudFormation Resources](https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/resources?stackId=Vantage-StreamingETL-Blog)ページに戻ってLambda Function名を探すか、[TeradataStreamingStimulator](https://us-west-2.console.aws.amazon.com/lambda/home?region=us-west-2#/functions/TeradataStreamingStimulator?tab=configuration) Physical IDリンクをクリックしてLambdaコンソールを起動しましょう。

![画像12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/c6af0a40-dd62-b041-e29a-4d1c5083309b.png)

Lambdaコンソールで、右上のTestボタンをクリックし、ストリーミングデータをシミュレートします。

![画像13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/28dee437-eedb-40ea-fc8f-f2d93affb494.png)

configure test event画面が表示されます。configure test event画面でシミュレータが実行するためにリストされたフィールドでフォーマットされた以下のようなjsonレコードを指定します。テストイベントの名前を指定し「Save」をクリックして、テストイベントを作成します。

```JSON:addisional_record.json
{
  "bucket": "streaming-data-repo",
  "stream_name": "TeradataKinesisStream"
}
```

![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/c49e5337-0f8a-4613-f2f7-a98c06def71a.png)

バケットにストリーミングされるデータが入ります。「Save」をクリックし保存したのち再度「Test」をクリックすると設定にあるKinesis Streamにデータをストリーミングするシミュレータが起動します。
クリックすると、シミュレータは2分間実行された後、エラーでタイムアウトします。（タイムアウトはコンソールからラムダの設定で調整することができます。リソースを消費しないようにストリーミングが停止するように設定されています）

# ステップ6：Amazon QuickSightを使用して分析したデータを可視化する

Vantage にロードされたデータにはさまざまな分析を適用できます。しかしこの例ではQuickSightを使用してVantageにロードされたデータを可視化する方法のデモンストレーションに重点を置いて説明します。

まずAmazon QuickSightを開き新しいデータセットを作成します。データセットの一覧からTeradataを選択するとポップアップ・ウィンドウが表示されます。

- 「Database Name」フィールドに、データベースサーバーのVantageインスタンスの**DNS** 名と手順3で作成したデータベースのポート（1025）およびデータベース認証情報を入力します。
- 「Validate Connection」を選択してパラメータの正しさを確認します。接続が確立され検証されるとその横に緑色のチェックマークが表示されます。
- 同じポップアップウィンドウで、「Create Data Source」を選択します。

![画像15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/602dcde1-c79b-fcf4-8ae8-768ffa9614ec.png)

データソースが作成されるとAmazon QuickSightはVantageのテーブルを特定します。
- TeraTopicテーブルを選択し、ポップアップウィンドウから「Use Custom SQL」を選択します。
- クエリの名前を指定しクエリとして「select * from TeraTopic」を入力し「Confirm Query」をクリックします。
- 読み込んだら「Edit/Preview data」をクリックします。以下のようにデータが読み込まれます。

![画像16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/6ee1ca4e-a4c4-fef8-fa91-014246e6f19a.png)

- 日付フィールドのデータ型を必要に応じて変更するか計算フィールドを作成してQuickSightを使用してデータの可視化を開始することができます。

Amazon QuickSightでAutoGraphのビジュアライゼーションを作成する方法については[このドキュメント](https://docs.aws.amazon.com/quicksight/latest/user/example-create-an-analysis.html#example-create-autograph-visual)を参照してください。

# ステップ7：後始末

この記事の一部として作成されたリソースによる追加料金が発生しないようにAWS CloudFormationのスタックを削除することを確認します。CloudFormationコンソールに移動しStacksで作成されたスタックを削除することができます。また作成されたGlue Jobsを停止し接続、データベース、テーブル、作成されたGlue Jobを削除してください。

# おわりに

この記事では、[AWS Glue](https://aws.amazon.com/glue/)でカスタムデータベースコネクタを設定する方法、Streaming ETLを使用してAmazon KinesisからTeradata Vantageへシームレスにデータをストリームする方法、[Amazon QuickSight](https://aws.amazon.com/quicksight/)を使って結果を直接視覚化する方法について学びました。
ぜひお試しください！

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)