#背景
従来のデータ分析の世界では、一般的に、データウェアハウス等で加工(スキーマを定義)した状態のデータを利用し、キューブなどを構築するといった流れでデータ分析をしてきました。そして近年、ビッグデータを取り扱うようになり、必ず指定されたスキーマでデータウェアハウスに蓄積するアプローチではなく、生データから都度好きなデータを抽出するといったアプローチの方法も出てきました。Microsoft Azureでは、この後者のアプローチをAzure Data Lake、Azure HDInsightといったサービスで提供しています。
今回は、Azure Data Lakeの使い方と、独自言語のU-SQLを活用し、[「Cortana Intelligence Suiteを構築(第3回)」](URL http://qiita.com/taiki_yoshida/items/58cd5af970e24f2453de)までで構築し、データを蓄積してきた、Azure BLOBストレージのデータを分析してみます。
#事前に準備するもの
- Azure サブスクリプション
- Visual Studio 2015以降(どのエディションも利用可能)
- 事前にAzure SDKが必要です(https://www.visualstudio.com/ja-jp/features/azure-tools-vs.aspx)
- 事前にAzure Data Lake Tools for Visual Studioが必要です(https://www.microsoft.com/en-us/download/details.aspx?id=49504)
#設定手順
##Azure Data Lake Analyticsの準備
Azure Data Lake Analyticsを利用するために、まずはAzureポータルからAzure Data Lake Analyticsをデプロイする必要があります。
-
「新規」>「Intelligence + analytics」>「Data Lake Analytics」の順にクリックします。
-
各項目を記入していきます。記入したら、「作成」をクリックします。
現在、場所は米国東部2のリージョンのみ選択できます。
価格レベルは従量課金制なので、クエリを実行した分のみ課金される仕組みとなっています。
##分析するための下準備
Data Lake Analyticsを利用するためには、U-SQLという新しい言語でクエリを作成します。
ざっくり言うと、普通のSQL言語のようでC#も含められてしまう、パワフルなクエリ言語です。ここではあまり詳しく触れませんが、必要最低限のところまでご紹介します。
今回は、JSON形式の生ファイルを読み込んで、それをクエリで集約したものをSQL Databaseへ書き込んでしまうということを実施してみようと思います。ですが、Azureポータルの画面でジョブを作成する画面からは、直接JSON形式のファイルは読み込めないんです。残念。
ということで、JSONを扱うためのアセンブリをVisual Studioから登録する流れとなります。
###アセンブリの登録
JSONを取り扱うには、事前にNewtosoft.Json.dll等のアセンブリーをAzure Data Lake上へ登録しておく必要があります。通常のC#プロジェクトなどとは違い、NuGetは利用できません。そのため、Newtonsoft.Json.dllをビルドして、ビルドしたものをAzure Data Lakeへアップロードします。
-
Githubから[USQLのレポジトリ](URL https://github.com/Azure/usql)をダウンロードしておきましょう。ここには、JSONから読み込むためのサンプルコードなどが用意されており、非常に便利です。
-
ダウンロードしたフォルダ内の、Examples/DataFormats/Microsoft.Analytics.Samples.Formatsにあるソリューションファイルを開きます。
-
クラウドエクスプローラーから、Data Lake Analyticsを開き、Databases > master > Assembliesを右クリックし、「アセンブリの登録」をクリックします。
-
ステップ5~8までを、Microsoft.Analytics.Samples.Formats.dllに対しても行います。
###ストレージアカウントの関連付け
Azure Data Lake AnalyticsでAzureストレージアカウントを利用するために、関連付けをしておく必要があります。
それをすることで、アドレス形式で、Azureストレージアカウントをデータ元として指定できるようになります。
-
Data Lake AnalyticsをAzureポータルから開き、「データソース」>「データソースの追加」をクリックします。
-
ストレージの種類を「Azure Storage」にし、メソッドの選択は「アカウントの選択」をクリックし、Azure Storageでは関連付けしたいストレージアカウントを指定します。あとは「追加」をクリックするだけです。
##クエリの作成
-
以下のコードを利用します。 「wasb://」のアドレスは、事前に関連付けしたAzureストレージアカウントのアドレスです。{*}と入力することで、フォルダ内/ファイル名すべてを選択したことを意味します。
CREATE ASSEMBLY IF NOT EXISTS [Newtonsoft.Json] FROM "assemblies/Newtonsoft.Json.dll";
CREATE ASSEMBLY IF NOT EXISTS [Microsoft.Analytics.Samples.Formats] FROM "assemblies/Microsoft.Analytics.Samples.Formats.dll";
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
//USE DATABASE [traindetail];
@json =
EXTRACT jsonString string FROM @"wasb://tyqiita@tyqiita/logs/{*}/{*}/{*}.json" USING Extractors.Text(delimiter:'\b', quoting:false);
@jsonify = SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(jsonString) AS rec FROM @json;
@columnized = SELECT
DateTime.Parse(rec["dc:date"]) AS date,
rec["odpt:railway"] AS railway,
rec["odpt:trainNumber"] AS trainnumber,
Double.Parse((rec["odpt:delay"] ?? "0")) AS delay,
rec["odpt:startingStation"] AS startingstation,
rec["odpt:terminalStation"] AS terminalstation,
rec["odpt:fromStation"] AS fromstation,
rec["odpt:toStation"] AS tostation,
rec["odpt:railDirection"] AS raildirection
FROM @jsonify;
OUTPUT @columnized
TO @"wasb://tyqiita@tyqiita/output/result.txt"
USING Outputters.Text();
##クエリを実行
Data Lake Analyticsでの実行処理を「ジョブ」と言います。
Visual Studioからジョブを発行することで、ジョブがData Lake Analytics内で実行されるようなイメージです。
-
Visual Studioのソリューションエクスプローラーから、作成したUSQLを右クリックし、「Submit Script」をクリックします。
-
Submit Jobの画面が表示されます。ここで、Job Nameをわかりやすい名前に変更します。複数のData Lake Analyticsを作成している場合は、ジョブを実行するData Lake Analyticsのアカウントを選びます。Parallelismとは、この処理の並列実行数のことです。多ければ多いほど、並列で処理されるため、早くはなりますが、データ量が少ない場合は並列実行のためのオーバーヘッド(準備処理)の方が時間がかかるため、あまり差は感じられません。
-
出力されたデータは、AzureポータルでData Lake Analyticsへアクセスし、「データエクスプローラー」または、「Microsoft Azure Storage Explorer」から確認/ダウンロードが可能です。
#リンク集
著者が作成する際に、参考にしたリンクです:
http://sqlblog.com/blogs/jorg_klein/archive/2016/06/27/use-adlcopy-to-generate-u-sql-jobs-that-copy-data-between-azure-blob-storage-and-azure-data-lake-store.aspx
https://azure.microsoft.com/en-us/documentation/articles/data-lake-analytics-manage-use-portal/
https://azure.microsoft.com/en-us/documentation/articles/data-lake-store-copy-data-azure-storage-blob/
http://www.rcloudnetwork.com/the-cloud-in-the-news/creating-big-data-pipelines-using-azure-data-lake-and-azure-data-factory/
https://github.com/Azure/usql
https://blogs.msdn.microsoft.com/robinlester/2016/01/04/an-introduction-to-u-sql-in-azure-data-lake/