Azure Data Lake を試してみました


2015年12月4日現在、PreviewとなっているAzure Data Lakeを試してみました。
現状、Previewということで申請制になっているようです。申請から1週間くらいでApprovedのメールがきました。

##Azure Data Lakeとは？

さて、この[Azure Data Lake](https://azure.microsoft.com/ja-jp/solutions/data-lake/)。どんなサービスでしょうか？

リリースやサービス内容を見るだけではよく理解できなかったので試してみるのですが。。。
リリースやサイトの情報を読む限り、

Hadoopベースのサービスで、Data Lake Store(HDFS)に溜まったデータをYARN経由で分析レイヤーであるData Lake Analyticsのツール(U-SQL)を利用して利用するもの。さらに分析対象はHDFSだけでなく、SQL Serverのデータなどもシームレスに制御できる！

というような説明なので、

* SQLが使えるのでSQL on Hadoopの一種？
* HDFS以外もアクセスできるのでPrestoみたいな感じ？
* でも、YARN経由なのでHive on Tezみたいな感じ？

という印象でした。

個人的にはPresto,Impala,Drillみたいなリアルタイム系SQLを期待しました（対話的とありましたし）。

#####が、結論から言えば違うようです。

イメージ的には

#####Hive on Tez (U-SQL on MSのエンジン)

に近い。つまり、リアルタイム系ではない。

というのは、Data Lakeでの処理は、

#####Preparing -> Queued -> Running -> Succeeded(Error)

と遷移しますが、ものすごく簡単な処理（Hiveなら10秒くらいの処理でも）Runningになるまでに1分くらいかかるので、いわゆるリアルタイム（インタラクティブ）系の処理用ではないようです。

となるとリアルタイム系には[SQL Data Warehouse](https://azure.microsoft.com/ja-jp/services/sql-data-warehouse/)を使えということですかね。
あるいは、[PolyBase](https://msdn.microsoft.com/en-us/library/mt143171.aspx)がリアルタイム系のSQL on Hadoopなのかな？

##使ってみる

とはいえ試してみましょう。

###準備

* Azureのアカウントの取得
* Data Lake Previewへの申込（2015年12月4日現在）

###課金体系

試すにあたっては課金体系は気になるところです。
Data Lakeでは、AnalyticsとStoreで別の料金体系です。
AnalyticsはGoogle BigQueryとかと同じようにクエリ当たりいくら的になるようです（ちょっと違いますが）。

####[Analytics](https://azure.microsoft.com/ja-jp/pricing/details/data-lake-analytics/)

料金は、

処理時間と正常完了タスク数 x Parallerism数という感じになるようです。

* 1.74円/分
* タスク（正常）完了につき2.55円
* あとは並列処理数

20並列で10分の処理をした場合、20para x 10min x 1.74 = 348円 + 2.55 = 350.55円

>プレビューは半額？らしいのですが、今回のテストの予算は2000円くらいでしょうか。

1並列で10分かかる処理の料金は、5並列にして2分で終わった場合の料金と同じとなるわけです。

Accountを維持してるだけでは課金されない模様です。

####[Store](https://azure.microsoft.com/ja-jp/pricing/details/data-lake-store/)

ストアはデータ料とトランザクション数での課金のようです。

* 4.08円/GB/月
* 7.14円/100万トランザクション

となるようです。1Tバイト溜めて4080円。1日 1000トランザクション x 30 = 30000トランザクションなら、100万件以下なので7円ですかね。

###Data Lake Analytics Accountの作成

Data Lake サービスの入り口はData Lake Analytics Accountの作成ということになります。
Storeの方は、Analyticsのアカウントを作成すると、標準で1つのData Lake Storeも作成されるようです。

![datalake](http://www.bluecode.jp/qiita/datalake/001.png)

作成を実行すると5分くらいで準備完了となります。HDInsightは20分くらいかかるので、早い感じはします。

![datalake](http://www.bluecode.jp/qiita/datalake/002.png)

リソースを確認するとAnalyticsとStoreサービスが作成されています。

###データロード

分析対象となるデータはData Lake StoreもしくはBLOB等にあるものを利用するのが基本想定のようです。ここでは、学習用に標準で用意されているテストデータをコピー（生成）して、利用してみます。

生成したAnalyticsサービスを選択し、[Learn]の項目のExplore Sample jobsをクリック、表示されたSample Jobsウインドウで、Copy ..?を押します。すると、標準のData Lake Storeの中に、いくつかのサンプルデータが生成されます。

![datalake](http://www.bluecode.jp/qiita/datalake/003.png)

生成されたデータはData Exprorerで閲覧することができます。
今回は、この内、SearchLog.tsvを利用します。

![datalake](http://www.bluecode.jp/qiita/datalake/004.png)

自分のデータを分析したい際には、[Upload]を利用すればよいようです。

###分析(U-SQLの実行）

さて、データの準備も完了したので、分析（クエリの実行）をしてみます。
分析は、U-SQLを利用して行います。

そしてU-SQLの記述、実行は、

* AzureポータルのWebコンソール
* Visual StudioのU-SQLプロジェクト

から行えるようです。

VSは何かと面倒なので、ここではWebコンソールから実行してみます。

なお、U-SQLについては[こちら](https://azure.microsoft.com/ja-jp/documentation/articles/data-lake-analytics-u-sql-get-started/)の記事が参考になります。今回もこののスクリプトの一部を抜粋して利用します。

Analyticsのページから、[New Job]を選択します。

![datalake](http://www.bluecode.jp/qiita/datalake/005.png)

New U-SQL Job画面が開くので、そこのコンソールにスクリプトを記述します。

![datalake](http://www.bluecode.jp/qiita/datalake/006.png)

[Submit Job]を押すことでJobが実行されます。
いちおう、スクリプトは下記の通りです。

```csharp

//tsvを高構造化してロードする
@searchlog =
    EXTRACT UserId          int,
            Start           DateTime,
            Region          string,
            Query           string,
            Duration        int?,
            Urls            string,
            ClickedUrls     string
    FROM "/Samples/Data/SearchLog.tsv"
    USING Extractors.Tsv();

//クエリ実行
//fromで@searchlogとか指定できる（ステキ）
@rs1 =
    SELECT Start, Region, Duration
    FROM @searchlog
WHERE Region == "en-gb";

//outputの指定
OUTPUT @rs1   
    TO "/output/SearchLog-transform-rowsets.csv"
    USING Outputters.Csv();
```

Jobの状況はダッシュボードやJob詳細画面で確認できます。
STATEの箇所が進行状況に応じて変化していきます。

![datalake](http://www.bluecode.jp/qiita/datalake/007.png)

###実行結果


####処理速度

分析対象となっているSerchLog.tsvは、たった23行のタブ区切りテキストですが、処理には2分8秒かかりました。冒頭書いた通り、処理はPreparing -> Queued -> Runnningと進み、そのうち、PreparingとQueuedに1分くらいかかっているので、実際の処理の速さはこの程度の処理だとなんともわかりません。

![datalake](http://www.bluecode.jp/qiita/datalake/008.png)

ただ、現状、どんなに小さな処理でも最低のリードタイムとして1~2分はかかるもようです。

多分、利用シーンとしては2時間の処理が10分になるようなケースなのでしょうけど、開始までの絶対時間が1分以上というのは、なかなか厳しいですね。。。素のHiveとかでも数秒ですので。

####処理結果

処理結果は、Jobの詳細から確認することができます。結果だけでなく、Inputファイルの状況も確認できます。

![datalake](http://www.bluecode.jp/qiita/datalake/009.png)

##スケールさせてみる

処理が遅いのは、初回だからかな？という思いもあったので、テストとして以下の2つを実行してみました。

* そのままの構成でもう一度投げてみる
* ParallelismをMaxの20で実行してみる

![datalake](http://www.bluecode.jp/qiita/datalake/010.png)

並列数はJobの実行時にスライダーで変更できます。
私のサブスクリプションではMaxが20に制限されているようです（変更は可能）。

###結果

結論から言えば全く変わりません。Pallarelismを増やせば、プロビジョニングに時間がかかるので、少々遅くなるのはわかります。が、同一クエリでもバラつきがあるようです。

![datalake](http://www.bluecode.jp/qiita/datalake/011.png)

###参考情報

実は、この記事を書く前に、同じスクリプトで同じようにスケールさせてながら試したときは、通常の実行に8分?!、Parallelismを増やすほどに2分に向けて処理時間が短くなる傾向があったのですが、結果、あまり関係無かったようです。

恐らく、良く利用されているサブスクリプションにCPUパワーを割り振るなどの処理が裏で行われた結果、8分の処理が2分に短縮されたとかいう感じではないでしょうか（推測ですが）。

![datalake](http://www.bluecode.jp/qiita/datalake/012.png)

##Data Lake まとめ

U-SQLが利用できるということから、リアルタイム系でも利用できるSQL on Hadoopの1つとして期待しましたが、2015年12月4日時点では、そのようなものでは無いようです。

となると、HDInsightのHiveやSparkSQLでいいんじゃね？という印象が無いわけではありません。

一方、U-SQLは学習コストが低く、C#の文法の一部が取り入れられており、馴染み易い感じはしました。
まだ、Previewですので、正式リリースに期待したいと思います。

* DataLake(U-SQL)はリアルタイム系のSQL on Hadoopではない。
* どんな処理でもレスポンスに最小2分はかかる。
* U-SQLは近代的で覚えやすい。
* リアルタイム系はSQL Data Warehouseを使うことになる（たぶん）。
* 今後に期待。

##参考

普通のHDInsightやSparkの利用は以下を参考にしてみてください。

* [HDInsight on Linuxを試してみる](http://qiita.com/zaburo/items/134661f2bdb0a02d447a)
* [HDInsightでSparkを使ってみる](http://qiita.com/zaburo/items/e4bef52a4419e017e80f)