SlideShare a Scribd company logo
1 of 263
#azurejp
https://www.facebook.com/dahatake/
https://twitter.com/dahatake/
https://github.com/dahatake/
https://daiyuhatakeyama.wordpress.com/
https://www.slideshare.net/dahatake/
“Volume”
膨大
“Velocity”
スピード
“Variety”
多様性
社内の
資産
サーチや
ソーシャル
オープン
データ
コラボ可視化
Inbound
Data
Buffered
Ingest
(message bus)
Event 処理 Logic
Event Decoration
Spooling/Archiving
Hot
Store
Analytical
Store
Curation
Dashboards/Reports
Exploration
Interactive
Data Movement
/ Sync
取り込み
Modern Data Lifecycle
処理 保存 利用
キュレーション
取り込み
Modern Data Lifecycle
処理 保存 利用
Event Hubs
IoT Hubs
Service Bus
Kafka
HDInsight
ADLA
Storm
Spark
Stream Analytics
ADLS
Azure Storage
Azure SQL DB
Azure SQL DW
ADLS
Azure DW
Azure SQL DB
Hbase
Cassandra
Azure Storage
Power BI
キュレーション
Azure Data Factory Azure ML
Dashboards InteractiveExploration
API も考慮する必要あり
即、学べる
https://start.cortanaanalytics.com/
HDInsight Analytics Store
Hadoop as a Services
Big Data Query
as a Services
容量無制限
Raw Data
アクセスコントロー
ル
Azure Data Lake service
無限にデータをストア・管理
Row Data を保存
高スループット、低いレイテンシの分析ジョ
ブ
セキュリティ、アクセスコントロール Azure Data Lake store
HDInsight & Azure Data Lake Analytics
https://azure.microsoft.com/ja-jp/regions/services/#
ADL Analytics Account
Links to ADL Stores
ADL Store Account
(the default one)
Job Queue
キーの設置:
- Max Concurrent Jobs
- Max ADLUs per Job
- Max Queue Length
Links to Azure Blob Stores
U-SQL Catalog
Metadata
U-SQL Catalog Data
ADLAU = Azure Data Lake Analytics
Unit
ON PREMISES CLOUD
Massive Archive
On Prem HDFS
インポート
Active Incoming
Data
継続更新
“Landing Zone”
Data Lake Store
AzCopy
でコピー
Data Lake
Store
Data Lake
Analytics
永続ストア箇所への移動
と
ジョブ実行により作成さ
れた
構造化データセットの保
存
DW (many
instances)
構造化データの作成。
CONSUMPTION
Machine
Learning
機械学習の実行、検証
Web Portals
Mobile Apps
Power BI
実験・検証
A/B テストや
顧客行動の変化の追跡
Jupyter
Data Science
Notebooks
HDInsight Analytics Store
Hadoop as a Services
Big Data Query
as a Services
容量無制限
Raw Data
アクセスコントロー
ル
すぐに使えるクラウド上の Hadoop / Spark です
 日本では東西両方のリージョンで利用可能
 豊富なクラスタータイプ
 Hadoop
 2.6.0 / 2.7.0 / 2.7.1
 HBase
 0.98.4 / 1.1.2
 Storm
 0.9.3 / 0.10.0
 Spark (プレビュー)
 1.5.2 / 1.6.0
 R Server on Spark (プレビュー)
 1.6.0
※ Premium プラン専用
Hortonworks と協業し、Windows 環境で Hadoop を提供します
 元々 Java で書かれたオープンソースプロジェクトである
Hadoop ですが、 Windows 環境でスムーズに動かすため
には
いくつか工夫が必要でした
 Microsoft は Hortonworks 社と協業し、 Hadoop の
Windows 環境への移植と最適化を行っています
 Hortonworks は Yahoo! で Apache Hadoop の
開発に携わっていたチームが独立して設立された企業で
す
 “Hortonworks Data Platform” (HDP) という
Hadoop ディストリビューションを開発しており、
これが HDInsight のコア部分です
http://jp.hortonworks.com/hdp/
HDFS
分散ファイルシステム“HDFS” (Hadoop Distributed File System)
 複数のコンピューターを束ねて、
一つの仮想的なファイルシステムを提供
 Hadoop クラスタに属する全ての
ノードが同じ名前空間を共有
 各ファイルは 64 MB ~ 256 MB 程度の
ブロックに分割されて、複数ノードに分散
 ブロックサイズが大きいのは、
シーケンシャルアクセスに特化している
ため
 各断片は最低 3 ノードに複製され、
ノード障害への耐性を持つ
 一つのファイルの複数の部分を、複数の
コンピューターで同時に処理することで、
処理を高速化することができる
断片 1 断片 2 断片 3 断片 4
断片 1 断片 2 断片 3 断片 4
ファイル 1 断片 1 断片 2 断片 3 断片 4
ファイル 4 断片 1 断片 2 断片 3 断片 4
分散プログラミングモデル “MapReduce”
2013-08-26 23:59:03 W3SVC1 192.168.0.1 GET /…
2013-08-26 23:59:05 W3SVC1 192.168.0.1 GET /…
2013-08-26 23:59:25 W3SVC1 192.168.0.1 GET /…
2013-08-27 00:01:02 W3SVC1 192.168.0.1 GET /…
2013-08-27 00:02:04 W3SVC1 192.168.0.1 GET /…
 名前は一見難しげですが、実際には単純です
(だからこそスケーラビリティがあります)
 例えば右のような Web のアクセスログがあるとして、
 伝統的なテキスト処理ツールによる集計はこのようなものですが、
$ grep /Login.aspx access_log | sort | uniq –c > output.txt
対象ファイルの全行を頭から舐めて
何らかの処理をする(この場合は検索)
中間結果を集計の
ためにソートする
ソートされたデータを
数え上げて結果を得る
MapReduce はこういった処理をクラスター上で並列分散実行する仕組みです
Map Reduce
Mapper
Reducer
 入力ファイルの1行が value に渡されてくる
(単なる文字列として!)
 左の例は、単語毎の出現回数を数える Map 処理。
StringTokenizerを使って自分で文字列を単語単位に
分解し、「いま、”・・・”という単語があった」と
記録(OutputCollectorに出力)していく
 「Hadoopは非構造化データの処理に向く」というのは、
「単なる文字列を全部自分で処理する」ということ!
 こちらは Reduce 処理
 Map 処理の出力は、Hadoopによってキー毎に集約され、
reduce メソッドに渡される。イメージとしては、
(“単語1”: [1,1,1])
(“単語2”: [1,1])
のような「キー:値」形式のデータ
 「“単語1”は値が3つ入っているので3回出現した」、
という感じで数えていく
そもそも別物であり「データ量が多いならHadoop」というわけでもありません
 Hadoopの根幹は
「フラットファイルに格納された大量のデータを
頭から順次走査して何らかの処理を行い、
結果をファイルへ出力する並列分散バッチ処理基
盤」
と考えておけばあまり間違っていません
 処理の対象は「データベース」ではなく「ファイル」で
す。
当然、スキーマやテーブルという概念はありません
 ということは、インデックスという考え方もありません。
大量のデータの中から特定の部分に素早くシークして
データを取り出すような操作は苦手です
 逆に得意なのは、シーケンシャルな全件処理です
 ランダムアクセスよりシーケンシャルアクセス
 レイテンシより、スループット優先
 インタラクティブな処理より、バッチ処理が得意
