Azure Data Lake を使ってログや画像を分析してみよう 参加レポート

日本マイクロソフト主催の主題のイベントに参加してきたレポートです。ビッグデータのビの字も知らない状態で参加した人の感想になるので悪しからず。

参加の目的

  • ビッグデータまわりの基本的な知識を仕入れる。
  • Azure Data Lakeってよく見るけど実際何ができるの?を知る。

要約

  • 大量のデータを蓄積し、分析と結果の評価を繰り返すことで価値あるデータを導き出せるよ。
  • 事前にほしいレポートの形を決めてそれに伴うスキーマを定義するDWHの仕組みと対比すると、データレイクはスキーマは決めずとにかく生データを溜めておき、分析する段階でスキーマを決める。DWH的なやり方は「スキーマオンライト」、データレイク的やり方は「スキーマオンリード」と言う。
  • こうしたビッグデータ分析の手段としてHadoop等があるが、サーバ管理などコストがかかる。そこをクラウドでPaaSとして提供するのでスケールとか柔軟にできて便利ですよ、AzureならAzure Data Lakeでどうぞ。ということ。

Azure Data Lake 仕組み

Rawデータの保管先となる「Azure Data Lake Storage(ADLS)」と、データ分析を担う「Azure Data Lake Analytics(ADLA)」で構成される。
様々なデータソース(Web、IoT、イベント、etc)から収集したデータはどんな形式でもADLSに溜められる。2018年10月現在、Gen1というのが現状のサービスだが、色々課題を解決したGen2がプレビュー中。形式を問わないのはBlobと一緒じゃん、という感じだがBlobとの違いは、データの保存方式が分散型で分析に特化していたり、階層構造化されていたり、お値段が4円GB/hとの倍くらいかかるなど色々とある。そしてAzure Data Lake Analyticsの分析データソースにはAzure Blob Storageを指定することもできる。じゃあBlobでよくない?はい、実際MSの方もBlobがおすすめって言ってました。この辺はよっぽど大量のデータになってきたりしたら分析処理のパフォーマンス面で差が出たりするのかもしれないけど、ちょっとやってみないと分からないな、と感じた。
データ分析の部分はADLAのほかにも「HDInsight」「Azure Databricks」が選択できるとのことだったが、今回のハンズオンではAzure Data Lake Analyticsのみを体験した。なお、HDInsightやDatabricksのほうがより専門的な分析が可能とのこと。この辺はチュートリアルやって雰囲気だけでもつかんでみてね、とMSの方からアドバイスをもらったのでそのうちやってみよう。

ADLAでの分析

U-SQLという、T-SQLにC#関数要素を足して色んなデータが使えるぜ、という構文をトッピングした感じの言語を使用する。
SQLを業務で使用していれば全く違和感なく使い始めることができる感じで、基本的にたまった生データをインプットに、項目を選択(ここがスキーマオンリード的)し、必要なら更にGroup byとかで集計したりして最終的な吐き出し先にデータを出す。
吐き出し先もなんでもいけて、csvとかjsonも可能だし、ADLS自体にSQLServerっぽいテーブルを定義してそこに出すこともできる。StreamAnalyticsの入力ソースにすることも可能。
U-SQLをキックするには、これもまた色々なやり方がある模様。

  • Azureポータル(ハンズオンでやったのはこれ)
  • Visual Studio / VS Code
  • Azure CLI
  • PowerShell
  • Azure Data Factoryからキック

ちょっと作業中に大量のデータを処理したいわー、っていうときにVSCodeからちゃちゃっとクエリできるようになるとちょっとイカすかも、と思った。
実際の業務で導入するとしたらAzure Data Factoryとの連携は必須なんじゃなかろうか。これはS3とか外部のデータソースもデータレイクに溜められるらしい。

面白かったCognitive Serviceとの連携

ADLAの拡張機能をインストールするとU-SQL内でCognitive Service(の一部)のAPIを叩くことができる。
まずAPIを有効にするにはAzureポータルのADLA管理画面内、Sample Scriptsメニュー内の「Install U-SQL extensions」を押下して拡張機能をインストールする必要がある。

インストールできたら以下のようなU-SQLを書いて実行する。

REFERENCE ASSEMBLY ImageCommon;
REFERENCE ASSEMBLY FaceSdk;
REFERENCE ASSEMBLY ImageEmotion;
REFERENCE ASSEMBLY ImageTagging;
REFERENCE ASSEMBLY ImageOcr;
// Get the image data 
@imgs =
EXTRACT FileName string,
ImgData byte[]
FROM @"/images/{FileName}.jpg"
USING new Cognition.Vision.ImageExtractor();
// Extract the number of objects on each image and tag them
@tags =
PROCESS @imgs
PRODUCE FileName,
NumObjects int,
Tags SQL.MAP<string, float?>
READONLY FileName
USING new Cognition.Vision.ImageTagger();
@tags_serialized = 
SELECT FileName,
NumObjects,
String.Join(";", Tags.Select(x => String.Format("{0}:{1}", x.Key, x.Value))) AS TagsString
FROM @tags;
OUTPUT @tags_serialized
TO "/Outputs/tags.csv"
USING Outputters.Csv();

これを実行するとimages配下においてあるjpgの画像を解析してタグ付けした結果をcsvで出力できた。

入力にした画像

結果のcsv

"girl-1461619_640",8,"beautiful:0.3198251;close:0.2636917;fruit:0.9661595;melon:0.9579518;outdoor:0.9828554;person:0.9984243;watermelon:0.8859124;woman:0.9394757"

おぉ、楽しい。
Cognitive ServiceをU-SQLから使ったからといってAzure Data Lakeに上乗せで課金されるようなことはないとのこと。使いようによってはいいのかもしれないが、プロダクトレベルで使っていくとなると当のAzure Data Lake自体がいいお値段になるのであまり期待しないほうが良いかもしれない。

実行速度にやや不安が?

米国中部のリージョンでハンズオンを進めたのだけど、小さいジョブでもひどいときは9分とか処理が準備中から進まなかったり、最後の画像分析も画像3枚に対して8分弱時間がかかったりした。1AU(処理の単位。1AUは2コア6GBメモリのマシン相当)でやっていたのだけど、ここはマイクロソフトの方も「こんなに遅いはずない」って言ってた。確かにサクサク動いて30秒とかで完了することもあったけど、やはりある程度クラウドの機嫌に左右されるのは致し方ないことなのだろうか。

勉強になりました

ビッグデータの入門編として、自分にはちょうど良かったです。ほかの分析手法の学習やAWSと比べてどうなの?というところを今後調べていく土台が一つできました。ありがとうございました。