多くのTeradataのお客様は、Teradata VantageとMicrosoft Azure First Party Servicesの統合に関心をお持ちです。この記事ではVantageのNative Object Store機能を使用してTeradata VantageをAzure Blob Storageと接続する方法を説明します。
このアプローチは社内で実装されテストされていますが、そのままの状態で提供されます。Microsoftは、Native Object Store機能を使用したTeradata VantageとAzureサービスとの検証を提供していません。
ご意見・ご感想はコメントとしてお寄せください。
免責事項:このガイドには、MicrosoftとTeradataの両方の製品ドキュメントの内容が含まれています。
概要
ここではTeradata VantageのNative Object Store(NOS)機能を使用して、膨大な量の半構造化または非構造化データを保管できるMicrosoft Azure Blob Storage上のJSONファイルにクエリを実行します。
JSONデータを作成および処理する方法は数多くあります。
この記事では
・Raspberry Piオンラインシミュレータを使用してJSON文字列をAzure IoTハブデバイスに送信
・メッセージをAzure Eventハブにルーティング
・Azure Stream Analyticジョブでデータ処理
・JSONファイルとしてAzure Blob Storageコンテナに送付
します。
最後にVantageのNOS機能を使用してJSONファイルに接続しクエリを実行します。
これは、ワークフローの図です。
前提条件
AzureサービスおよびTeradata Vantage with Native Object Store(NOS)に精通していることが前提になります。
以下のアカウント、オブジェクト、システムが必要です。セットアップ手順のリンクが含まれています。
- Microsoft Azureのサブスクリプションです。無料アカウントで開始することができます。
- Azure Blob Storage アカウントとコンテナ。
- [Azure Event Hub](Azure Event Hub) ネームスペースとイベントハブ。
- Azure Stream Analyticジョブ。
- Azure IoT Hubinstance、デバイスの登録、ルートの定義、およびカスタムエンドポイント。
- IoTハブデバイスのためのRaspberry Piオンラインシミュレータ。
- Teradata VantageとNOS機能
Azure Blob Storageのアカウントとコンテナを作成する
Azure Blob Storage アカウントとコンテナの作成JSON ファイルを保存するために、Azure Blob Storage アカウントが必要です。
- Azureポータルにログオンし、ストレージアカウントを作成する。
「Subscription」、「Resource group」、「Storage account name」、「Location」を入力します。残りのフィールドは、デフォルト値のままにしておきます。「Review+create」をクリックして確認し「Create」をクリックします。
作成するすべてのサービスに同じ場所を使用することをお勧めします。
-
配置が完了したら、「Go to resource」をクリックしJSONファイル用のコンテナを作成します。
-
コンテナアイコンをクリックし「+Container」をクリックして新しいコンテナ名を指定します。この例では、Public access levelを「Private」のままにしておきます。
- アカウントを完全に制御するにはAccess keysをクリックし「Storage account name」と「key1」をコピーします。これは、後で「Connect Teradata Vantage Native Object Store to Azure Blob Storage - Create Authorization Object」のセクションで使用します。
より細かい認証を行うにはShared access signatureをクリックして、コンテナまたはコンテナ内のオブジェクトへのアクセスを定義します。適切なSASアクセスプロパティを選択し、「Generate SAS and connection string」ボックスを選択します。
SASトークン出力とストレージアカウント名を選択し後で「Connect Teradata Vantage Native Object Store to Azure Blob Storage - Create Authorization Object」セクションで使用するドキュメントにコピーしてください。
Azure Event Hubのネームスペースとハブの作成
IoT Hubデバイスがメッセージを送信するためにEvent HubネームスペースとEvent Hubエンドポイントを作成する必要があります。
- ポータルを使用して、イベントハブのネームスペースとイベントハブを作成します。Namespace名を指定しStandard tierを選択しResource Groupを新規作成または既存のものを使用しLocationを指定します。残りのフィールドはデフォルト値のままにしておきます。「Create」をクリックします。システムがリソースを完全にプロビジョニングするまで、数分待つ必要があります。
リソースグループを開くと、イベントハブのネームスペースが表示されます。
本ガイドではThroughput UnitsおよびEnable Auto-Inflateプロパティは扱いません。詳細についてはAzureのドキュメントを参照してください。
次にEvent Hubネームスペースを選択し「+Event Hub」をクリックしてイベントハブを作成します。「Event Hub Name」を入力します。残りのフィールドはデフォルト値のまま「Create」をクリックします。
Event Hubのキャプチャ機能ではAzure Blob StorageへのAvro形式のみサポートしています。このガイドではStream Analyticsを使用してJSON フォーマットに対応するようにデータを移動します。
イベントハブが作成されると、以下のようにイベントハブのリストに表示されるようになります。
Azure Stream Analyticジョブの作成
イベントハブのメッセージをAzure Blob Storageに移動させたいのでイベントハブからのデータをStream Analyticsで処理することにします。
1.作成したイベントハブ(例:eventhub1)をクリックし「Process data」をクリックします。
2.「Explore」をクリックするとQueryダイアログが表示されます。イベントハブにメッセージがある場合は「Create」をクリックするとメッセージを処理することができます。
- 「Deploy query」をクリックしてEvent HubのメッセージをAzure Blob Storageに移動するStream Analyticジョブを作成します。
4.New Stream Analytic jobペインに「Job Name」を入力し、残りのフィールドはデフォルト値のままにしておきます。
5.「Create」をクリックします。
6.Output UIをクリックし、「+Add」をクリックしてBlob Storageを出力として定義します。
7.Blob Storage/Data Lake Storage Gen2ペインに、「Output alias」、「Storage account」、「Container」を入力します。Pathパターン(例えば、<ディレクトリ>/{日付}/{時間})はオプションです。
8.Event serialization formatがJSONに設定されていることを確認します。残りのフィールドはデフォルト値のまま、「Save」をクリックします。
Pathパターンのプロパティの詳細についてはAzure Stream Analytic custom blob output partitioningを参照してください。
8.右上隅をクリックしてOutputペインを終了します。
9.クエリを編集し新しい出力エイリアス(例:output1)を付けて保存します。
10.右上の角をクリックしてQueryペインを終了します。
11.ジョブの「Start」をクリックします。
メッセージをルーティングするためのAzure IoT Hubの作成
IoT Hubインスタンスを作成しIoT Hubデバイスを登録しRaspberry PiオンラインシミュレータからAzure IoT Hubに、そして最後にEvent Hubにメッセージを取得するためのルート/カスタムエンドポイントを設定する必要があります。
1.ポータルでIoT Hub を作成し、新しいデバイスを登録し、メッセージルーティングを定義します。
2.左上の「Create a resource」をクリックし、IoT Hubを検索します。「Create」をクリックします。
3.「Basic」タブで新しいリソースグループを作成するか、既存のリソースグループを使用し、Iot Hub Nameを指定します。「Size」タブで「B1:Basic Layer」を選択します。残りのフィールドはデフォルト値のままにし、「Review+create」をクリックして検証します。「Create」をクリックします。
詳細については、適切なIoT Hubの階層を選択するを参照してください。Number of IoT Hub unitsプロパティの設定やパフォーマンスに関するより一般的な話はここでは取り上げません。
オンラインシミュレータではハブに接続するためにレジストリでデバイスを識別する必要があります。
4.「Go to resource」をクリックするかIoT Hubペインで、「IoT Devices」を開き、「+New」を選択してIoTハブのデバイスを追加します。「Device ID」の名前を入力し「Save」をクリックします。
5.IoT デバイスダイアログの「Refresh」をクリックしてデバイスを表示し「Device」をクリックします。後でRaspberry PiオンラインシミュレータとIoT Hubデバイス (例: rasppi) を接続するために使用するPrimary Connection Stringをコピーしてください。
IoT HubデバイスがEvent Hubにメッセージを送信するためのルートとエンドポイントを設定する必要があります。
6.IoT Hubペインで、Messagingの「Message routing」をクリックして、ルートとカスタムエンドポイントを定義します。
RoutesはMessage Routingペインの最初のタブです。
7.「+Add」をクリックして新しいルートを追加します。次の画面が表示されます。Route Nameを入力しEndpoint選択します。エンドポイントについてはドロップダウンリストから選択するか、新しいものを追加します。この例では「+Add endpoint」をクリックしEvent Hubを選択します。
8.Add an event hub endpointペインでEndpoint name、既存のEvent hub namespace、およびEvent hub instanceを指定します。「Create」をクリックします。
9.「Save」をクリックしてルーティングルールを保存します。新しいルーティングルールが表示されるはずです。
10.Custom Endpointタブで、「Update」をクリックすると、イベントハブの下にカスタムエンドポイントルールが表示されます。StatusがHealthyであることを確認します。
Raspberry Piオンラインシミュレータを新しいデバイスに設定する
JSON文字列のソースとしてRaspberry Piオンラインシミュレータを使用します。データは、前項で作成したIoTハブ登録デバイスに送信されます。
これはシミュレーターが生成するJSON文字列の例です。(わかりやすくするために改行しています。)
{"messageId":2,
"deviceId":"Raspberry Pi Web Client",
"temperature":29.288325949023434,
"humidity":77.5147906}
オンラインシミュレータが接続するためにIoTハブデバイスのPrimary Connection Stringを追加する必要があります。
1.「START RASPBERRY PI SIMULATOR」をクリックします。
2.15行目を編集し'[Your IoT hub device connection string]'; を 「Primary Connection String」に置き換えます。
3.オンラインシミュレーターを実行します。BLOBストレージコンテナにJSONファイルが表示されるはずです。
4.「Stop」をクリックしてシミュレーターを停止します。
必要に応じてBLOBストレージデータを表示することができます。
A. Azureポータルにログインし「Resource groups」をクリックします。
B. ストレージアカウントを持つリソースグループを検索してクリックします。
C. 「Container Name」をクリックします。
D. JSONファイルをクリックし「Edit」でデータを表示します。
または、Azure Storage Explorer を使用することもできますが、Azure Storage Explorer の構成については本記事では説明しません。
Teradata Vantage Native Object StoreをAzure Blob Storageに接続
Native Object StoreはTeradata Vantage 17.0に搭載された新機能でAzure Blob Storageなどの外部オブジェクトストア上にあるデータセットを標準SQLで簡単に探索できるようになります。
設定するとAzure Blob上のオブジェクトはVantage上のテーブルと同じように表示されます。
詳細な情報はNative Object Store - Teradata Vantage Advance SQL Engine 17.0 (Orange Book) に記載されています。
Vantag はAzure Blob Storageアカウントにアクセスするために認可オブジェクトを必要とします。認可オブジェクトはAzure Blob Storageの認可に依存するだけでなくより高いセキュリティを提供します。
CREATE AUTHORIZATION DDL文ではUSERフィールドにストレージアカウント名を指定し、PASSWORDフィールドに先ほど保存したAzureアクセスキーまたはSAS Tokenを指定する必要があります。
認可オブジェクトはそれを参照する外部テーブルと同じデータベースで作成する必要があります。
1.以下のような構文を使用して、認可オブジェクトを作成します。
CREATE AUTHORIZATION DefAuth_AZ
AS DEFINER TRUSTED
USER 'mystorageacctrs' /* storage account name */
PASSWORD '********'; /* storage account key or SAS Token */
同じ名前のストレージアカウントを削除して再作成するとアクセスキーが変更されます。そのため認証オブジェクトを削除して再作成する必要があります。
外部テーブルを使用するとVantage Advanced SQLエンジン内で外部データを簡単に参照することができ構造化されたリレーショナル形式でデータを利用できるようになります。以下は単純な外部テーブルを作成するための構文の例です。
ストレージの LOCATION 情報には、AZ プレフィックス、「blob.core.windows.net」サフィックスを含むストレージアカウント名、コンテナ名の3つの部分がありスラッシュで区切られています。
外部セキュリティ認証を使用する場合は、DDL文のEXTERNAL SECURITY DEFINER TRUSTED DefAuth_AZ構文で指定します。
2.以下のような構文で外部テーブルを作成する。
CREATE MULTISET FOREIGN TABLE json ,
EXTERNAL SECURITY DEFINER TRUSTED DefAuth_AZ
USING
(
LOCATION ('/AZ/mystorageacctrs.blob.core.windows.net/json')
)
CREATE FOREIGN TABLEステートメントを実行した後show table jsonコマンドで完全な外部テーブル定義を表示することができます。以下はその例です。
CREATE MULTISET FOREIGN TABLE json ,FALLBACK ,EXTERNAL SECURITY DEFINER TRUSTED DefAuth_AZ,
MAP = TD_MAP1
(
Location VARCHAR(2048) CHARACTER SET UNICODE CASESPECIFIC,
Payload JSON(8388096) INLINE LENGTH 32000 CHARACTER SET UNICODE)
USING
(
LOCATION ('/AZ/mystorageacctrs.blob.core.windows.net/json')
MANIFEST ('FALSE')
PATHPATTERN ('$Var1/$Var2/$Var3/$Var4/$Var5/$Var6/$Var7/$Var8/$Var9/$Var10/$Var11/$Var12/$Var13/$Var14/$Var15/$Var16/$Var17/$Var18/$Var19/$Var20')
ROWFORMAT ('{"record_delimiter":"\n", "character_set":"UTF8"}')
STOREDAS ('TEXTFILE')
)
NO PRIMARY INDEX ;
外部テーブルが作成されたのでAzure Blob Storage上のオブジェクトにアクセスすることができます。
JSONは基本的にキーと値のリストです。JSON_KEYSテーブル演算子でキー(属性)のリストを取得するには、次のように記述します。
SELECT DISTINCT * FROM JSON_KEYS (ON (SELECT payload FROM json)) AS j
フィルタリングを行わず少数の行を選択することで実際の値のリストを得ることができます。
SELECT Payload.* FROM json
Payloadキーワードからアスタリスクを省略するとフィールドと値を含む名前-値ペアを取得できます。
SELECT Payload FROM json
テーブルの上にビューを作成しユーザーやツールと基礎となるテーブルの間のレイヤーを提供することはよくある手法です。
以下は、JSON外部テーブル上のビューの例です。
CREATE VIEW json_perm_cols_v AS (
SELECT
CAST(payload.messageId AS INT) MessageID,
CAST(payload.deviceId AS VARCHAR(25)) DeviceID,
CAST(payload.temperature AS FLOAT) Temperature,
CAST(payload.humidity AS FLOAT) Humidity
FROM json
);
この時点で、ビューはユーザーやツールによって使用される可能性があります。
Native Object Storeは外部テーブルを通じて読み取った外部オブジェクトの永続的なコピーを自動的には作成しません。
外部オブジェクトのデータをVantageのテーブルにコピーすることができます。以下はいくつかの簡単なCOPYオプションです。
CREATE TABLE AS...WITH DATAステートメントはデフォルトでターゲットテーブルとしてNo Primary Index (NoPI)リレーショナルテーブルを作成します。それ以上の操作を行わない場合このNoPIテーブルは2つの列だけを持つことになります。このNoPIテーブルにはLocationとPayloadの2つのカラムがあるだけです。
CREATE TABLE json_perm AS (select * from json) WITH DATA
各ペイロードごとにカラムを作成するのがよいでしょう。以下の例ではこれを実現しています。
CREATE TABLE json_perm_cols AS
(SELECT
CAST(payload.messageId AS INT) MessageID,
CAST(payload.deviceId AS VARCHAR(25)) DeviceID,
CAST(payload.temperature AS FLOAT) Temperature,
CAST(payload.humidity AS FLOAT) Humidity
FROM json
)
WITH DATA
NO PRIMARY INDEX
もう一つの方法はINSERT...SELECTステートメントを使用することです。この方法では永続的なテーブルが事前に作成されている必要があります。以下の例ではまずテーブルを作成しそれから挿入を実行します。
CREATE SET TABLE json_perm_empty ,FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO,
MAP = TD_MAP1
(
MessageId INTEGER,
DeviceId VARCHAR(25) CHARACTER SET LATIN NOT CASESPECIFIC,
Temperature FLOAT,
Humidity FLOAT)
PRIMARY INDEX ( MessageId );
INSERT into.json_perm_empty
SELECT
payload.messageId,
payload.deviceId,
payload.temperature,
payload.humidity
FROM json
おわりに
Azure BLOBストレージへのNOSアクセスはいかがでしたでしょうか?
ぜひお試しください!