RDBMS
想定する
データ操作
小さなデータの
ランダムな参照、更
新
大きなデータの
挿入・参照。
更新はない
レスポンスタイ
ム
速い 遅い
拡張性の方向 スケールアップ スケールアウト
データ構造 構造化データ 準構造化データ
「Hadoop徹底入門 第2版 オープンソース分散処理環境の構築 」より
http://www.amazon.co.jp/dp/479812964X
Hive, Impala, Presto...
 ちょっとした検索処理の度に、毎回Javaプログラムを書くのはさすがに面倒です
 そこで、SQL(的な)クエリでHadoopに対する処理を行うことのできる関連プロジェクトがいくつかあります
 おそらく一番歴史が長くて有名なのが、Facebookによって開発された”Hive”です。(https://hive.apache.org/)
 “Hive QL”というSQL的な言語でクエリを記述すると、MapReduce ジョブに変換して実行してくれます
2013-08-26 23:59:03 W3SVC1 192.168.0.1 GET /…
2013-08-26 23:59:05 W3SVC1 192.168.0.1 GET /…
2013-08-26 23:59:25 W3SVC1 192.168.0.1 GET /…
2013-08-27 00:01:02 W3SVC1 192.168.0.1 GET /…
2013-08-27 00:02:04 W3SVC1 192.168.0.1 GET /…
こういうテキストファイルを
date time sitename s-ip method uri
2013-08-26 23:59:03 W3SVC1 192.168.0.1 GET /...
2013-08-26 23:59:05 W3SVC1 192.168.0.1 GET /...
2013-08-26 23:59:25 W3SVC1 192.168.0.1 GET /...
2013-08-26 00:01:02 W3SVC1 192.168.0.1 GET /...
2013-08-26 00:02:04 W3SVC1 192.168.0.1 GET /...
こんなテーブルだと思ってクエリを投げられます
 Hive は非常に便利で広く使われていますが、「基本的にはバッチ処理、素早いレスポンスは期待できない」という点は変
わっていません
 その欠点を補うべく、Cloudera の Impala, Facebook の Presto といった新しいプロジェクトが生まれています
Hadoop Common
Hadoop HDFS
Hadoop MapReduce
主要な関連プロジェクト
Hive
Ambari
HBase
Mahout
HDInsight
その他の
Hadoop on Azure
Windows 版
Linux 版
CDH
(Cloudera)
HDP
(Hortonworks)
“WASB”
ブロック BLOB を
ダイレクトに使う
“HDFS on BLOB”
Azure 仮想マシンの
データディスクを
束ねて HDFS を構成
http://jp.hortonworks.com/wp-content/uploads/2013/05/H1H2Tez.png
 Twitter 分析を行っていた BackType 社が開発
 Twitter が BackType を買収したことで
Twitter から OSS として公開される
 その後、2014年9月に
ASFのトップレベル プロジェクトとなる
スケーラブルな分散 CEP 基盤
 Storm 専用のクラスターを
作成可能です。
 2015年2月にGA済み。
 HDInsight のバージョンは
3.1 と 3.2 を選択可能
ですが、3.2をオススメ
(理由は後述)
http://azure.microsoft.com/ja-jp/updates/general-availability-apache-storm-on-hdinsight/
大量の
蓄積
された
今まさに
発生中の
データに
対する
バッチ
リアル
タイム
処理
ログファイル
センサ
データ
モバイル
デバイス HDInsight
Storm
on
HDInsight
Azure
Event Hubs
Power BI
ダッシュボード
Lightning-fast cluster computing
ヘッドノードに
SSH でログイン
Livy による
REST API を
呼び出す
使いやすい
Jupyter Notebook
でお手軽に
項目 2013 年の記録
Hadoop
Spark 100 TB
(2014年)
Spark 1 PB
(2014年)
データ サイズ 102.5TB 100 TB 1 PB (≒1000 TB)
処理時間 72 分 23 分 234 分
ノード数 2100 206 190
コア数 50,400 6,592 6,080
0
20
40
60
80
100
120
1 2
Series1
スケールに制限なし
全てのデータの種類を
そのネイティブ フォーマットで保
存
クラウド上でのWebHDFS
企業利用のためのセキュリティ、
アクセス制御、暗号化など
分析用に最適化
Azure Data Lake
Store
Big Data 分析のための
ハイパースケールな
データリポジトリ
Map reduce
Hbase
トランザクショ
ン
HDFS アプリケーションHive クエリ
Azure HDInsight
Hadoop WebHDFS クライアント
Hadoop WebHDFS クライアント
WebHDFS
エンドポイント
WebHDFS
REST API
WebHDFS
REST API
ADL Store file ADL Store file ADL Store file ADL Store fileADL Store file
Azure Data Lake Store
Local
ADL Store
 Azure Portal
 Azure PowerShell
 Azure CLI
 Data Lake Tools for Visual Studio
 Azure Data Factory
 AdlCopy ツール
Azure Stream Analytics
Azure HDInsight Storm
Azure Data Factory
Apache Sqoop
 Apache DistCp
 Azure Data Factory
 AdlCopy ツール
個々のファイルとディレクトリは、
オーナーとグループに紐づく
ファイル、ディレクトリは、オー
ナー、グループのメンバー、他の
ユーザーに対して、
read(r), write(w), execute(x)の
パーミッションを持つ
きめ細かなACLs(アクセス管理リス
ト)のルールにより、ユーザー名や
グループ名を
指定して管理ができる
Azure Data Lake Store file
…Block 1 Block 2 Block 2
Backend Storage
Data node Data node Data node Data node Data nodeData node
Block Block Block Block Block Block
Azure Data Lake Store Azure BLOB ストレージ
目的
ビッグ データ分析ワークロードに
最適化されたストレージ
さまざまなストレージ シナリオに対応する
汎用オブジェクト ストア
ユース ケース
バッチ、対話型、ストリーミング分析、
および機械学習データ
(ログ ファイル、IoT データ、
クリック ストリーム、大規模なデータセット等)
あらゆる種類のテキスト データまたは
バイナリ データ
(アプリケーション バックエンド、
バックアップ データ、ストリーミング用
メディア ストレージ、汎用データなど)
Structure 階層型ファイル システム フラットな名前空間を使用するオブジェクト ストア
サーバー側 API WebHDFS 互換の REST API Azure BLOB ストレージ REST API
データ操作 - 承認
POSIX アクセス制御リスト (ACL)。
Azure Active Directory ID に基づく ACL :
ファイルおよびフォルダー レベルで設定可能。
アカウントレベルの承認:アカウント アクセス キー
アカウント、コンテナー、BLOB の承認:Shared
Access Signature キー
データ操作 - 認証 Azure Active Directory ID
共有シークレット (アカウント アクセス キーと
Shared Access Signature キー)
サイズ制限
アカウント サイズ、ファイル サイズ、
ファイル数に制限なし
あり
(https://docs.microsoft.com/ja-jp/azure/azure-
subscription-service-limits#storage-limits)
AdlCopy /Source <Blob source> /Dest <ADLS destination>
/SourceKey <Key for Blob account> /Account <ADLA account>
/Units <Number of Analytics units>
hadoop distcp
wasb://<container_name>@<storage_account_name>.blob.core.windows.net/example/data/gutenberg
adl://<data_lake_store_account>.azuredatalakestore.net:443/myfolder
sqoop-import --connect "jdbc:sqlserver://<sql-database-server-name>.database
.windows.net:1433;username=<username>@<sql-database-server-name>;password=
<password>;database=<sql-database-name>“ --table Table1 --target-dir adl://
<data-lake-store-name>.azuredatalakestore.net/Sqoop/SqoopImportTable1
スケールに制限なし
U-SQL, SQLのメリットにC#のパワーを加えた新
しい言語
Data Lake Store に最適化
Azure データサービスへの FEDERATED QUERY
企業利用のためのセキュリティ、
アクセス制御、暗号化など
ジョブ単位での課金とスケール設定
Azure Data Lake
Analytics
全てのどんなサイズのデータ
でも処理できる
Apache YARNベースの
分析サービス
HDInsight
Java, Eclipse, Hive, etc.
フルマネージド の
Hadoop クラスタ
Data Lake Analytics
C#, SQL & PowerShell
フルマネージド の
分散管理処理クラスタ
DryAd ベース
U-SQL
ジョブ
ストレージ
ADL
Analytics
サービス
1
Azure
ポータルへ
ログイン
ADL Analytics ア
カウントを作成2
3
U-SQL
スクリプトを書き、
ADL Analytics ア
カウントへ
サブミット
4
U-SQL ジョブが
データセットを
読み書き
• ADL Store
• Azure Storage Blob
• …
U-SQL
Query
Result
Query
Azure
Storage Blobs
Azure SQL
in VMs
Azure
SQL DB
Azure Data
Lake Analytics
Management
Operations
Java C++.NET Node.js
Data
Operations WebHDFS Client LibWebHDFS
Management
Operations
Java C++.NET Node.js
U-SQL
Extensibility
Management
Data Lake Analytics アカウント
Jobs
U-SQL job
Catalog
カタログ(メタデータ)
Management
Data Lake Store アカウント
File System
Upload, download, list, delete, rename,
append
(WebHDFS)
Analytics Store
Azure Active Directory
#azurejp
#azurejp
string subscriptionId = "83daeeec-f16c-47f8-9dc4-6ff1ebf9feb3";
var adlaClient = new DataLakeAnalyticsAccountManagementClient(tokenCreds);
adlaClient.SubscriptionId = subscriptionId;
#azurejp
多くの SQL & .NET DEVELOPERS
宣言型言語の SQL と
逐次実行型である C# のパワーを融合
構造化、一部構造化、非構造化データの融合
全てのデータに分散クエリの実施
U-SQL
Big Data のための新しい言語
#azurejp
@rows =
EXTRACT
name string,
id int
FROM “/data.csv”
USING Extractors.Csv( );
OUTPUT @rows
TO “/output.csv”
USING Outputters.Csv();
Rowsets
EXTRACT for files
OUTPUT
Schema
Types
Inputs & Outputs
Keywords are UPPERCASE
#azurejp
REFERENCE ASSEMBLY WebLogExtASM;
@rs =
EXTRACT
UserID string,
Start DateTime,
End DateTime,
Region string,
SitesVisited string,
PagesVisited string
FROM "swebhdfs://Logs/WebLogRecords.csv"
USING WebLogExtractor ();
@result = SELECT UserID,
(End.Subtract(Start)).TotalSeconds AS Duration
FROM @rs ORDER BY Duration DESC FETCH 10;
OUTPUT @result TO "swebhdfs://Logs/Results/top10.txt"
USING Outputter.Tsv();
• 型定義は C# の型定義と同じ
• データをファイルから抽出・読
み込み
するときに、スキーマを定義
Data Lake Store のファイ
ル独自形式を解析するカスタム
関数
C# の関数
行セット:
(中間テーブ
ルの概念に近
い)
TSV形式で読み取る関数
DECLARE @endDate DateTime = DateTime.Now;
DECLARE @startDate DateTime = @endDate.AddDays(-7);
@orders =
EXTRACT
OrderId int,
Customer string,
Date DateTime,
Amount float
FROM "/input/orders.txt"
USING Extractors.Tsv();
@orders = SELECT * FROM @orders
WHERE Date >= startDate AND Date <= endDate;
@orders = SELECT * FROM @orders
WHERE Customer.Contains(“Contoso”);
OUTPUT @orders
TO "/output/output.txt"
USING Outputters.Tsv();
U-SQL
Basics
(1) DECLARE C# の式で変数宣言
(2) EXTRACT ファイル読み込み時に
スキーマを決定し、結果を RowSet
に
(3) RowSet 式を使ってデータを再定
義
(4) OUTPUT データをファイルへ出
力
1
2
3
4
CREATE ASSEMBLY OrdersDB.SampleDotNetCode
FROM @"/Assemblies/Helpers.dll";
REFERENCE ASSEMBLY OrdersDB.Helpers;
@rows =
SELECT
OrdersDB.Helpers.Normalize(Customer) AS Customer,
Amount AS Amount
FROM @orders;
@rows =
PROCESS @rows
PRODUCE OrderId string, FraudDetectionScore double
USING new OrdersDB.Detection.FraudAnalyzer();
OUTPUT @rows
TO "/output/output.dat"
USING OrdersDB.CustomOutputter();
U-SQL
.NET Code 利用
(1) CREATE ASSEMBLY アセンブ
リーをU-SQL Catalog へ登録
(2) REFERENCE ASSEMBLY アセン
ブリーへの参照宣言
(3) U-SQL 式の中で、C# メソッドの
呼び出し
(4) PROCESS User Defined Operator
を使って、行ごとの処理を実行
(5) OUTPUT 独自のデータ形式で出
力
1
2
3
4
5
#azurejp
// WASB (requires setting up a WASB DataSource
in ADLS)
@rows =
EXTRACT name string, id int
FROM “wasb://…/data..csv”
USING Extractors.Csv( );
// ADLS (absolute path)
@rows =
EXTRACT name string, id int
FROM “adl://…/data..csv”
USING Extractors.Csv( );
// ADLS (relative to default ADLS for an ADLA
account)
@rows =
EXTRACT name string, id int
FROM “/…/data..csv”
USING Extractors.Csv( );
Default Extractors
Extractors.Csv( )
Extractors.Tsv( )
#azurejp
@rows =
EXTRACT name string, id int
FROM
“/file1.tsv”,
“/file2.tsv”,
“/file3.tsv”
USING Extractors.Csv( );
#azurejp
@rows =
EXTRACT name string, id int
FROM “adl://…/data..csv”
USING Extractors.Csv();
OUTPUT @rows
TO “/data.tsv”
USING Outputters.Csv();
Default Outputters
Outputters.Csv( )
Outputters.Tsv( )
#azurejp
@rows =
EXTRACT
Name string,
Id int,
FROM “/file.tsv”
USING Extractors.Tsv(skipFirstNRows:1);
OUTPUT @data
TO "/output/docsamples/output_header.csv"
USING Outputters.Csv(outputHeader:true);
スキップする行数を指
定
#azurejp
https://msdn.microsoft.com/ja-jp/library/azure/mt621320.aspx
#azurejp
@rows =
EXTRACT <schema>
FROM “adl://…/data..csv”
USING Outputters.Csv();
DECLARE @inputfile string = “adl://…/data..csv”
@rows =
EXTRACT <schema>
FROM @inputfile
USING Outputters.Csv();
#azurejp
DECLARE @a string = "Hello World";
DECLARE @b int = 2;
DECLARE @c dateTime = System.DateTime.Parse("1979/03/31");
DECLARE @d dateTime = DateTime.Now;
DECLARE @e Guid = System.Guid.Parse("BEF7A4E8-F583-4804-9711-7E608215EBA6");
DECLARE @f byte [] = new byte[] { 0, 1, 2, 3, 4};
@変数名 で定義
#azurejp
@departments =
SELECT * FROM
(VALUES
(31, "Sales"),
(33, "Engineering"),
(34, "Clerical"),
(35, "Marketing")
) AS
D( DepID, DepName );
#azurejp
@output =
SELECT
Start,
Region,
Duration + 1.0 AS Duration2
FROM @searchlog;
#azurejp
@output =
SELECT
Start,
Region,
Duration
FROM @searchlog
WHERE Region == "en-gb";
#azurejp
#azurejp
@output =
SELECT
Start,
Region,
Duration
FROM @searchlog;
@output =
SELECT *
FROM @output
WHERE Region == "en-gb";
#azurejp
@output =
SELECT Start, Region, Duration
FROM @searchlog
WHERE (Duration >= 60) OR NOT (Region == "en-gb");
// NOTE: && and || perform short-circuiting
@output =
SELECT Start, Region, Duration
FROM @searchlog
WHERE (Duration >= 60) || !(Region == "en-gb");
#azurejp
@output =
SELECT Start, Region, Duration
FROM @searchlog
WHERE
Start >= DateTime.Parse("2012/02/16")
AND Start <= DateTime.Parse("2012/02/17");
#azurejp
@rs =
SELECT
FirstName,
LastName,
JobTitle
FROM People
WHERE
JobTitle IN ("Engineer", "Designer“, “Writer”);
#azurejp
@output =
SELECT
Region,
COUNT() AS NumSessions,
SUM(Duration) AS TotalDuration,
AVG(Duration) AS AvgDwellTtime,
MAX(Duration) AS MaxDuration,
MIN(Duration) AS MinDuration
FROM @searchlog
GROUP BY Region;
#azurejp
// NO GROUP BY
@output =
SELECT
SUM(Duration) AS TotalDuration
FROM @searchlog;
// WITH GROUP BY
@output =
SELECT
Region,
SUM(Duration) AS TotalDuration
FROM searchlog
GROUP BY Region;
#azurejp
// find all the Regions where the total dwell time is > 200
@output =
SELECT
Region,
SUM(Duration) AS TotalDuration
FROM @searchlog
GROUP BY Region
HAVING TotalDuration > 200;
#azurejp
// Option 1
@output =
SELECT
Region,
SUM(Duration) AS TotalDuration
FROM @searchlog
GROUP BY Region;
@output2 =
SELECT *
FROM @output
WHERE TotalDuration > 200;
// Option 2
@output =
SELECT
Region,
SUM(Duration) AS TotalDuration
FROM @searchlog
GROUP BY Region
HAVING SUM(Duration) > 200;
#azurejp
// List the sessions in increasing order of Duration
@output =
SELECT *
FROM @searchlog
ORDER BY Duration ASC
FETCH FIRST 3 ROWS;
// This does not work (ORDER BY requires FETCH)
@output =
SELECT *
FROM @searchlog
ORDER BY Duration ASC;
#azurejp
OUTPUT @output
TO @"/Samples/Output/SearchLog_output.tsv"
ORDER BY Duration ASC
USING Outputters.Tsv();
#azurejp
 LEFT OUTER JOIN
 LEFT INNER JOIN
 RIGHT INNER JOIN
 RIGHT OUTER JOIN
 FULL OUTER JOIN
 CROSS JOIN
 LEFT SEMI JOIN
 RIGHT SEMI JOIN
 EXCEPT ALL
 EXCEPT DISTINCT
 INTERSECT ALL
 INTERSECT DISTINCT
 UNION ALL
 UNION DISTINCT
#azurejp
@rs1 =
SELECT
ROW_NUMBER() OVER ( ) AS RowNumber,
Start,
Region
FROM @searchlog
ORDER BY Start;
以下の一連のクエリは、中間の行セットの @irs を必要とする
User Id Region Duration
A$A892 en-us 10500
HG54#A en-us 22270
YSD78@ en-us 38790
JADI899 en-gb 18780
YCPB(%U en-gb 17000
BHPY687 en-gb 16700
BGFSWQ en-bs 57750
BSD805 en-fr 15675
BSDYTH7 en-fr 10250
@rs =
EXTRACT
UserID string,
Start DateTime,
End DateTime,
Region string,
SitesVisited string,
PagesVisited string
FROM "swebhdfs://Logs/WebLogRecords.txt"
USING WebLogExtractor();
@irs = SELECT UserID, Region,
(End.Subtract(Start)).TotalSeconds AS Duration
FROM @rs;
WebLogRecords.txt
Azure Data Lake
#azurejp
[SUM = 207715]
UserId Region Duration
A$A892 en-us 10500
HG54#A en-us 22270
YSD78@ en-us 38790
JADI899 en-gb 18780
YCPB(%U en-gb 17000
BHPY687 en-gb 16700
BGFSWQ en-bs 57750
BSD805 en-fr 15675
BSDYTH7 en-fr 10250
UserId TotalDuration
A$A892 207715
HG54#A 207715
YSD78@ 207715
JADI899 207715
YCPB(%U 207715
BHPY687 207715
BGFSWQ 207715
BSD805 207715
BSDYTH7 207715
全行のウィンドウを通じて
期間をサマリーする
@result =
SELECT UserID,
SUM(Duration) OVER() AS TotalDuration
FROM @irs;
@irs @result
ユーザーIDと、ウェブサイトにおける全ユーザーの滞在時間の総計をリストする
#azurejp
UserId Region Duration
A$A892 en-us 10500
HG54#A en-us 22270
YSD78@ en-us 38790
JADI899 en-gb 18780
YCPB(%U en-gb 17000
BHPY687 en-gb 16700
BGFSWQ en-bs 57750
BSD805 en-fr 15675
BSDYTH7 en-fr 10250
UserId Region RegionTotal
A$A892 en-us 71560
HG54#A en-us 71569
YSD78@ en-us 71560
JADI899 en-gb 52480
YCPB(%U en-gb 52480
BHPY687 en-gb 52480
BGFSWQ en-bs 57750
BSD805 en-fr 25925
BSDYTH7 en-fr 25925
@irs @total2
@total2 =
SELECT UserId, Region,
SUM(Duration)
OVER( PARTITION BY Region )
AS RegionTotal FROM @irs;
リージョンのウィンドウを通じて
期間をサマリーする
ユーザーIDと、リージョンとリージョンごとのウェブサイトにおける滞在時間の総計
をリストする
#azurejp
UserId Region Duration
A$A892 en-us 10500
HG54#A en-us 22270
YSD78@ en-us 38790
JADI899 en-gb 18780
YCPB(%U en-gb 17000
BHPY687 en-gb 16700
BGFSWQ en-bs 57750
BSD805 en-fr 15675
BSDYTH7 en-fr 10250
UserId Region CountByRegion
A$A892 en-us 3
HG54#A en-us 3
YSD78@ en-us 3
JADI899 en-gb 3
YCPB(%U en-gb 3
BHPY687 en-gb 3
BGFSWQ en-bs 1
BSD805 en-fr 2
BSDYTH7 en-fr 2
@irs @result
リージョンごとのユーザー数をカウントする
@result =
SELECT UserId, Region,
COUNT(*)
OVER( PARTITION BY Region) AS
CountByRegion
FROM @irs;
リージョンごとのユーザー数のリストする
#azurejp
UserId Region Duration
A$A892 en-us 10500
HG54#A en-us 22270
YSD78@ en-us 38790
JADI899 en-gb 18780
YCPB(%U en-gb 17000
BHPY687 en-gb 16700
BGFSWQ en-bs 57750
BSD805 en-fr 15675
BSDYTH7 en-fr 10250
UserId Region Rank
YSD78@ en-us 1
HG54#A en-us 2
JADI899 en-gb 1
YCPB(%U en-gb 2
BGFSWQ en-bs 1
BSD805 en-fr 1
BSDYTH7 en-fr 2
@irs @result
@result =
SELECT UserId, Region,
ROW_NUMBER()
OVER(PARTITION BY Vertical
ORDER BY Duration) AS Rank
FROM @irs
GROUP BY Region
HAVING RowNumber <= 2;
各リージョンで最も滞在時間の長いユーザー2人を見つける
#azurejp
@a = SELECT Region, Urls FROM @searchlog;
@b = SELECT
Region,
SqlArray.Create(Urls.Split(';')) AS UrlTokens
FROM @a;
@c = SELECT
Region,
Token AS Url
FROM @b
CROSS APPLY EXPLODE (UrlTokens) AS r(Token);
@a
@b
@c
CROSS APPLY EXPLODE
ARRAY TYPE
#azurejp
@d = SELECT Region,
ARRAY_AGG<string>(Url).ToArray() AS UrlArray
FROM @c
GROUP BY Region;
@e = SELECT Region,
string.Join(";", UrlArray) AS Urls
FROM @c;
@c
@e
@d
log_2015_10_01.txt
log_2015_10_02.txt
log_2015_10_03.txt
log_2015_10_04.txt
log_2015_10_05.txt
log_2015_10_06.txt
log_2015_10_07.txt
log_2015_10_08.txt
log_2015_10_09.txt
log_2015_10_10.txt
log_2015_10_11.txt
#azurejp
suffix
{suffix}
ファイル名が値として登録
される
#azurejp
date
{date:yyyy} {date:MM} {date:dd}
書式パターンからデータを読み込
む
4文字
Year
2文字
month
2文字
day
#azurejp
date
suffix
{date:yyyy} {date:MM} {date:dd} {suffix}
C#式でファイルセット
の
フィルター実施
それぞれの Catalog は
N個の Database を持つ
Tables
Table-Valued
Functions
Assemblies
#azurejp
CREATE TABLE Customers(
id int,
key int,
Customer string,
Date DateTime,
Amount float,
INDEX index1
CLUSTERED (id)
PARTITIONED BY (date)
DISTRIBUTED BY HASH (key) INTO 4
); /catalog/…/tables/Guid(T)/
Guid(T.p1).ss Guid(T.p2).ss Guid(T.p3).ss
論理構造
物理構造
@date1 @date2 @date3
ID1
H1
ID1
H1
ID1
H1
ID2 ID2
ID3ID3 ID4
H2
ID4
H2
ID5
ID5 ID6 H3
ID6
H2ID6
H3
ID7
H4
ID7
ID8 ID7
ID9 ID8
Clustering -> データの近さ
Partition -> ライフサイクル管理
Distribution -> データの近さ + 分
散性
U-SQL Table が
構造化されたデータとして
管理
Files under “/catalog/database”
Catalog フォルダーを
直接読み書きしない
#azurejp
CREATE FUNCTION MyDB.dbo.
RETURNS @rows TABLE
(
Name string,
Id int
)
AS
BEGIN
@rows =
EXTRACT
Name string,
Id int,
FROM “/file.tsv”
USING Extractors.Tsv();
RETURN;
END;
結果を返す RowSet
Schema
定義された RowSet
A Single concept that replaces Scope
views & functions
-Discoverable
-Schematized
#azurejp
CREATE FUNCTION MyDB.dbo.
RETURNS @rows AS
BEGIN
@rows =
EXTRACT
Name string,
Id int,
FROM “/file.tsv”
USING Extractors.Tsv();
RETURN;
END;
RowSet からスキーマ定
義
#azurejp
// A Table
@rs = SELECT * FROM MyDB.dbo.Customers;
// A Table valued Function
@rs = SELECT * FROM MyDB.dbo.GetData();
#azurejp
@output =
SELECT
Region.ToUpper() AS NewRegion
FROM @searchlog;
@output=
SELECT
Start,
Region,
Start.DayOfYear AS StartDayOfYear
FROM @searchlog;
#azurejp
@output=
SELECT
Start,
Region,
((double) Duration) AS DurationDouble
FROM @searchlog;
#azurejp
// User-defined code is not supported
DECLARE myName string = MyHelper.GetMyName();
#azurejp
#azurejp
REFERENCE ASSEMBLY MyCode;
@rows =
SELECT
OrdersDB.Helpers.Normalize(Customer) AS CustN,
Amount AS Amount
FROM @orders;
CREATE ASSEMBLY MyCode
FROM @"/DLLs/Helpers.dll";
CREATE ASSEMBLY で
参照設定
アセンブリーをCateLogに事
前アップロード。その後
CREATE ASSEMBLY
読み込み
Query
Azure
Storage Blobs
Azure SQL
in VMs
Azure
SQL DB
Azure Data
Lake Analytics
U-SQL Query
Azure
SQL Data Warehouse
Azure
Data Lake Storage
ADLA Account
youradlaaccount
SQL Server
yoursqlserver
SQL DB/DW
AdventureW
orksLT
U-SQL DB
AdventureWorksLT_External
DB
Credential
AdventureWorksLT_Creds
External DataSource
AdventureWorksLT_Creds
Table
Customers
External Table
CustomersExternal External Tableに
スキーマ定義済
みのクエリ実行
スキーマ指定
せずにクエリ
実行
# If you have the username & password as strings
$username = "username"
$passwd = ConvertTo-SecureString "password" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential($username, $passwd)
# Prompt user for credentials
$creds = Get-Credential
OR
New-AdlCatalogCredential
-Account "youradlaaccount" `
-DatabaseName "AdventureWorksLT_ExternalDB" `
-DatabaseHost “yoursqlserver.database.windows.net" `
-Port 1433 `
-CredentialName "AdventureWorksLT_Creds" `
-Credential $creds
USE DATABASE [AdventureWorksLT_ExternalDB];
CREATE DATA SOURCE IF NOT EXISTS AdventureWorksLT_DS
FROM AZURESQLDB WITH
( PROVIDER_STRING =
"Database=AdventureWorksLT;Trusted_Connection=False;Encrypt=True",
CREDENTIAL = AdventureWorksLT_Creds,
REMOTABLE_TYPES = (bool, byte, sbyte, short, ushort, int, uint, long, ulong,
decimal, float, double, string, DateTime)
);
Remotable types
USE DATABASE [AdventureWorksLT_ExternalDB];
@customers =
SELECT *
FROM EXTERNAL AdventureWorksLT_DS LOCATION "[SalesLT].[Customer]";
OUTPUT @customers
TO @"/SalesLT_Customer.csv"
USING Outputters.Csv();
USE DATABASE [AdventureWorksLT_ExternalDB];
CREATE EXTERNAL TABLE IF NOT EXISTS
dbo.CustomersExternal
(
CustomerID int?,
NameStyle bool,
Title string,
FirstName string,
MiddleName string,
LastName string,
Suffix string,
CompanyName string,
SalesPerson string,
EmailAddress string,
Phone string,
PasswordHash string,
PasswordSalt string,
Rowguid Guid,
ModifiedDate DateTime?
)
FROM AdventureWorksLT_DS LOCATION
"[SalesLT].[Customer]";
USE DATABASE
[AdventureWorksLT_ExternalDB];
@customers =
SELECT *
FROM dbo.CustomersExternal;
OUTPUT @customers
TO @"/SalesLT_Customer.csv"
USING Outputters.Csv();
External Table からの読み取り
#azurejp
CREATE CREDENTIAL IF NOT EXISTS dahatakeAdmin
WITH USER_NAME ="dahatake", IDENTITY = "dahatakeSec";
CREATE DATA SOURCE IF NOT EXISTS pubsSource
FROM AZURESQLDB
WITH
(
PROVIDER_STRING = "Initial Catalog=pubs;Encrypt=True",
CREDENTIAL = dahatakeAdmin
);
@result = SELECT * FROM EXTERNAL pubsSource
EXECUTE @"SELECT * FROM dbo.employee";
OUTPUT @result TO "/output/employee.csv"
USING Outputters.Csv();
Install-Module AzureRM
Install-AzureRM
Login-AzureRmAccount
Get-AzureRmSubscription
Set-AzureRmContext -SubscriptionId
“<subscription ID>"
$passwd = ConvertTo-SecureString “<password>"
-AsPlainText -Force
$mysecret = New-Object
System.Management.Automation.PSCredential("dah
atakeSec", $passwd)
New-AzureRmDataLakeAnalyticsCatalogSecret -
DatabaseName "master" -AccountName
"dahatakeadla" -Secret $mysecret
-Host "dahatakesql.database.windows.net" -Port
1433
資格情報オブジェクト: https://msdn.microsoft.com/ja-jp/library/azure/mt621327.aspx
ビルトインの
演算子、関数、
集合関数
C# 式 (SELECT 文の中)
ユーザー定義の集合関数 (UDAGG)
ユーザー定義の関数 (UDF)
ユーザー定義の演算子 (UDO)
• ユーザー定義の Extractor
• ユーザー定義の Outputter
• ユーザー定義の Processor
• 1行読み込み、1行作成
• パススルー vs. 変換
• ユーザー定義の Applier
• 1行読み込み、0行以上を生成
• OUTER/CROSS APPLY とともに使用
• ユーザー定義の Combiner
• 行セットの結合 (ユーザー定義のジョインのように)
• ユーザー定義の Reducer
• n 行読み込み、 m 行生成 (通常は m<n)
• UDO インスタンスを使う明示的な U-SQL シンタクス
でスケールアウト (実行の一部として作成):
• EXTRACT
• OUTPUT
• PROCESS
• COMBINE
• REDUCE
Input Data
(K, A, B, C, D)
REDUCE ON K
Partition
K0
Partition
K1
Partition
K2
REDUCER
Python/R
REDUCER
Python/R
REDUCER
Python/R
Output for
K0
Output for
K0
Output for
K0
Extensions の追加
REFERENCE ASSEMBLY [ExtPython]
REFERENCE ASSEMBLY [ExtR]
特別な Reducers によって Python or R code
を分散実行
• Extension.Python.Reducer
• Extension.R.Reducer
Standard DataFrame を Reducerの入出力とし
て使える
NOTE: Reducer は、Aggregate を含んでいな
い
REFERENCE ASSEMBLY [ExtPython];
DECLARE @myScript = @"
def get_mentions(tweet):
return ';'.join( ( w[1:] for w in tweet.split() if w[0]=='@' ) )
def usqlml_main(df):
del df['time']
del df['author']
df['mentions'] = df.tweet.apply(get_mentions)
del df['tweet']
return df
";
@t =
SELECT * FROM
(VALUES
("D1","T1","A1","@foo Hello World @bar"),
("D2","T2","A2","@baz Hello World @beer")
) AS
D( date, time, author, tweet );
@m =
REDUCE @t ON date
PRODUCE date string, mentions string
USING new Extension.Python.Reducer(pyScript:@myScript);
Python Extensions
U-SQLを並列分散処理に使用する
Python code を多くのノード上で実
行
NumPy、Pandasのような、Python
の標準ライブラリが利用できる
顔の解析
画像へのタグ付け
感情分析
OCR
テキストからの重要語句の抽出
テキストの感情分析
Azure Data Lake における Cognitive 機
能
REFERENCE ASSEMBLY ImageCommon;
REFERENCE ASSEMBLY FaceSdk;
REFERENCE ASSEMBLY ImageEmotion;
REFERENCE ASSEMBLY ImageTagging;
REFERENCE ASSEMBLY ImageOcr;
@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
@objects =
PROCESS @imgs
PRODUCE FileName,
NumObjects int,
Tags string
READONLY FileName
USING new Cognition.Vision.ImageTagger();
OUTPUT @objects
TO "/objects.tsv"
USING Outputters.Tsv();
Imaging
REFERENCE ASSEMBLY [TextCommon];
REFERENCE ASSEMBLY [TextSentiment];
REFERENCE ASSEMBLY [TextKeyPhrase];
@WarAndPeace =
EXTRACT No int,
Year string,
Book string, Chapter string,
Text string
FROM @"/usqlext/samples/cognition/war_and_peace.csv"
USING Extractors.Csv();
@sentiment =
PROCESS @WarAndPeace
PRODUCE No,
Year,
Book, Chapter,
Text,
Sentiment string,
Conf double
USING new Cognition.Text.SentimentAnalyzer(true);
OUTPUT @sentinment
TO "/sentiment.tsv"
USING Outputters.Tsv();
Text Analysis
• オブジェクト認識 (タグ)
• 顔認識、感情認識
• JOIN処理 – 幸せな人は誰なのか?
REFERENCE ASSEMBLY ImageCommon;
REFERENCE ASSEMBLY FaceSdk;
REFERENCE ASSEMBLY ImageEmotion;
REFERENCE ASSEMBLY ImageTagging;
@objects =
PROCESS MegaFaceView
PRODUCE FileName, NumObjects int, Tags string
READONLY FileName
USING new Cognition.Vision.ImageTagger();
@tags =
SELECT FileName, T.Tag
FROM @objects
CROSS APPLY
EXPLODE(SqlArray.Create(Tags.Split(';')))
AS T(Tag)
WHERE T.Tag.ToString().Contains("dog") OR
T.Tag.ToString().Contains("cat");
@emotion_raw =
PROCESS MegaFaceView
PRODUCE FileName string, NumFaces int, Emotion string
READONLY FileName
USING new Cognition.Vision.EmotionAnalyzer();
@emotion =
SELECT FileName, T.Emotion
FROM @emotion_raw
CROSS APPLY
EXPLODE(SqlArray.Create(Emotion.Split(';')))
AS T(Emotion);
@correlation =
SELECT T.FileName, Emotion, Tag
FROM @emotion AS E
INNER JOIN
@tags AS T
ON E.FileName == T.FileName;
Images
Objects Emotions
filter
join
aggregate
2015/08/23
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
#azurejp
https://docs.microsoft.com/ja-
jp/azure/data-lake-
analytics/data-lake-analytics-u-
sql-programmability-guide
Batch
Streaming
Machine Learning
処理読み込み 保存
INSERT
OUTPUT
OUTPUT
SELECT…
FROM…
WHERE…
EXTRACT
EXTRACT
SELECT
SELECT
Azure
Data
Lake
Azure
Data
Lake
Azure
SQL
DB
Azure
Storage
Blobs
Azure
Storage
Blobs
RowSet RowSet
Job Front End
Job Scheduler Compiler Service
Job Queue
Job Manager
U-SQL Catalog
YARN
Job 投入
Job 実行
U-SQL Runtime vertex 実行
U-SQL C# user code
C++ system code
Algebra
other files
(system files, deployed resources)
managed dll
Unmanaged dll
Input
script
Compilation output (in job folder)
Files
Meta
Data
Service
Deployed to vertices
Compiler & Optimizer
ジョブはVertexに分割
Vertex が実行単位
Input
Output
Output
6 ステージ
8 Vertex
Vertexはステージに展開
– 同じステージのVertexは、
同じ処理をする
– 前段階のステージのVertexに
依存する
– 1つのVertexのジョブ実行は5時間まで
acyclic graph (循環のないグラフ)
Preparing
Queued
Running
Finalizing
Ended
(Succeeded, Failed,
Cancelled)
New
Compiling
Queued
Scheduling
Starting
Running
Ended
画面上
状態
ADLAU の
空を確認
進捗
統計情報
各四角形 = “Vertex”
全体の一部を表す
各SuperVertex (別名 “Stage”)
におけるVertexは同じデー
タの異なる部分に対し同様
の操作を行う
ジョブグラフとして
可視化
並列度の要求= 1
(1度に1つの vertex を動かす)
並列度の要求 = 4
(1度に4つの vertex を動かす)
次のステー
ジは、前の
ステージが
完了する前
に開始可能 ステージ中にすべ
ての予約された処
理を並列して行う
のは不可
252 個の処理
Vertex の平
均実行時間
43 億行
データの読み込みと
書き込み
失敗した vertex … しか
し自動的にリトライ
ステージ全体が成功
で完了
下の vertex が上の vertex
の出力に依存
クリティカルパス:
ジョブを最後まで実行し
続けるVertexの依存関係
チェーン。
Vertex の実行ビュー
どの Vertex を表示す
るか
全ての Vertex
クリティカルパス
Data Lake Tools for VS Azure Portal PowerShell
Clicking on that
button will copy the
Job Link to the
Clipboard
Clicking on that
button will copy the
Job Link to the
Clipboard
Here’s the ###
the problem is near the
###
USER CODE (99.9%)
• There’s something about what the
developer did that is causing the
problem
• The issue may be related to the …
• Input data
• Existence
• Size
• Format
• Key Distribution (“Data Skew”)
• C# code
• C# expressions in a U-SQL Script
• C# UDFs
• Code in Libraries the script uses
Developer Box
VS Project
ADLA Account
Failed Job
Visual Studio Failed
vertex
Visual Studio
Failed
vertex
C# Project
(Local Vertex Debug
Project)
Job Resources
U-SQL Runtime
Data Read by
Vertex
Case #1 Local Vertex Debug works
GREAT and SEAMLESSLY
Case #2 and Case #3 – Use the same
techniques in these cases as for
debugging a C# program
We are going to make Case #2 easier
in the future.
You can Launch the Exception Settings window via
• Keyboard Shortcut: Ctrl + Alt + E
• Debug > Windows > Exception Settings
• Search for “Exception Settings” in the VS Search
box. Select the item under “Menus”
If failed to read an input.
• Do the inputs exist?
• Do you have permissions to read the
inputs?
• Verify that the you can access the inputs
from the portal.
Did the U-SQL code ever work?
If YES:
• Provide a previous job link.
• Examine the job diff
If possible and depending on the issue,
construct the smallest possible repro
(script and dataset) that lets others
examine the problem.
Did a Vertex Fail because of User Code?
Debug the vertex locally.
GO THROUGH THE CHECKLIST FIRST
Provide the ..
• Job Link (job url)
• Job Link to a previous run where the script
worked
• ADLA Account Name
• Azure Region of the ADL Account
• Top Level Error + inner errors
• Error Codes
• Error text
IF POSSIBLE
Depending on the issue, construct the
smallest possible repro (script and
dataset) that lets others examine the
problem.
IF WILLING
• Attach the job graph as an image
• Attach the script.
Allocating 10 AUs
for a 10 minute job.
Cost
= 10 min * 10 AUs
= 100 AU minutes
Time
Blue line: Allocated
Consider using fewer AUs
You are paying for the area under the
blue line
You are only using the area under the
red line
Time
Blue line: Allocated
Red line: Running
Over Allocated != Bad
Time
Consider using more Aus
“Under allocated” jobs are Efficient!
Blue line: Allocated
Red line: Running
Under Allocated != Bad
Allocation Efficiency =
(Compute hours) / (AUs * duration)
Example Job
= 192.3 hours / (200 AUs * 1.1 hours)
= 192.3 hours / 220 AUHours
= 0.874
= 87.4% Efficiency very very good!
Efficient != What you always want
/catalog/…/tables/Guid(T)/
Guid(T.p1).ss Guid(T.p2).ss Guid(T.p3).ss
TABLE T (
…
INDEX i
CLUSTERED BY (id)
DISTRIBUTED BY HASH (key) INTO 4
PARTITIONED BY (date)
)
LOGICAL
PHYSICAL
@date1 @date2 @date3
ID1
H1
ID1
H1
ID1
H1
ID2 ID2
ID3ID3 ID4
H2
ID4
H2
ID5
ID5 ID6 H3
ID6
H2ID6
H3
ID7
H4
ID7
ID8 ID7
ID9 ID8
Clustering ->Data Locality
Partition -> Data lifecycle
management. Partition elimination
Distribution -> Data Locality +
distribution elimination
FB
WH
CNN
Partition2
FB
WH
CNN
Partition3
FB
WH
CNN
Partition1
File:
Keys (Domain) are scattered across
the partitions
Read Read
Write Write Write
Read
Filter Filter Filter
PARTITION 1 PARTITION 2 PARTITION 3
Because “CNN” could be anywhere,
all extents must be read.
@output = SELECT *
FROM @clickstream
WHERE domain == “CNN”;
WH
WH
WH
Partition2
CNN
CNN
CNN
Partition3
FB
FB
FB
Partition1
U-SQL Table partitioned on Domain
Rows with the same keys are on the
same partition.
Read
Write
Filter
PARTITION 1 PARTITION 2 PARTITION 3
Thanks to “Partition
Elimination” and the U-SQL
Table, the job only reads from
the extent that is known to
have the relevant key
@output = SELECT *
FROM @clickstream
WHERE domain == “CNN”;
@output =
SELECT domain, SUM(clicks) AS total
FROM @clickstream
GROUP BY domain;
Read Read
Partition Partition
Full Agg
Write
Full Agg
Write
Full Agg
Write
Read
Partition
Partial Agg Partial Agg Partial Agg
PARTITION 1 PARTITION 2 PARTITION 3
Read Read
Full Agg Full Agg
Write Write
Read
Full Agg
Write
PARTITION 1 PARTITION 2 PARTITION 3
SessionID Domain Clicks
3 cnn.com 9
1 whitehouse.gov 14
2 facebook.com 8
3 reddit.com 78
2 microsoft.com 1
1 facebook.com 5
3 microsoft.com 11
FB
WH
CNN
Extent 2
FB
WH
CNN
Extent 3
FB
WH
CNN
Extent 1
File:
Keys (Domain) are scattered across
the extents
WH
WH
WH
Extent 2
CNN
CNN
CNN
Extent 3
FB
FB
FB
Extent 1
U-SQL Table partitioned on Domain
The keys are now physically in the
same place on disk (extent)
CREATE TABLE SampleDBTutorials.dbo.ClickData
(
SessionId int,
Domain string,
Clinks int,
INDEX idx1 //Name of index
CLUSTERED (Domain)
PARTITIONED BY HASH (Domain)
);
INSERT INTO SampleDBTutorials.dbo.ClickData
SELECT *
FROM @clickdata;
// Using a File
@ClickData =
SELECT
Session int,
Domain string,
Clicks int
FROM “/clickdata.tsv”
USING Extractors.Tsv();
@rows = SELECT *
FROM @ClickData
WHERE Domain == “cnn.com”;
OUTPUT @rows
TO “/output.tsv”
USING Outputters.tsv();
// Using a U-SQL Table partitioned by Domain
@ClickData =
SELECT *
FROM MyDB.dbo.ClickData;
@rows = SELECT *
FROM @ClickData
WHERE Domain == “cnn.com”;
OUTPUT @rows
TO “/output.tsv”
USING Outputters.tsv();
Read Read
Write Write Write
Read
Filter Filter Filter
CNN,
FB,
WH
EXTENT 1 EXTENT 2 EXTENT 3
CNN,
FB,
WH
CNN,
FB,
WH
Because “CNN” could be anywhere,
all extents must be read.
Read
Write
Filter
FB
PARTITION 1 PARTITION 2 PARTITION 3
WH CNN
Thanks to “Partition Elimination” and
the U-SQL Table, the job only reads
from the extent that is known to
have the relevant key
File U-SQL Table Partitioned by Domain
@rows = SELECT
Domain,
SUM(Clicks) AS TotalClicks
FROM @ClickData
GROUP BY Domain;
Read Read
Partition Partition
Full Agg
Write
Full Agg
Write
Full Agg
Write
Read
Partition
Partial Agg Partial Agg Partial Agg
CNN,
FB,
WH
EXTENT 1 EXTENT 2 EXTENT 3
CNN,
FB,
WH
CNN,
FB,
WH
U-SQL Table Partitioned by Domain
Read Read
Full Agg Full Agg
Write Write
Read
Full Agg
Write
FB
PARTITION 1
WH
PARTITION 2
CNN
PARTITION 3
Expensive!
/catalog/…/tables/Guid(T)/
Guid(T.p1).ss Guid(T.p2).ss Guid(T.p3).ss
TABLE T (
…
INDEX i
CLUSTERED (id)
PARTITIONED BY (date)
DISTRIBUTED BY HASH (key) INTO 4
)
LOGICAL
PHYSICAL
@date1 @date2 @date3
ID1
H1
ID1
H1
ID1
H1
ID2 ID2
ID3ID3 ID4
H2
ID4
H2
ID5
ID5 ID6 H3
ID6
H2ID6
H3
ID7
H4
ID7
ID8 ID7
ID9 ID8
<><><><>
<><><><>
<><><><>
<><><><>
<><><><>
<><><><>
Extent 1
Region = “en-us”
<><><><>
<><><><>
<><><><>
<><><><>
<><><><>
<><><><>
Extent 2
Region = “en-gb”
<><><><>
<><><><>
<><><><>
<><><><>
<><><><>
<><><><>
Extent 3
Region = “en-fr”CREATE TABLE
LogRecordsTable
(UserId int,
Start DateTime,
Region string,
INDEX idx CLUSTERED
(Region ASC)
PARTITIONED BY HASH
(Region));
インサート時に、
“Region” カラムに基
づき、3つの範囲に
渡って
ハッシュ分散される
INSERT INTO LogRecordsTable
SELECT UserId, Start, End, Region FROM @rs
パーティションが
分かれている
@rs = SELECT * FROM LogRecordsTable
WHERE Region == “en-gb”
1
2
3
Full agg
Region ごとにクラスタ化されたテーブル
Read Read Read Read
Full agg Full agg Partial agg Partial agg
Extent 1 Extent 2 Extent 3 Extent 4
Sort Sort
Top 100 Top 100 Sort
Top 100
Top 100
Read Read Read Read
非構造化データ
Partial agg Partial agg Partial agg Partial agg
Full agg Full agg Full agg
Sort Sort Sort
Top 100 Top 100 Top 100
Extent 1 Extent 2 Extent 3 Extent 4
Partition Partition Partition Partition
@rs1 =
SELECT Region,
COUNT() AS Total
FROM @rs
GROUP BY Region;
@rs2 =
SELECT TOP 100
Region, Total
FROM @rs1
ORDER BY Total;
高コストな処理
0
5,000,000
10,000,000
15,000,000
20,000,000
25,000,000
30,000,000
35,000,000
40,000,000
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
33
35
37
39
41
43
45
47
49
51
州ごとの人口
0
5,000,000
10,000,000
15,000,000
20,000,000
25,000,000
30,000,000
35,000,000
40,000,000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
Population by State
U-SQL Table partitioned on Domain
Relatively even distribution
Partition 2 Partition 3
WH
CNNFB
Partition 1
U-SQL Table partitioned on Domain
Skewed Distribution
Partition 2 Partition 1
WH CNNFB
Partition 1
@rows =
SELECT
Gender,
AGG<MyAgg>(Income) AS Result
FROM
@HugeInput
GROUP BY Gender;
大量の
入力
Vertex 0 Vertex 1
性別=男 性別=女
Launch as
Administrator!
1 2 3 4 5 6 7 8 36
全ての行は一つのVertexへ
1 2 3
6
4 5 6 7 8
36
15 15
データは複数のVertexに送ることができる
// THIS CODE IS SCOPE -> NEEDS TO BE UPDATED TO U-SQL
public class SampleNonRecursiveReducer: Reducer
{
public override bool IsRecursive { get { return true; } }
public override Schema Produces(string[] columns, string[] args, Schema input)
{
…
}
public override IEnumerable<Row> Reduce(RowSet input, Row output, string[] args)
{
…
}
}
#ENDCS
Distributed data reduction
SELECT Gender, SUM(…) AS Result
FROM HugeInput
GROUP BY Gender;
This job will succeeded even if the input is huge.
• But not all Reducers Can be recursive
− Median
− Percentile
ジョブの進捗の
表示や再実行
クエリ
パフォーマンスの
チューニング
U-SQL クエリの
実行プランの表示
メタデータ
カタログの
参照
U-SQL スクリプト
(C# コード)の
作成
メタデータ
オブジェクトの
作成
U-SQL ジョブの
サブミットと
キャンセル
U-SQL と
C# コードの
デバッグ
U-SQL に拡張されたC#のコードは、U-SQL Studioで直接コーディン
グ・実行が可能
カスタム
プロセッサー
 行セットの観点でも
可視化され、変更が
適用
• ADL Analytics はメタデータ・オブジェクトを作成し、メタデータ サービスに
よって維持されるカタログに保存
• DDL ステートメントによって作成されるテーブルや TVF (CREATE TABLE …)
• メタデータ オブジェクトは Server Explorer で直接作成可能
Azure Data Lake Analytics アカウント
• データベース
– テーブル
– Table valued functions
– ジョブ
– スキーマ
• Linked storage
ADLA Account/Catalog
Database
Schema
[1,n]
[1,n]
[0,n]
tables views TVFs
Clustered
Index
partitions
C# Assemblies
C# Extractors
Data
Source
C# Reducers
C# Processors
C# Combiners
C# Outputters
Ext. tables Procedures
Credentials
C# Applier
Table Types
Statistics
C# Fns C# UDAggC# UDTs
Visual Studio の Server
Explorer でメタデータ
カタログが閲覧可能
Server Explorer で可能:
1. テーブル、スキーマ、データ
ベースの作成
2. アセンブリの登録
© 2016 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a
commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

More Related Content

What's hot

【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
Hibino Hisashi
 
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Teruchika Yamada
 

What's hot (20)

Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
20210526 AWS Expert Online マルチアカウント管理の基本
20210526 AWS Expert Online マルチアカウント管理の基本20210526 AWS Expert Online マルチアカウント管理の基本
20210526 AWS Expert Online マルチアカウント管理の基本
 
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
 
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと
 
Azure Log Analytics 概要
Azure Log Analytics 概要Azure Log Analytics 概要
Azure Log Analytics 概要
 
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
 
Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法
 
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
データ基盤の従来~最新の考え方とSynapse Analyticsでの実現
データ基盤の従来~最新の考え方とSynapse Analyticsでの実現データ基盤の従来~最新の考え方とSynapse Analyticsでの実現
データ基盤の従来~最新の考え方とSynapse Analyticsでの実現
 
データ収集の基本と「JapanTaxi」アプリにおける実践例
データ収集の基本と「JapanTaxi」アプリにおける実践例データ収集の基本と「JapanTaxi」アプリにおける実践例
データ収集の基本と「JapanTaxi」アプリにおける実践例
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
BigQuery Query Optimization クエリ高速化編
BigQuery Query Optimization クエリ高速化編BigQuery Query Optimization クエリ高速化編
BigQuery Query Optimization クエリ高速化編
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
 
AWS IoT SiteWise のご紹介 (AWS IoT Deep Dive #5)
AWS IoT SiteWise のご紹介 (AWS IoT Deep Dive #5)AWS IoT SiteWise のご紹介 (AWS IoT Deep Dive #5)
AWS IoT SiteWise のご紹介 (AWS IoT Deep Dive #5)
 
Amazon S3を中心とするデータ分析のベストプラクティス
Amazon S3を中心とするデータ分析のベストプラクティスAmazon S3を中心とするデータ分析のベストプラクティス
Amazon S3を中心とするデータ分析のベストプラクティス
 
20210216 AWS Black Belt Online Seminar AWS Database Migration Service
20210216 AWS Black Belt Online Seminar AWS Database Migration Service20210216 AWS Black Belt Online Seminar AWS Database Migration Service
20210216 AWS Black Belt Online Seminar AWS Database Migration Service
 
20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation 20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation
 

Similar to Azure Datalake 大全

[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
de:code 2017
 
やりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまで
やりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまでやりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまで
やりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまで
Daisuke Masubuchi
 
M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...
M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...
M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...
日本マイクロソフト株式会社
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 

Similar to Azure Datalake 大全 (20)

Azure DataLake 大全
Azure DataLake 大全Azure DataLake 大全
Azure DataLake 大全
 
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
 
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
 
Azure Data Platform
Azure Data PlatformAzure Data Platform
Azure Data Platform
 
Azure上の データベース 機能の選び方。KVSからDWHまで
Azure上の データベース 機能の選び方。KVSからDWHまでAzure上の データベース 機能の選び方。KVSからDWHまで
Azure上の データベース 機能の選び方。KVSからDWHまで
 
Azure Antenna はじめての Azure Data Lake
Azure Antenna はじめての Azure Data LakeAzure Antenna はじめての Azure Data Lake
Azure Antenna はじめての Azure Data Lake
 
Developers.IO 2019 Effective Datalake
Developers.IO 2019 Effective DatalakeDevelopers.IO 2019 Effective Datalake
Developers.IO 2019 Effective Datalake
 
Apache Spark on Azure
Apache Spark on AzureApache Spark on Azure
Apache Spark on Azure
 
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理
 
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
 
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
 
Spark Summit 2014 の報告と最近の取り組みについて
Spark Summit 2014 の報告と最近の取り組みについてSpark Summit 2014 の報告と最近の取り組みについて
Spark Summit 2014 の報告と最近の取り組みについて
 
Japan SQL Server Users Group - 第31回 SQL Server 2019勉強会 - Azure Synapse Analyt...
Japan SQL Server Users Group - 第31回 SQL Server 2019勉強会 - Azure Synapse Analyt...Japan SQL Server Users Group - 第31回 SQL Server 2019勉強会 - Azure Synapse Analyt...
Japan SQL Server Users Group - 第31回 SQL Server 2019勉強会 - Azure Synapse Analyt...
 
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
 
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
 
オライリーセミナー Hive入門 #oreilly0724
オライリーセミナー Hive入門  #oreilly0724オライリーセミナー Hive入門  #oreilly0724
オライリーセミナー Hive入門 #oreilly0724
 
やりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまで
やりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまでやりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまで
やりたいことから考えるMicrosoft Azure 上の データストアの選び方とデータサイエンティスト向け活用法。KVSからDWHまで
 
M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...
M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...
M06_DX を担うエンジニア向け Data & AI Analytics プラットフォームの最適解 ~ Azure Synapse 最新機能ご紹介 ~ ...
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 

More from Daiyu Hatakeyama

More from Daiyu Hatakeyama (20)

ChatGPT Impact - その社会的/ビジネス価値を考える -
ChatGPT Impact - その社会的/ビジネス価値を考える -ChatGPT Impact - その社会的/ビジネス価値を考える -
ChatGPT Impact - その社会的/ビジネス価値を考える -
 
Ethics of AI - AIの倫理-
Ethics of AI - AIの倫理-Ethics of AI - AIの倫理-
Ethics of AI - AIの倫理-
 
郡山 Connect 2022 ハッカソン 基調講演 - Hackathon からサービスインになったらデータを扱いましょう
郡山 Connect 2022 ハッカソン 基調講演 - Hackathon からサービスインになったらデータを扱いましょう郡山 Connect 2022 ハッカソン 基調講演 - Hackathon からサービスインになったらデータを扱いましょう
郡山 Connect 2022 ハッカソン 基調講演 - Hackathon からサービスインになったらデータを扱いましょう
 
テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来
テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来
テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来
 
Webサイトの最適化
Webサイトの最適化Webサイトの最適化
Webサイトの最適化
 
DXのための内製化のススメ
DXのための内製化のススメDXのための内製化のススメ
DXのための内製化のススメ
 
JDMC Azureアプリ開発入門
JDMC Azureアプリ開発入門JDMC Azureアプリ開発入門
JDMC Azureアプリ開発入門
 
JAZUG12周年 俺の Azure Cosmos DB
JAZUG12周年 俺の Azure Cosmos DBJAZUG12周年 俺の Azure Cosmos DB
JAZUG12周年 俺の Azure Cosmos DB
 
Microsoft の変革
Microsoft の変革Microsoft の変革
Microsoft の変革
 
データ分析概略
データ分析概略データ分析概略
データ分析概略
 
法政大学 MBA 中小企業向けITとの付き合うコツ
法政大学 MBA 中小企業向けITとの付き合うコツ法政大学 MBA 中小企業向けITとの付き合うコツ
法政大学 MBA 中小企業向けITとの付き合うコツ
 
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
 
Green Software Foundation Global Summit 2022 Tokyo グリーンソフトウェアとは?
Green Software Foundation Global Summit 2022 Tokyo グリーンソフトウェアとは?Green Software Foundation Global Summit 2022 Tokyo グリーンソフトウェアとは?
Green Software Foundation Global Summit 2022 Tokyo グリーンソフトウェアとは?
 
コミュニケーション戦略を前提にしたOutlookやTeams活用
コミュニケーション戦略を前提にしたOutlookやTeams活用コミュニケーション戦略を前提にしたOutlookやTeams活用
コミュニケーション戦略を前提にしたOutlookやTeams活用
 
Python に行く前に Excel で学ぶデータ分析のいろは
Python に行く前に Excel で学ぶデータ分析のいろはPython に行く前に Excel で学ぶデータ分析のいろは
Python に行く前に Excel で学ぶデータ分析のいろは
 
AI の光と影
AI の光と影AI の光と影
AI の光と影
 
東京大学 メディアコンテンツ特別講義 Sustainability
東京大学 メディアコンテンツ特別講義 Sustainability東京大学 メディアコンテンツ特別講義 Sustainability
東京大学 メディアコンテンツ特別講義 Sustainability
 
Wiz国際情報工科自動車大学校 特別講演 Teams活用しよう!
Wiz国際情報工科自動車大学校 特別講演 Teams活用しよう!Wiz国際情報工科自動車大学校 特別講演 Teams活用しよう!
Wiz国際情報工科自動車大学校 特別講演 Teams活用しよう!
 
Wiz国際情報工科自動車大学校_特別講演_ITの織り成す未来
Wiz国際情報工科自動車大学校_特別講演_ITの織り成す未来Wiz国際情報工科自動車大学校_特別講演_ITの織り成す未来
Wiz国際情報工科自動車大学校_特別講演_ITの織り成す未来
 
東洋経済 製造業DXフォーラム 2022: 製造業のための Sustainability との 向き合い方
東洋経済 製造業DXフォーラム 2022: 製造業のための Sustainability との 向き合い方東洋経済 製造業DXフォーラム 2022: 製造業のための Sustainability との 向き合い方
東洋経済 製造業DXフォーラム 2022: 製造業のための Sustainability との 向き合い方
 

Azure Datalake 大全

  • 3. Inbound Data Buffered Ingest (message bus) Event 処理 Logic Event Decoration Spooling/Archiving Hot Store Analytical Store Curation Dashboards/Reports Exploration Interactive Data Movement / Sync
  • 4. 取り込み Modern Data Lifecycle 処理 保存 利用 キュレーション
  • 5. 取り込み Modern Data Lifecycle 処理 保存 利用 Event Hubs IoT Hubs Service Bus Kafka HDInsight ADLA Storm Spark Stream Analytics ADLS Azure Storage Azure SQL DB Azure SQL DW ADLS Azure DW Azure SQL DB Hbase Cassandra Azure Storage Power BI キュレーション Azure Data Factory Azure ML
  • 9. HDInsight Analytics Store Hadoop as a Services Big Data Query as a Services 容量無制限 Raw Data アクセスコントロー ル
  • 10. Azure Data Lake service 無限にデータをストア・管理 Row Data を保存 高スループット、低いレイテンシの分析ジョ ブ セキュリティ、アクセスコントロール Azure Data Lake store HDInsight & Azure Data Lake Analytics
  • 12. ADL Analytics Account Links to ADL Stores ADL Store Account (the default one) Job Queue キーの設置: - Max Concurrent Jobs - Max ADLUs per Job - Max Queue Length Links to Azure Blob Stores U-SQL Catalog Metadata U-SQL Catalog Data ADLAU = Azure Data Lake Analytics Unit
  • 13.
  • 14. ON PREMISES CLOUD Massive Archive On Prem HDFS インポート Active Incoming Data 継続更新 “Landing Zone” Data Lake Store AzCopy でコピー Data Lake Store Data Lake Analytics 永続ストア箇所への移動 と ジョブ実行により作成さ れた 構造化データセットの保 存 DW (many instances) 構造化データの作成。 CONSUMPTION Machine Learning 機械学習の実行、検証 Web Portals Mobile Apps Power BI 実験・検証 A/B テストや 顧客行動の変化の追跡 Jupyter Data Science Notebooks
  • 15. HDInsight Analytics Store Hadoop as a Services Big Data Query as a Services 容量無制限 Raw Data アクセスコントロー ル
  • 16. すぐに使えるクラウド上の Hadoop / Spark です  日本では東西両方のリージョンで利用可能  豊富なクラスタータイプ  Hadoop  2.6.0 / 2.7.0 / 2.7.1  HBase  0.98.4 / 1.1.2  Storm  0.9.3 / 0.10.0  Spark (プレビュー)  1.5.2 / 1.6.0  R Server on Spark (プレビュー)  1.6.0 ※ Premium プラン専用
  • 17. Hortonworks と協業し、Windows 環境で Hadoop を提供します  元々 Java で書かれたオープンソースプロジェクトである Hadoop ですが、 Windows 環境でスムーズに動かすため には いくつか工夫が必要でした  Microsoft は Hortonworks 社と協業し、 Hadoop の Windows 環境への移植と最適化を行っています  Hortonworks は Yahoo! で Apache Hadoop の 開発に携わっていたチームが独立して設立された企業で す  “Hortonworks Data Platform” (HDP) という Hadoop ディストリビューションを開発しており、 これが HDInsight のコア部分です http://jp.hortonworks.com/hdp/
  • 18. HDFS 分散ファイルシステム“HDFS” (Hadoop Distributed File System)  複数のコンピューターを束ねて、 一つの仮想的なファイルシステムを提供  Hadoop クラスタに属する全ての ノードが同じ名前空間を共有  各ファイルは 64 MB ~ 256 MB 程度の ブロックに分割されて、複数ノードに分散  ブロックサイズが大きいのは、 シーケンシャルアクセスに特化している ため  各断片は最低 3 ノードに複製され、 ノード障害への耐性を持つ  一つのファイルの複数の部分を、複数の コンピューターで同時に処理することで、 処理を高速化することができる 断片 1 断片 2 断片 3 断片 4 断片 1 断片 2 断片 3 断片 4 ファイル 1 断片 1 断片 2 断片 3 断片 4 ファイル 4 断片 1 断片 2 断片 3 断片 4
  • 19. 分散プログラミングモデル “MapReduce” 2013-08-26 23:59:03 W3SVC1 192.168.0.1 GET /… 2013-08-26 23:59:05 W3SVC1 192.168.0.1 GET /… 2013-08-26 23:59:25 W3SVC1 192.168.0.1 GET /… 2013-08-27 00:01:02 W3SVC1 192.168.0.1 GET /… 2013-08-27 00:02:04 W3SVC1 192.168.0.1 GET /…  名前は一見難しげですが、実際には単純です (だからこそスケーラビリティがあります)  例えば右のような Web のアクセスログがあるとして、  伝統的なテキスト処理ツールによる集計はこのようなものですが、 $ grep /Login.aspx access_log | sort | uniq –c > output.txt 対象ファイルの全行を頭から舐めて 何らかの処理をする(この場合は検索) 中間結果を集計の ためにソートする ソートされたデータを 数え上げて結果を得る MapReduce はこういった処理をクラスター上で並列分散実行する仕組みです Map Reduce
  • 20. Mapper Reducer  入力ファイルの1行が value に渡されてくる (単なる文字列として!)  左の例は、単語毎の出現回数を数える Map 処理。 StringTokenizerを使って自分で文字列を単語単位に 分解し、「いま、”・・・”という単語があった」と 記録(OutputCollectorに出力)していく  「Hadoopは非構造化データの処理に向く」というのは、 「単なる文字列を全部自分で処理する」ということ!  こちらは Reduce 処理  Map 処理の出力は、Hadoopによってキー毎に集約され、 reduce メソッドに渡される。イメージとしては、 (“単語1”: [1,1,1]) (“単語2”: [1,1]) のような「キー:値」形式のデータ  「“単語1”は値が3つ入っているので3回出現した」、 という感じで数えていく
  • 21. そもそも別物であり「データ量が多いならHadoop」というわけでもありません  Hadoopの根幹は 「フラットファイルに格納された大量のデータを 頭から順次走査して何らかの処理を行い、 結果をファイルへ出力する並列分散バッチ処理基 盤」 と考えておけばあまり間違っていません  処理の対象は「データベース」ではなく「ファイル」で す。 当然、スキーマやテーブルという概念はありません  ということは、インデックスという考え方もありません。 大量のデータの中から特定の部分に素早くシークして データを取り出すような操作は苦手です  逆に得意なのは、シーケンシャルな全件処理です  ランダムアクセスよりシーケンシャルアクセス  レイテンシより、スループット優先  インタラクティブな処理より、バッチ処理が得意 RDBMS 想定する データ操作 小さなデータの ランダムな参照、更 新 大きなデータの 挿入・参照。 更新はない レスポンスタイ ム 速い 遅い 拡張性の方向 スケールアップ スケールアウト データ構造 構造化データ 準構造化データ 「Hadoop徹底入門 第2版 オープンソース分散処理環境の構築 」より http://www.amazon.co.jp/dp/479812964X
  • 22. Hive, Impala, Presto...  ちょっとした検索処理の度に、毎回Javaプログラムを書くのはさすがに面倒です  そこで、SQL(的な)クエリでHadoopに対する処理を行うことのできる関連プロジェクトがいくつかあります  おそらく一番歴史が長くて有名なのが、Facebookによって開発された”Hive”です。(https://hive.apache.org/)  “Hive QL”というSQL的な言語でクエリを記述すると、MapReduce ジョブに変換して実行してくれます 2013-08-26 23:59:03 W3SVC1 192.168.0.1 GET /… 2013-08-26 23:59:05 W3SVC1 192.168.0.1 GET /… 2013-08-26 23:59:25 W3SVC1 192.168.0.1 GET /… 2013-08-27 00:01:02 W3SVC1 192.168.0.1 GET /… 2013-08-27 00:02:04 W3SVC1 192.168.0.1 GET /… こういうテキストファイルを date time sitename s-ip method uri 2013-08-26 23:59:03 W3SVC1 192.168.0.1 GET /... 2013-08-26 23:59:05 W3SVC1 192.168.0.1 GET /... 2013-08-26 23:59:25 W3SVC1 192.168.0.1 GET /... 2013-08-26 00:01:02 W3SVC1 192.168.0.1 GET /... 2013-08-26 00:02:04 W3SVC1 192.168.0.1 GET /... こんなテーブルだと思ってクエリを投げられます  Hive は非常に便利で広く使われていますが、「基本的にはバッチ処理、素早いレスポンスは期待できない」という点は変 わっていません  その欠点を補うべく、Cloudera の Impala, Facebook の Presto といった新しいプロジェクトが生まれています
  • 23. Hadoop Common Hadoop HDFS Hadoop MapReduce 主要な関連プロジェクト Hive Ambari HBase Mahout
  • 24.
  • 25. HDInsight その他の Hadoop on Azure Windows 版 Linux 版 CDH (Cloudera) HDP (Hortonworks) “WASB” ブロック BLOB を ダイレクトに使う “HDFS on BLOB” Azure 仮想マシンの データディスクを 束ねて HDFS を構成
  • 27.  Twitter 分析を行っていた BackType 社が開発  Twitter が BackType を買収したことで Twitter から OSS として公開される  その後、2014年9月に ASFのトップレベル プロジェクトとなる スケーラブルな分散 CEP 基盤
  • 28.  Storm 専用のクラスターを 作成可能です。  2015年2月にGA済み。  HDInsight のバージョンは 3.1 と 3.2 を選択可能 ですが、3.2をオススメ (理由は後述) http://azure.microsoft.com/ja-jp/updates/general-availability-apache-storm-on-hdinsight/
  • 32.
  • 33.
  • 34.
  • 35. ヘッドノードに SSH でログイン Livy による REST API を 呼び出す 使いやすい Jupyter Notebook でお手軽に
  • 36. 項目 2013 年の記録 Hadoop Spark 100 TB (2014年) Spark 1 PB (2014年) データ サイズ 102.5TB 100 TB 1 PB (≒1000 TB) 処理時間 72 分 23 分 234 分 ノード数 2100 206 190 コア数 50,400 6,592 6,080
  • 38.
  • 40. Map reduce Hbase トランザクショ ン HDFS アプリケーションHive クエリ Azure HDInsight Hadoop WebHDFS クライアント Hadoop WebHDFS クライアント WebHDFS エンドポイント WebHDFS REST API WebHDFS REST API ADL Store file ADL Store file ADL Store file ADL Store fileADL Store file Azure Data Lake Store
  • 41. Local ADL Store  Azure Portal  Azure PowerShell  Azure CLI  Data Lake Tools for Visual Studio  Azure Data Factory  AdlCopy ツール Azure Stream Analytics Azure HDInsight Storm Azure Data Factory Apache Sqoop  Apache DistCp  Azure Data Factory  AdlCopy ツール
  • 43. Azure Data Lake Store file …Block 1 Block 2 Block 2 Backend Storage Data node Data node Data node Data node Data nodeData node Block Block Block Block Block Block
  • 44. Azure Data Lake Store Azure BLOB ストレージ 目的 ビッグ データ分析ワークロードに 最適化されたストレージ さまざまなストレージ シナリオに対応する 汎用オブジェクト ストア ユース ケース バッチ、対話型、ストリーミング分析、 および機械学習データ (ログ ファイル、IoT データ、 クリック ストリーム、大規模なデータセット等) あらゆる種類のテキスト データまたは バイナリ データ (アプリケーション バックエンド、 バックアップ データ、ストリーミング用 メディア ストレージ、汎用データなど) Structure 階層型ファイル システム フラットな名前空間を使用するオブジェクト ストア サーバー側 API WebHDFS 互換の REST API Azure BLOB ストレージ REST API データ操作 - 承認 POSIX アクセス制御リスト (ACL)。 Azure Active Directory ID に基づく ACL : ファイルおよびフォルダー レベルで設定可能。 アカウントレベルの承認:アカウント アクセス キー アカウント、コンテナー、BLOB の承認:Shared Access Signature キー データ操作 - 認証 Azure Active Directory ID 共有シークレット (アカウント アクセス キーと Shared Access Signature キー) サイズ制限 アカウント サイズ、ファイル サイズ、 ファイル数に制限なし あり (https://docs.microsoft.com/ja-jp/azure/azure- subscription-service-limits#storage-limits)
  • 45. AdlCopy /Source <Blob source> /Dest <ADLS destination> /SourceKey <Key for Blob account> /Account <ADLA account> /Units <Number of Analytics units>
  • 48.
  • 49. スケールに制限なし U-SQL, SQLのメリットにC#のパワーを加えた新 しい言語 Data Lake Store に最適化 Azure データサービスへの FEDERATED QUERY 企業利用のためのセキュリティ、 アクセス制御、暗号化など ジョブ単位での課金とスケール設定 Azure Data Lake Analytics 全てのどんなサイズのデータ でも処理できる Apache YARNベースの 分析サービス
  • 50. HDInsight Java, Eclipse, Hive, etc. フルマネージド の Hadoop クラスタ Data Lake Analytics C#, SQL & PowerShell フルマネージド の 分散管理処理クラスタ DryAd ベース
  • 51. U-SQL ジョブ ストレージ ADL Analytics サービス 1 Azure ポータルへ ログイン ADL Analytics ア カウントを作成2 3 U-SQL スクリプトを書き、 ADL Analytics ア カウントへ サブミット 4 U-SQL ジョブが データセットを 読み書き • ADL Store • Azure Storage Blob • …
  • 52.
  • 53. U-SQL Query Result Query Azure Storage Blobs Azure SQL in VMs Azure SQL DB Azure Data Lake Analytics
  • 54.
  • 57. Management Data Lake Analytics アカウント Jobs U-SQL job Catalog カタログ(メタデータ) Management Data Lake Store アカウント File System Upload, download, list, delete, rename, append (WebHDFS) Analytics Store Azure Active Directory
  • 58.
  • 59.
  • 60.
  • 61.
  • 63. #azurejp string subscriptionId = "83daeeec-f16c-47f8-9dc4-6ff1ebf9feb3"; var adlaClient = new DataLakeAnalyticsAccountManagementClient(tokenCreds); adlaClient.SubscriptionId = subscriptionId;
  • 65. 多くの SQL & .NET DEVELOPERS 宣言型言語の SQL と 逐次実行型である C# のパワーを融合 構造化、一部構造化、非構造化データの融合 全てのデータに分散クエリの実施 U-SQL Big Data のための新しい言語
  • 66. #azurejp @rows = EXTRACT name string, id int FROM “/data.csv” USING Extractors.Csv( ); OUTPUT @rows TO “/output.csv” USING Outputters.Csv(); Rowsets EXTRACT for files OUTPUT Schema Types Inputs & Outputs Keywords are UPPERCASE
  • 67. #azurejp REFERENCE ASSEMBLY WebLogExtASM; @rs = EXTRACT UserID string, Start DateTime, End DateTime, Region string, SitesVisited string, PagesVisited string FROM "swebhdfs://Logs/WebLogRecords.csv" USING WebLogExtractor (); @result = SELECT UserID, (End.Subtract(Start)).TotalSeconds AS Duration FROM @rs ORDER BY Duration DESC FETCH 10; OUTPUT @result TO "swebhdfs://Logs/Results/top10.txt" USING Outputter.Tsv(); • 型定義は C# の型定義と同じ • データをファイルから抽出・読 み込み するときに、スキーマを定義 Data Lake Store のファイ ル独自形式を解析するカスタム 関数 C# の関数 行セット: (中間テーブ ルの概念に近 い) TSV形式で読み取る関数
  • 68. DECLARE @endDate DateTime = DateTime.Now; DECLARE @startDate DateTime = @endDate.AddDays(-7); @orders = EXTRACT OrderId int, Customer string, Date DateTime, Amount float FROM "/input/orders.txt" USING Extractors.Tsv(); @orders = SELECT * FROM @orders WHERE Date >= startDate AND Date <= endDate; @orders = SELECT * FROM @orders WHERE Customer.Contains(“Contoso”); OUTPUT @orders TO "/output/output.txt" USING Outputters.Tsv(); U-SQL Basics (1) DECLARE C# の式で変数宣言 (2) EXTRACT ファイル読み込み時に スキーマを決定し、結果を RowSet に (3) RowSet 式を使ってデータを再定 義 (4) OUTPUT データをファイルへ出 力 1 2 3 4
  • 69. CREATE ASSEMBLY OrdersDB.SampleDotNetCode FROM @"/Assemblies/Helpers.dll"; REFERENCE ASSEMBLY OrdersDB.Helpers; @rows = SELECT OrdersDB.Helpers.Normalize(Customer) AS Customer, Amount AS Amount FROM @orders; @rows = PROCESS @rows PRODUCE OrderId string, FraudDetectionScore double USING new OrdersDB.Detection.FraudAnalyzer(); OUTPUT @rows TO "/output/output.dat" USING OrdersDB.CustomOutputter(); U-SQL .NET Code 利用 (1) CREATE ASSEMBLY アセンブ リーをU-SQL Catalog へ登録 (2) REFERENCE ASSEMBLY アセン ブリーへの参照宣言 (3) U-SQL 式の中で、C# メソッドの 呼び出し (4) PROCESS User Defined Operator を使って、行ごとの処理を実行 (5) OUTPUT 独自のデータ形式で出 力 1 2 3 4 5
  • 70.
  • 71. #azurejp // WASB (requires setting up a WASB DataSource in ADLS) @rows = EXTRACT name string, id int FROM “wasb://…/data..csv” USING Extractors.Csv( ); // ADLS (absolute path) @rows = EXTRACT name string, id int FROM “adl://…/data..csv” USING Extractors.Csv( ); // ADLS (relative to default ADLS for an ADLA account) @rows = EXTRACT name string, id int FROM “/…/data..csv” USING Extractors.Csv( ); Default Extractors Extractors.Csv( ) Extractors.Tsv( )
  • 72. #azurejp @rows = EXTRACT name string, id int FROM “/file1.tsv”, “/file2.tsv”, “/file3.tsv” USING Extractors.Csv( );
  • 73. #azurejp @rows = EXTRACT name string, id int FROM “adl://…/data..csv” USING Extractors.Csv(); OUTPUT @rows TO “/data.tsv” USING Outputters.Csv(); Default Outputters Outputters.Csv( ) Outputters.Tsv( )
  • 74. #azurejp @rows = EXTRACT Name string, Id int, FROM “/file.tsv” USING Extractors.Tsv(skipFirstNRows:1); OUTPUT @data TO "/output/docsamples/output_header.csv" USING Outputters.Csv(outputHeader:true); スキップする行数を指 定
  • 76.
  • 77.
  • 78. #azurejp @rows = EXTRACT <schema> FROM “adl://…/data..csv” USING Outputters.Csv(); DECLARE @inputfile string = “adl://…/data..csv” @rows = EXTRACT <schema> FROM @inputfile USING Outputters.Csv();
  • 79. #azurejp DECLARE @a string = "Hello World"; DECLARE @b int = 2; DECLARE @c dateTime = System.DateTime.Parse("1979/03/31"); DECLARE @d dateTime = DateTime.Now; DECLARE @e Guid = System.Guid.Parse("BEF7A4E8-F583-4804-9711-7E608215EBA6"); DECLARE @f byte [] = new byte[] { 0, 1, 2, 3, 4}; @変数名 で定義
  • 80.
  • 81. #azurejp @departments = SELECT * FROM (VALUES (31, "Sales"), (33, "Engineering"), (34, "Clerical"), (35, "Marketing") ) AS D( DepID, DepName );
  • 82.
  • 83. #azurejp @output = SELECT Start, Region, Duration + 1.0 AS Duration2 FROM @searchlog;
  • 86. #azurejp @output = SELECT Start, Region, Duration FROM @searchlog; @output = SELECT * FROM @output WHERE Region == "en-gb";
  • 87.
  • 88. #azurejp @output = SELECT Start, Region, Duration FROM @searchlog WHERE (Duration >= 60) OR NOT (Region == "en-gb"); // NOTE: && and || perform short-circuiting @output = SELECT Start, Region, Duration FROM @searchlog WHERE (Duration >= 60) || !(Region == "en-gb");
  • 89. #azurejp @output = SELECT Start, Region, Duration FROM @searchlog WHERE Start >= DateTime.Parse("2012/02/16") AND Start <= DateTime.Parse("2012/02/17");
  • 91.
  • 92. #azurejp @output = SELECT Region, COUNT() AS NumSessions, SUM(Duration) AS TotalDuration, AVG(Duration) AS AvgDwellTtime, MAX(Duration) AS MaxDuration, MIN(Duration) AS MinDuration FROM @searchlog GROUP BY Region;
  • 93. #azurejp // NO GROUP BY @output = SELECT SUM(Duration) AS TotalDuration FROM @searchlog; // WITH GROUP BY @output = SELECT Region, SUM(Duration) AS TotalDuration FROM searchlog GROUP BY Region;
  • 94. #azurejp // find all the Regions where the total dwell time is > 200 @output = SELECT Region, SUM(Duration) AS TotalDuration FROM @searchlog GROUP BY Region HAVING TotalDuration > 200;
  • 95. #azurejp // Option 1 @output = SELECT Region, SUM(Duration) AS TotalDuration FROM @searchlog GROUP BY Region; @output2 = SELECT * FROM @output WHERE TotalDuration > 200; // Option 2 @output = SELECT Region, SUM(Duration) AS TotalDuration FROM @searchlog GROUP BY Region HAVING SUM(Duration) > 200;
  • 96.
  • 97. #azurejp // List the sessions in increasing order of Duration @output = SELECT * FROM @searchlog ORDER BY Duration ASC FETCH FIRST 3 ROWS; // This does not work (ORDER BY requires FETCH) @output = SELECT * FROM @searchlog ORDER BY Duration ASC;
  • 99.
  • 100. #azurejp  LEFT OUTER JOIN  LEFT INNER JOIN  RIGHT INNER JOIN  RIGHT OUTER JOIN  FULL OUTER JOIN  CROSS JOIN  LEFT SEMI JOIN  RIGHT SEMI JOIN  EXCEPT ALL  EXCEPT DISTINCT  INTERSECT ALL  INTERSECT DISTINCT  UNION ALL  UNION DISTINCT
  • 101.
  • 102. #azurejp @rs1 = SELECT ROW_NUMBER() OVER ( ) AS RowNumber, Start, Region FROM @searchlog ORDER BY Start;
  • 103. 以下の一連のクエリは、中間の行セットの @irs を必要とする User Id Region Duration A$A892 en-us 10500 HG54#A en-us 22270 YSD78@ en-us 38790 JADI899 en-gb 18780 YCPB(%U en-gb 17000 BHPY687 en-gb 16700 BGFSWQ en-bs 57750 BSD805 en-fr 15675 BSDYTH7 en-fr 10250 @rs = EXTRACT UserID string, Start DateTime, End DateTime, Region string, SitesVisited string, PagesVisited string FROM "swebhdfs://Logs/WebLogRecords.txt" USING WebLogExtractor(); @irs = SELECT UserID, Region, (End.Subtract(Start)).TotalSeconds AS Duration FROM @rs; WebLogRecords.txt Azure Data Lake
  • 104. #azurejp [SUM = 207715] UserId Region Duration A$A892 en-us 10500 HG54#A en-us 22270 YSD78@ en-us 38790 JADI899 en-gb 18780 YCPB(%U en-gb 17000 BHPY687 en-gb 16700 BGFSWQ en-bs 57750 BSD805 en-fr 15675 BSDYTH7 en-fr 10250 UserId TotalDuration A$A892 207715 HG54#A 207715 YSD78@ 207715 JADI899 207715 YCPB(%U 207715 BHPY687 207715 BGFSWQ 207715 BSD805 207715 BSDYTH7 207715 全行のウィンドウを通じて 期間をサマリーする @result = SELECT UserID, SUM(Duration) OVER() AS TotalDuration FROM @irs; @irs @result ユーザーIDと、ウェブサイトにおける全ユーザーの滞在時間の総計をリストする
  • 105. #azurejp UserId Region Duration A$A892 en-us 10500 HG54#A en-us 22270 YSD78@ en-us 38790 JADI899 en-gb 18780 YCPB(%U en-gb 17000 BHPY687 en-gb 16700 BGFSWQ en-bs 57750 BSD805 en-fr 15675 BSDYTH7 en-fr 10250 UserId Region RegionTotal A$A892 en-us 71560 HG54#A en-us 71569 YSD78@ en-us 71560 JADI899 en-gb 52480 YCPB(%U en-gb 52480 BHPY687 en-gb 52480 BGFSWQ en-bs 57750 BSD805 en-fr 25925 BSDYTH7 en-fr 25925 @irs @total2 @total2 = SELECT UserId, Region, SUM(Duration) OVER( PARTITION BY Region ) AS RegionTotal FROM @irs; リージョンのウィンドウを通じて 期間をサマリーする ユーザーIDと、リージョンとリージョンごとのウェブサイトにおける滞在時間の総計 をリストする
  • 106. #azurejp UserId Region Duration A$A892 en-us 10500 HG54#A en-us 22270 YSD78@ en-us 38790 JADI899 en-gb 18780 YCPB(%U en-gb 17000 BHPY687 en-gb 16700 BGFSWQ en-bs 57750 BSD805 en-fr 15675 BSDYTH7 en-fr 10250 UserId Region CountByRegion A$A892 en-us 3 HG54#A en-us 3 YSD78@ en-us 3 JADI899 en-gb 3 YCPB(%U en-gb 3 BHPY687 en-gb 3 BGFSWQ en-bs 1 BSD805 en-fr 2 BSDYTH7 en-fr 2 @irs @result リージョンごとのユーザー数をカウントする @result = SELECT UserId, Region, COUNT(*) OVER( PARTITION BY Region) AS CountByRegion FROM @irs; リージョンごとのユーザー数のリストする
  • 107. #azurejp UserId Region Duration A$A892 en-us 10500 HG54#A en-us 22270 YSD78@ en-us 38790 JADI899 en-gb 18780 YCPB(%U en-gb 17000 BHPY687 en-gb 16700 BGFSWQ en-bs 57750 BSD805 en-fr 15675 BSDYTH7 en-fr 10250 UserId Region Rank YSD78@ en-us 1 HG54#A en-us 2 JADI899 en-gb 1 YCPB(%U en-gb 2 BGFSWQ en-bs 1 BSD805 en-fr 1 BSDYTH7 en-fr 2 @irs @result @result = SELECT UserId, Region, ROW_NUMBER() OVER(PARTITION BY Vertical ORDER BY Duration) AS Rank FROM @irs GROUP BY Region HAVING RowNumber <= 2; 各リージョンで最も滞在時間の長いユーザー2人を見つける
  • 108.
  • 109. #azurejp @a = SELECT Region, Urls FROM @searchlog; @b = SELECT Region, SqlArray.Create(Urls.Split(';')) AS UrlTokens FROM @a; @c = SELECT Region, Token AS Url FROM @b CROSS APPLY EXPLODE (UrlTokens) AS r(Token); @a @b @c CROSS APPLY EXPLODE ARRAY TYPE
  • 110. #azurejp @d = SELECT Region, ARRAY_AGG<string>(Url).ToArray() AS UrlArray FROM @c GROUP BY Region; @e = SELECT Region, string.Join(";", UrlArray) AS Urls FROM @c; @c @e @d
  • 111.
  • 113.
  • 116. #azurejp date suffix {date:yyyy} {date:MM} {date:dd} {suffix} C#式でファイルセット の フィルター実施
  • 117.
  • 118. それぞれの Catalog は N個の Database を持つ Tables Table-Valued Functions Assemblies
  • 119. #azurejp CREATE TABLE Customers( id int, key int, Customer string, Date DateTime, Amount float, INDEX index1 CLUSTERED (id) PARTITIONED BY (date) DISTRIBUTED BY HASH (key) INTO 4 ); /catalog/…/tables/Guid(T)/ Guid(T.p1).ss Guid(T.p2).ss Guid(T.p3).ss 論理構造 物理構造 @date1 @date2 @date3 ID1 H1 ID1 H1 ID1 H1 ID2 ID2 ID3ID3 ID4 H2 ID4 H2 ID5 ID5 ID6 H3 ID6 H2ID6 H3 ID7 H4 ID7 ID8 ID7 ID9 ID8 Clustering -> データの近さ Partition -> ライフサイクル管理 Distribution -> データの近さ + 分 散性
  • 120. U-SQL Table が 構造化されたデータとして 管理 Files under “/catalog/database” Catalog フォルダーを 直接読み書きしない
  • 121. #azurejp CREATE FUNCTION MyDB.dbo. RETURNS @rows TABLE ( Name string, Id int ) AS BEGIN @rows = EXTRACT Name string, Id int, FROM “/file.tsv” USING Extractors.Tsv(); RETURN; END; 結果を返す RowSet Schema 定義された RowSet A Single concept that replaces Scope views & functions -Discoverable -Schematized
  • 122. #azurejp CREATE FUNCTION MyDB.dbo. RETURNS @rows AS BEGIN @rows = EXTRACT Name string, Id int, FROM “/file.tsv” USING Extractors.Tsv(); RETURN; END; RowSet からスキーマ定 義
  • 123. #azurejp // A Table @rs = SELECT * FROM MyDB.dbo.Customers; // A Table valued Function @rs = SELECT * FROM MyDB.dbo.GetData();
  • 124.
  • 125. #azurejp @output = SELECT Region.ToUpper() AS NewRegion FROM @searchlog; @output= SELECT Start, Region, Start.DayOfYear AS StartDayOfYear FROM @searchlog;
  • 127. #azurejp // User-defined code is not supported DECLARE myName string = MyHelper.GetMyName();
  • 129. #azurejp REFERENCE ASSEMBLY MyCode; @rows = SELECT OrdersDB.Helpers.Normalize(Customer) AS CustN, Amount AS Amount FROM @orders; CREATE ASSEMBLY MyCode FROM @"/DLLs/Helpers.dll"; CREATE ASSEMBLY で 参照設定 アセンブリーをCateLogに事 前アップロード。その後 CREATE ASSEMBLY 読み込み
  • 130.
  • 131. Query Azure Storage Blobs Azure SQL in VMs Azure SQL DB Azure Data Lake Analytics U-SQL Query Azure SQL Data Warehouse Azure Data Lake Storage
  • 132. ADLA Account youradlaaccount SQL Server yoursqlserver SQL DB/DW AdventureW orksLT U-SQL DB AdventureWorksLT_External DB Credential AdventureWorksLT_Creds External DataSource AdventureWorksLT_Creds Table Customers External Table CustomersExternal External Tableに スキーマ定義済 みのクエリ実行 スキーマ指定 せずにクエリ 実行
  • 133. # If you have the username & password as strings $username = "username" $passwd = ConvertTo-SecureString "password" -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential($username, $passwd) # Prompt user for credentials $creds = Get-Credential OR
  • 134. New-AdlCatalogCredential -Account "youradlaaccount" ` -DatabaseName "AdventureWorksLT_ExternalDB" ` -DatabaseHost “yoursqlserver.database.windows.net" ` -Port 1433 ` -CredentialName "AdventureWorksLT_Creds" ` -Credential $creds
  • 135. USE DATABASE [AdventureWorksLT_ExternalDB]; CREATE DATA SOURCE IF NOT EXISTS AdventureWorksLT_DS FROM AZURESQLDB WITH ( PROVIDER_STRING = "Database=AdventureWorksLT;Trusted_Connection=False;Encrypt=True", CREDENTIAL = AdventureWorksLT_Creds, REMOTABLE_TYPES = (bool, byte, sbyte, short, ushort, int, uint, long, ulong, decimal, float, double, string, DateTime) ); Remotable types
  • 136. USE DATABASE [AdventureWorksLT_ExternalDB]; @customers = SELECT * FROM EXTERNAL AdventureWorksLT_DS LOCATION "[SalesLT].[Customer]"; OUTPUT @customers TO @"/SalesLT_Customer.csv" USING Outputters.Csv();
  • 137. USE DATABASE [AdventureWorksLT_ExternalDB]; CREATE EXTERNAL TABLE IF NOT EXISTS dbo.CustomersExternal ( CustomerID int?, NameStyle bool, Title string, FirstName string, MiddleName string, LastName string, Suffix string, CompanyName string, SalesPerson string, EmailAddress string, Phone string, PasswordHash string, PasswordSalt string, Rowguid Guid, ModifiedDate DateTime? ) FROM AdventureWorksLT_DS LOCATION "[SalesLT].[Customer]"; USE DATABASE [AdventureWorksLT_ExternalDB]; @customers = SELECT * FROM dbo.CustomersExternal; OUTPUT @customers TO @"/SalesLT_Customer.csv" USING Outputters.Csv(); External Table からの読み取り
  • 138. #azurejp CREATE CREDENTIAL IF NOT EXISTS dahatakeAdmin WITH USER_NAME ="dahatake", IDENTITY = "dahatakeSec"; CREATE DATA SOURCE IF NOT EXISTS pubsSource FROM AZURESQLDB WITH ( PROVIDER_STRING = "Initial Catalog=pubs;Encrypt=True", CREDENTIAL = dahatakeAdmin ); @result = SELECT * FROM EXTERNAL pubsSource EXECUTE @"SELECT * FROM dbo.employee"; OUTPUT @result TO "/output/employee.csv" USING Outputters.Csv(); Install-Module AzureRM Install-AzureRM Login-AzureRmAccount Get-AzureRmSubscription Set-AzureRmContext -SubscriptionId “<subscription ID>" $passwd = ConvertTo-SecureString “<password>" -AsPlainText -Force $mysecret = New-Object System.Management.Automation.PSCredential("dah atakeSec", $passwd) New-AzureRmDataLakeAnalyticsCatalogSecret - DatabaseName "master" -AccountName "dahatakeadla" -Secret $mysecret -Host "dahatakesql.database.windows.net" -Port 1433 資格情報オブジェクト: https://msdn.microsoft.com/ja-jp/library/azure/mt621327.aspx
  • 139.
  • 140. ビルトインの 演算子、関数、 集合関数 C# 式 (SELECT 文の中) ユーザー定義の集合関数 (UDAGG) ユーザー定義の関数 (UDF) ユーザー定義の演算子 (UDO)
  • 141. • ユーザー定義の Extractor • ユーザー定義の Outputter • ユーザー定義の Processor • 1行読み込み、1行作成 • パススルー vs. 変換 • ユーザー定義の Applier • 1行読み込み、0行以上を生成 • OUTER/CROSS APPLY とともに使用 • ユーザー定義の Combiner • 行セットの結合 (ユーザー定義のジョインのように) • ユーザー定義の Reducer • n 行読み込み、 m 行生成 (通常は m<n) • UDO インスタンスを使う明示的な U-SQL シンタクス でスケールアウト (実行の一部として作成): • EXTRACT • OUTPUT • PROCESS • COMBINE • REDUCE
  • 142.
  • 143. Input Data (K, A, B, C, D) REDUCE ON K Partition K0 Partition K1 Partition K2 REDUCER Python/R REDUCER Python/R REDUCER Python/R Output for K0 Output for K0 Output for K0 Extensions の追加 REFERENCE ASSEMBLY [ExtPython] REFERENCE ASSEMBLY [ExtR] 特別な Reducers によって Python or R code を分散実行 • Extension.Python.Reducer • Extension.R.Reducer Standard DataFrame を Reducerの入出力とし て使える NOTE: Reducer は、Aggregate を含んでいな い
  • 144. REFERENCE ASSEMBLY [ExtPython]; DECLARE @myScript = @" def get_mentions(tweet): return ';'.join( ( w[1:] for w in tweet.split() if w[0]=='@' ) ) def usqlml_main(df): del df['time'] del df['author'] df['mentions'] = df.tweet.apply(get_mentions) del df['tweet'] return df "; @t = SELECT * FROM (VALUES ("D1","T1","A1","@foo Hello World @bar"), ("D2","T2","A2","@baz Hello World @beer") ) AS D( date, time, author, tweet ); @m = REDUCE @t ON date PRODUCE date string, mentions string USING new Extension.Python.Reducer(pyScript:@myScript); Python Extensions U-SQLを並列分散処理に使用する Python code を多くのノード上で実 行 NumPy、Pandasのような、Python の標準ライブラリが利用できる
  • 146. REFERENCE ASSEMBLY ImageCommon; REFERENCE ASSEMBLY FaceSdk; REFERENCE ASSEMBLY ImageEmotion; REFERENCE ASSEMBLY ImageTagging; REFERENCE ASSEMBLY ImageOcr; @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 @objects = PROCESS @imgs PRODUCE FileName, NumObjects int, Tags string READONLY FileName USING new Cognition.Vision.ImageTagger(); OUTPUT @objects TO "/objects.tsv" USING Outputters.Tsv(); Imaging
  • 147. REFERENCE ASSEMBLY [TextCommon]; REFERENCE ASSEMBLY [TextSentiment]; REFERENCE ASSEMBLY [TextKeyPhrase]; @WarAndPeace = EXTRACT No int, Year string, Book string, Chapter string, Text string FROM @"/usqlext/samples/cognition/war_and_peace.csv" USING Extractors.Csv(); @sentiment = PROCESS @WarAndPeace PRODUCE No, Year, Book, Chapter, Text, Sentiment string, Conf double USING new Cognition.Text.SentimentAnalyzer(true); OUTPUT @sentinment TO "/sentiment.tsv" USING Outputters.Tsv(); Text Analysis
  • 148. • オブジェクト認識 (タグ) • 顔認識、感情認識 • JOIN処理 – 幸せな人は誰なのか? REFERENCE ASSEMBLY ImageCommon; REFERENCE ASSEMBLY FaceSdk; REFERENCE ASSEMBLY ImageEmotion; REFERENCE ASSEMBLY ImageTagging; @objects = PROCESS MegaFaceView PRODUCE FileName, NumObjects int, Tags string READONLY FileName USING new Cognition.Vision.ImageTagger(); @tags = SELECT FileName, T.Tag FROM @objects CROSS APPLY EXPLODE(SqlArray.Create(Tags.Split(';'))) AS T(Tag) WHERE T.Tag.ToString().Contains("dog") OR T.Tag.ToString().Contains("cat"); @emotion_raw = PROCESS MegaFaceView PRODUCE FileName string, NumFaces int, Emotion string READONLY FileName USING new Cognition.Vision.EmotionAnalyzer(); @emotion = SELECT FileName, T.Emotion FROM @emotion_raw CROSS APPLY EXPLODE(SqlArray.Create(Emotion.Split(';'))) AS T(Emotion); @correlation = SELECT T.FileName, Emotion, Tag FROM @emotion AS E INNER JOIN @tags AS T ON E.FileName == T.FileName; Images Objects Emotions filter join aggregate
  • 150.
  • 167.
  • 170. Job Front End Job Scheduler Compiler Service Job Queue Job Manager U-SQL Catalog YARN Job 投入 Job 実行 U-SQL Runtime vertex 実行
  • 171. U-SQL C# user code C++ system code Algebra other files (system files, deployed resources) managed dll Unmanaged dll Input script Compilation output (in job folder) Files Meta Data Service Deployed to vertices Compiler & Optimizer
  • 172. ジョブはVertexに分割 Vertex が実行単位 Input Output Output 6 ステージ 8 Vertex Vertexはステージに展開 – 同じステージのVertexは、 同じ処理をする – 前段階のステージのVertexに 依存する – 1つのVertexのジョブ実行は5時間まで acyclic graph (循環のないグラフ)
  • 175. 各四角形 = “Vertex” 全体の一部を表す 各SuperVertex (別名 “Stage”) におけるVertexは同じデー タの異なる部分に対し同様 の操作を行う ジョブグラフとして 可視化
  • 176. 並列度の要求= 1 (1度に1つの vertex を動かす) 並列度の要求 = 4 (1度に4つの vertex を動かす) 次のステー ジは、前の ステージが 完了する前 に開始可能 ステージ中にすべ ての予約された処 理を並列して行う のは不可
  • 177. 252 個の処理 Vertex の平 均実行時間 43 億行 データの読み込みと 書き込み 失敗した vertex … しか し自動的にリトライ ステージ全体が成功 で完了
  • 178. 下の vertex が上の vertex の出力に依存 クリティカルパス: ジョブを最後まで実行し 続けるVertexの依存関係 チェーン。
  • 179.
  • 181. どの Vertex を表示す るか 全ての Vertex クリティカルパス
  • 182.
  • 183.
  • 184. Data Lake Tools for VS Azure Portal PowerShell
  • 185.
  • 186. Clicking on that button will copy the Job Link to the Clipboard
  • 187.
  • 188. Clicking on that button will copy the Job Link to the Clipboard
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195. Here’s the ### the problem is near the ###
  • 196.
  • 197. USER CODE (99.9%) • There’s something about what the developer did that is causing the problem • The issue may be related to the … • Input data • Existence • Size • Format • Key Distribution (“Data Skew”) • C# code • C# expressions in a U-SQL Script • C# UDFs • Code in Libraries the script uses
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208. Developer Box VS Project ADLA Account Failed Job Visual Studio Failed vertex Visual Studio Failed vertex
  • 209. C# Project (Local Vertex Debug Project) Job Resources U-SQL Runtime Data Read by Vertex
  • 210. Case #1 Local Vertex Debug works GREAT and SEAMLESSLY Case #2 and Case #3 – Use the same techniques in these cases as for debugging a C# program We are going to make Case #2 easier in the future.
  • 211. You can Launch the Exception Settings window via • Keyboard Shortcut: Ctrl + Alt + E • Debug > Windows > Exception Settings • Search for “Exception Settings” in the VS Search box. Select the item under “Menus”
  • 212. If failed to read an input. • Do the inputs exist? • Do you have permissions to read the inputs? • Verify that the you can access the inputs from the portal. Did the U-SQL code ever work? If YES: • Provide a previous job link. • Examine the job diff If possible and depending on the issue, construct the smallest possible repro (script and dataset) that lets others examine the problem. Did a Vertex Fail because of User Code? Debug the vertex locally.
  • 213. GO THROUGH THE CHECKLIST FIRST Provide the .. • Job Link (job url) • Job Link to a previous run where the script worked • ADLA Account Name • Azure Region of the ADL Account • Top Level Error + inner errors • Error Codes • Error text IF POSSIBLE Depending on the issue, construct the smallest possible repro (script and dataset) that lets others examine the problem. IF WILLING • Attach the job graph as an image • Attach the script.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218. Allocating 10 AUs for a 10 minute job. Cost = 10 min * 10 AUs = 100 AU minutes Time Blue line: Allocated
  • 219. Consider using fewer AUs You are paying for the area under the blue line You are only using the area under the red line Time Blue line: Allocated Red line: Running Over Allocated != Bad
  • 220. Time Consider using more Aus “Under allocated” jobs are Efficient! Blue line: Allocated Red line: Running Under Allocated != Bad
  • 221. Allocation Efficiency = (Compute hours) / (AUs * duration) Example Job = 192.3 hours / (200 AUs * 1.1 hours) = 192.3 hours / 220 AUHours = 0.874 = 87.4% Efficiency very very good! Efficient != What you always want
  • 222. /catalog/…/tables/Guid(T)/ Guid(T.p1).ss Guid(T.p2).ss Guid(T.p3).ss TABLE T ( … INDEX i CLUSTERED BY (id) DISTRIBUTED BY HASH (key) INTO 4 PARTITIONED BY (date) ) LOGICAL PHYSICAL @date1 @date2 @date3 ID1 H1 ID1 H1 ID1 H1 ID2 ID2 ID3ID3 ID4 H2 ID4 H2 ID5 ID5 ID6 H3 ID6 H2ID6 H3 ID7 H4 ID7 ID8 ID7 ID9 ID8 Clustering ->Data Locality Partition -> Data lifecycle management. Partition elimination Distribution -> Data Locality + distribution elimination
  • 223. FB WH CNN Partition2 FB WH CNN Partition3 FB WH CNN Partition1 File: Keys (Domain) are scattered across the partitions Read Read Write Write Write Read Filter Filter Filter PARTITION 1 PARTITION 2 PARTITION 3 Because “CNN” could be anywhere, all extents must be read. @output = SELECT * FROM @clickstream WHERE domain == “CNN”;
  • 224. WH WH WH Partition2 CNN CNN CNN Partition3 FB FB FB Partition1 U-SQL Table partitioned on Domain Rows with the same keys are on the same partition. Read Write Filter PARTITION 1 PARTITION 2 PARTITION 3 Thanks to “Partition Elimination” and the U-SQL Table, the job only reads from the extent that is known to have the relevant key @output = SELECT * FROM @clickstream WHERE domain == “CNN”;
  • 225. @output = SELECT domain, SUM(clicks) AS total FROM @clickstream GROUP BY domain; Read Read Partition Partition Full Agg Write Full Agg Write Full Agg Write Read Partition Partial Agg Partial Agg Partial Agg PARTITION 1 PARTITION 2 PARTITION 3 Read Read Full Agg Full Agg Write Write Read Full Agg Write PARTITION 1 PARTITION 2 PARTITION 3
  • 226.
  • 227. SessionID Domain Clicks 3 cnn.com 9 1 whitehouse.gov 14 2 facebook.com 8 3 reddit.com 78 2 microsoft.com 1 1 facebook.com 5 3 microsoft.com 11
  • 228. FB WH CNN Extent 2 FB WH CNN Extent 3 FB WH CNN Extent 1 File: Keys (Domain) are scattered across the extents WH WH WH Extent 2 CNN CNN CNN Extent 3 FB FB FB Extent 1 U-SQL Table partitioned on Domain The keys are now physically in the same place on disk (extent)
  • 229. CREATE TABLE SampleDBTutorials.dbo.ClickData ( SessionId int, Domain string, Clinks int, INDEX idx1 //Name of index CLUSTERED (Domain) PARTITIONED BY HASH (Domain) ); INSERT INTO SampleDBTutorials.dbo.ClickData SELECT * FROM @clickdata;
  • 230. // Using a File @ClickData = SELECT Session int, Domain string, Clicks int FROM “/clickdata.tsv” USING Extractors.Tsv(); @rows = SELECT * FROM @ClickData WHERE Domain == “cnn.com”; OUTPUT @rows TO “/output.tsv” USING Outputters.tsv(); // Using a U-SQL Table partitioned by Domain @ClickData = SELECT * FROM MyDB.dbo.ClickData; @rows = SELECT * FROM @ClickData WHERE Domain == “cnn.com”; OUTPUT @rows TO “/output.tsv” USING Outputters.tsv();
  • 231. Read Read Write Write Write Read Filter Filter Filter CNN, FB, WH EXTENT 1 EXTENT 2 EXTENT 3 CNN, FB, WH CNN, FB, WH Because “CNN” could be anywhere, all extents must be read. Read Write Filter FB PARTITION 1 PARTITION 2 PARTITION 3 WH CNN Thanks to “Partition Elimination” and the U-SQL Table, the job only reads from the extent that is known to have the relevant key File U-SQL Table Partitioned by Domain
  • 232. @rows = SELECT Domain, SUM(Clicks) AS TotalClicks FROM @ClickData GROUP BY Domain;
  • 233. Read Read Partition Partition Full Agg Write Full Agg Write Full Agg Write Read Partition Partial Agg Partial Agg Partial Agg CNN, FB, WH EXTENT 1 EXTENT 2 EXTENT 3 CNN, FB, WH CNN, FB, WH U-SQL Table Partitioned by Domain Read Read Full Agg Full Agg Write Write Read Full Agg Write FB PARTITION 1 WH PARTITION 2 CNN PARTITION 3 Expensive!
  • 234. /catalog/…/tables/Guid(T)/ Guid(T.p1).ss Guid(T.p2).ss Guid(T.p3).ss TABLE T ( … INDEX i CLUSTERED (id) PARTITIONED BY (date) DISTRIBUTED BY HASH (key) INTO 4 ) LOGICAL PHYSICAL @date1 @date2 @date3 ID1 H1 ID1 H1 ID1 H1 ID2 ID2 ID3ID3 ID4 H2 ID4 H2 ID5 ID5 ID6 H3 ID6 H2ID6 H3 ID7 H4 ID7 ID8 ID7 ID9 ID8
  • 235. <><><><> <><><><> <><><><> <><><><> <><><><> <><><><> Extent 1 Region = “en-us” <><><><> <><><><> <><><><> <><><><> <><><><> <><><><> Extent 2 Region = “en-gb” <><><><> <><><><> <><><><> <><><><> <><><><> <><><><> Extent 3 Region = “en-fr”CREATE TABLE LogRecordsTable (UserId int, Start DateTime, Region string, INDEX idx CLUSTERED (Region ASC) PARTITIONED BY HASH (Region)); インサート時に、 “Region” カラムに基 づき、3つの範囲に 渡って ハッシュ分散される INSERT INTO LogRecordsTable SELECT UserId, Start, End, Region FROM @rs パーティションが 分かれている @rs = SELECT * FROM LogRecordsTable WHERE Region == “en-gb” 1 2 3
  • 236. Full agg Region ごとにクラスタ化されたテーブル Read Read Read Read Full agg Full agg Partial agg Partial agg Extent 1 Extent 2 Extent 3 Extent 4 Sort Sort Top 100 Top 100 Sort Top 100 Top 100 Read Read Read Read 非構造化データ Partial agg Partial agg Partial agg Partial agg Full agg Full agg Full agg Sort Sort Sort Top 100 Top 100 Top 100 Extent 1 Extent 2 Extent 3 Extent 4 Partition Partition Partition Partition @rs1 = SELECT Region, COUNT() AS Total FROM @rs GROUP BY Region; @rs2 = SELECT TOP 100 Region, Total FROM @rs1 ORDER BY Total; 高コストな処理
  • 238. 0 5,000,000 10,000,000 15,000,000 20,000,000 25,000,000 30,000,000 35,000,000 40,000,000 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 Population by State
  • 239. U-SQL Table partitioned on Domain Relatively even distribution Partition 2 Partition 3 WH CNNFB Partition 1 U-SQL Table partitioned on Domain Skewed Distribution Partition 2 Partition 1 WH CNNFB Partition 1
  • 240.
  • 241. @rows = SELECT Gender, AGG<MyAgg>(Income) AS Result FROM @HugeInput GROUP BY Gender;
  • 242. 大量の 入力 Vertex 0 Vertex 1 性別=男 性別=女
  • 243.
  • 244.
  • 245.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251. 1 2 3 4 5 6 7 8 36 全ての行は一つのVertexへ
  • 252. 1 2 3 6 4 5 6 7 8 36 15 15 データは複数のVertexに送ることができる
  • 253. // THIS CODE IS SCOPE -> NEEDS TO BE UPDATED TO U-SQL public class SampleNonRecursiveReducer: Reducer { public override bool IsRecursive { get { return true; } } public override Schema Produces(string[] columns, string[] args, Schema input) { … } public override IEnumerable<Row> Reduce(RowSet input, Row output, string[] args) { … } } #ENDCS
  • 254. Distributed data reduction SELECT Gender, SUM(…) AS Result FROM HugeInput GROUP BY Gender; This job will succeeded even if the input is huge. • But not all Reducers Can be recursive − Median − Percentile
  • 255.
  • 256.
  • 257. ジョブの進捗の 表示や再実行 クエリ パフォーマンスの チューニング U-SQL クエリの 実行プランの表示 メタデータ カタログの 参照 U-SQL スクリプト (C# コード)の 作成 メタデータ オブジェクトの 作成 U-SQL ジョブの サブミットと キャンセル U-SQL と C# コードの デバッグ
  • 260. • ADL Analytics はメタデータ・オブジェクトを作成し、メタデータ サービスに よって維持されるカタログに保存 • DDL ステートメントによって作成されるテーブルや TVF (CREATE TABLE …) • メタデータ オブジェクトは Server Explorer で直接作成可能 Azure Data Lake Analytics アカウント • データベース – テーブル – Table valued functions – ジョブ – スキーマ • Linked storage
  • 261. ADLA Account/Catalog Database Schema [1,n] [1,n] [0,n] tables views TVFs Clustered Index partitions C# Assemblies C# Extractors Data Source C# Reducers C# Processors C# Combiners C# Outputters Ext. tables Procedures Credentials C# Applier Table Types Statistics C# Fns C# UDAggC# UDTs
  • 262. Visual Studio の Server Explorer でメタデータ カタログが閲覧可能 Server Explorer で可能: 1. テーブル、スキーマ、データ ベースの作成 2. アセンブリの登録
  • 263. © 2016 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.