Contenu connexe
Similaire à DeltaCubeにおけるユニークユーザー集計高速化(理論編) (20)
Plus de BrainPad Inc. (20)
DeltaCubeにおけるユニークユーザー集計高速化(理論編)
- 3. Copyright © BrainPad Inc. All Rights Reserved. 3
DMPのセグメント作成に特化したデータマネジメントツール
プライベートDMP 「Rtoaster」とシームレスに連携可能
Rtoasterの様々なデータを組み合わせて新たなセグメントを高速に作成することが可能
作成したセグメントのユーザー数をスピーディーに確認可能
DeltaCube(デルタキューブ)とは
プライベートDMP
外部DSP外部DSPCRMデータ
サイト デジタル広告 メールアプリ
新規セグメントデータ
行動データ、
セグメントデータ等
DeltaCube で作成したセグメントに
最適なアクションを実施!
外部DSP外部DSPパブリックDMP
Yahoo! DMP 等
会員属性等
直感的にセグメントを作成!
- 4. Copyright © BrainPad Inc. All Rights Reserved.
セグメント作成機能
– DMPに蓄積されたデータ(行動データ、CRMデータ、外部データ、
セグメントデータ等)を元に、ユーザー数を確認しながら直感的な
操作でセグメントを作成することが可能
– 作成したセグメント同士を掛け合わせ可能
クラスタリング機能
– これまでの弊社データ分析の知見を活かし、DMPに蓄積されたデータ
を用いた自動クラスタリング機能
– 類似ユーザー同士を自動分類してセグメントを作成
– 自動作成された各セグメントの特徴(どのようなユーザーが含まれる
か)を推定して表示
– サイト全体のユーザー像を把握可能
4
DeltaCubeの主な機能
今回はこちらのユーザー数を確認
する機能の高速化についてのお話
- 5. Copyright © BrainPad Inc. All Rights Reserved.
DeltaCubeは、蓄積されたデータ(Webサイトのトラッキングログ等)
を元に、ユーザーのセグメントを作成するツール
– 様々な条件設定が可能
• 集計期間、閲覧URL、デバイスなど
結果を確認しながら、ストレスなくセグメントを作成するには、設定し
た条件に一致するユニークユーザーの数を高速に確認したい
– しかし、集計対象のデータは膨大で厳密に集計していては遅い
• Webサイトの全てのユーザーのサイト内での全ての行動ログなど
• 1日で数百~数百万ユーザーの全てのログが出てくる
• これをDeltaCubeでは最大180日間までの期間で集計可能
– 1人単位まで厳密に出す必要はなく、ボリューム感がわかれば良い
• 推定値で良い
5
ユニークユーザー数確認機能
- 6. Copyright © BrainPad Inc. All Rights Reserved.
DeltaCubeではPrestoという分散処理ミドルウェアを集計に利用
– Prestoを用いて厳密に集計を行っている
– これを概算値でよいので高速化したい
6
ユニークユーザー数確認機能の高速化
この数値を
高速に求め
たい!
DeltaCubeセグメント作成時の例
- 8. Copyright © BrainPad Inc. All Rights Reserved.
2013/11/06に米FacebookがOSSとして公開。
公式ドキュメント(https://prestodb.io/docs/current/index.html)によると、
“Presto is a distributed SQL query engine designed to query
large data sets distributed over one or more heterogeneous
data sources.”
そのまま訳すと「1つ以上のデータソースに分散した大規模なデータセット
に対してクエリを実行するために設計された分散SQLクエリエンジン」。
特徴
全てのデータをインメモリで処理するため、レスポンスが非常に速い
個々のタスクを並列で処理させるため、高速
オンラインからのアドホックな参照クエリに向いている
複数のデータソースに対して一度に集計を実行可能
8
Prestoとは
- 9. Copyright © BrainPad Inc. All Rights Reserved.
「SQLクエリエンジン」とあるように、SQLクエリを投げられる
例えば、t_log_dataテーブルにWebページのトラッキングを格納して
いたとする
– uid列にユーザーを識別するためのユーザーIDが入っている
– 当然他のデータが入る列が存在している
ここでユニークユーザー数(以降、UU数)を数えるには、以下の様な
クエリを実行する
Prestoでは、COUNT(DISTINCT x)の推定値を返す関数がある
– approx_distinctといい、推定であるため高速に動作する
9
Prestoでユニークユーザ集計
SELECT
COUNT(DISTINCT uid)
FROM
t_log_data
WHERE
(絞り込みたい条件)
;
uid datetime site page ・・・ agent
Uid1 2016-06-08
12:00:00
www.brainpad.co.jp /top ・・・ PC
Uid2 ・・・ ・・・ ・・ ・・・ ・・・
Uid1 ・・・ ・・・ ・・ ・・・ ・・・
t_log_dataテーブルのイメージ
- 11. Copyright © BrainPad Inc. All Rights Reserved.
https://prestodb.io/docs/current/functions/aggregate.html
Prestoに用意されている(概算)集計関数の一つで、入力データxの
cardinality(カーディナリティ、異なり数、濃度)の推定値を返す関数
– つまり、「COUNT(DISTINCT x)」の推定値を返す関数
使用例
– 使い方は簡単
11
approx_distinctとは(1)
SELECT
COUNT(DISTINCT uid)
FROM
t_log_data
WHERE
(絞り込みたい条件)
;
SELECT
approx_distinct(uid)
FROM
t_log_data
WHERE
(絞り込みたい条件)
;
厳密に
集計
概算で
集計
- 12. Copyright © BrainPad Inc. All Rights Reserved.
標準誤差((おそらく正規)誤差分布の標準偏差)2.3%で値を返す
– ただし、これは全ての入力に対して誤差の上限を与えるものではない
「approx_distinct(x, e)」のようにして利用することも可能
– この場合、標準誤差がeを超えないように推定を行う
– ただし、これも誤差の上限を与えるものではない
– 0.01150 ≤ e ≤ 0.26000で与える必要がある(2016/06/10現在)
内部ではHyperLogLogと呼ばれるアルゴリズムが利用されている
– HyperLogLogやそのPrestoでの実装など、詳細については後述
12
approx_distinctとは(2)
- 14. Copyright © BrainPad Inc. All Rights Reserved.
(元論文)
Philippe Flajolet, Éric Fusy, Oliver Gandouet and Frederic Meunier,
HyperLogLog: the analysis of a near-optimal cardinality estimation
algorithm, 2007.
http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf
データのcardinalityを推定するアルゴリズム
近最適(near-optimal)な確率的アルゴリズム
大規模なデータに対して高速かつ省メモリで実行可能
Webサイトのトラッキングログなどを元に、UU数推定に利用可能
Base-2 RankというMinHashの手法の1つを利用している
– MinHashやBase-2 Rankについては、以下の資料がわかりやすい
– http://www.slideshare.net/iwiwi/minhash
– http://recruit.gmo.jp/engineer/jisedai/blog/redis_fast_countin
g/
14
HyperLogLogとは
- 15. Copyright © BrainPad Inc. All Rights Reserved.
ユーザーを識別する値(ユーザーID等)を2進数にハッシュ化するハッ
シュ関数を用意しておく
– ハッシュ値の各ビットは独立であるとする
全データをハッシュ化する
– 各ハッシュ値において、先頭に0が連続する個数を数える
– これが最も多かったときの、連続した0の個数を𝑝として記録しておく
データに含まれるUU数は𝟐 𝒑と推定する
– なぜ?
– ハッシュ値の各ビットが独立であるとすると、各ビットで0が出る確
率は
1
2
であり(1が出る確率と半々)、0が𝑝個連続する確率は
1
2 𝑝
– つまり、実際に0が𝑝個連続する(確率
1
2 𝑝で出てくる)ようなデータ
(ユーザー)が存在したので、元となるデータには2 𝑝種類のデータが
含まれていたであろうと推定する
15
HyperLogLogの基礎
実際には、ハッシュ関数1つでは乱暴
- 16. Copyright © BrainPad Inc. All Rights Reserved.
下記元論文のFig. 2参照
– http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf
HyperLogLogの一般的なアルゴリズム(1)
16
- 17. Copyright © BrainPad Inc. All Rights Reserved.
定義
– 集合𝐷の要素を2進数(無限長)にハッシュ化する関数をℎと定義する
(ℎ: 𝐷 → 0, 1 ≡ {0, 1}∞)
– 2進数𝑠 ∈ {0, 1}∞
を与えるとその左から数えて最初に1が出るビットの
位置を返す関数を𝜌と定義する
• 例:𝜌 0001 … = 4
入力データ
– 入力として集合𝐷に含まれる要素の多重集合Mを与える
• 例:サイトのログに出てくるユーザーID列の値(重複あり)
仮定と初期化
– 𝑚 = 2 𝑏となるような𝑚を決定する(ただし𝑏 は任意の整数)
– 𝑚個のレジスタ( 𝑀 1 , 𝑀 2 , … , 𝑀[𝑚] )を−∞に初期化しておく
17
HyperLogLogの一般的なアルゴリズム(2)
「ハッシュ関
数が1つでは
乱暴」と言っ
ていた件につ
いての工夫。
でもハッシュ
関数は1つ?
最も長く続いた0の数を記録しておくもの
- 18. Copyright © BrainPad Inc. All Rights Reserved.
集合Mに含まれる要素𝒗 ∈ Mについて、以下の手順を繰り返す
– 𝑣をハッシュ化した値を𝑥とおく(𝑥 ≔ ℎ(𝑣))
– 𝑥の左から𝑏ビット目までに1を加えた値を𝑗とおく
( 𝑗 = 1+ < 𝑥1 𝑥2 … 𝑥 𝑏 >2 )
– 𝑥の左から𝑏ビット目までを除いた2進数を𝑤とおく
( 𝑤 ≔ 𝑥 𝑏+1 𝑥 𝑏+2 …)
– 𝜌(𝑤)が𝑀[𝑗]より大きければ𝑀[𝑗]の値を𝜌(𝑤)に更新
(𝑀 𝑗 ≔ max(𝑀 𝑗 , 𝜌 𝑤 ) )
indicator functionを計算する
– 𝑍 ≔ 𝑗=1
𝑚
2−𝑀[𝑗] −1
M のCardinalityの推定値を計算する
– 𝐸 ≔ 𝛼 𝑚 𝑚2 𝑍
– 𝛼 𝑚 ≔ 𝑚 0
∞
(log2(
2+𝑢
1+𝑢
)) 𝑚 𝑑𝑢
−1
HyperLogLogの一般的なアルゴリズム(3)
ハッシュ関数は1つ
だが、bビット目ま
でのハッシュ値を
レジスタの決定に
用いる。 つまり擬
似的に後半のビッ
ト列が別のハッ
シュ関数によって
出た値と考える。
※ここから具体的な推定値計算に入る
レジスタごとに出た推定
値の平均を取りたいが、
指数になっているため単
純な平均ではなく、
normalized bias
corrected harmonic
meanをとっている。
18
- 19. Copyright © BrainPad Inc. All Rights Reserved.
元論文のFig. 3参照
– http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf
cardinalityが 𝟎. . 𝟏𝟎 𝟗 の範囲の場合の実用的なアルゴリズムと
パラメータ(𝒎)が載っている
一般的アルゴリズム(前述)との相違点を次スライド以降に記載
19
HyperLogLogの実用的なアルゴリズム(1)
- 20. Copyright © BrainPad Inc. All Rights Reserved.
𝒎の値とその際の𝜶 𝒎の値
– 𝛼16 = 0.673
– 𝛼32 = 0.697
– 𝛼64 = 0.709
– 𝛼 𝑚 = 0.7213/(1 + 1.079/𝑚) 𝑓𝑜𝑟 𝑚 ≥ 128
ハッシュ値は32ビットの2進数
– 元は無限長
レジスタの初期値は0
– 元は−∞
20
HyperLogLogの実用的なアルゴリズム(2)
各レジスタに保存する整数
の範囲は 0. . L + 1 − log2 𝑚
となる(ここでは 𝐿 = 32 )。
つまり各レジスタでメモリ
は5ビットもあれば十分。
よって全体でもメモリは5𝑚
ビットあれば足りる。
驚きの省メモリ!
- 21. Copyright © BrainPad Inc. All Rights Reserved.
推定値(𝑬)に対して補正をかけて最終的な推定値(𝑬∗)とする
– 𝐸 ≤
5
2
𝑚の場合(ただし𝑚 ≥ 16)
• もしレジスタの値が0であるようなレジスタの数(𝑉)が0でない場合
– 𝐸∗
≔ 𝑚 log(𝑚/𝑉)
• そうでない場合
– 𝐸∗
≔ 𝐸
–
5
2
𝑚 ≤ 𝐸 ≤
1
30
232の場合
• 𝐸∗ ≔ 𝐸
– 𝐸 ≥
1
30
232の場合
• 𝐸∗ ≔ −232 log(1 − 𝐸/232)
標準誤差は
𝟏.𝟎𝟒
𝒎
– cardinalityが極大化すれば
21
HyperLogLogの実用的なアルゴリズム(3)
Hit Counting(Linear Counting)と呼ばれる
アルゴリズム。
Kyu-young Whang, Brad T. Vander-zanden
and Howard M. Taylor, A Linear-Time
Probabilistic Counting Algorithm for Database
Applications, 1990.
http://dblab.kaist.ac.kr/Prof/pdf/Whang199
0%28linear%29.pdf
• 𝑚個の入れ物に𝑛個の球を投げて、球が
一つも入らない入れ物の数は𝑚𝑒−𝜇
個
• つまり𝜇 ≔
𝑛
𝑚
• 空の入れ物の数を𝑉とおけば、
𝑛 = 𝑚 log(𝑚/𝑉)と推定できる
- 22. Copyright © BrainPad Inc. All Rights Reserved.
誤差をさらに小さくするための手法がいくつか考案されている
– 閾値を設定し、途中でアルゴリズムを切り替える
• Stefan Heule, Marc Nunkesser, Alexander Hall , HyperLogLog in
Practice: Algorithmic Engineering of a State of The Art Cardinality
Estimation Algorithm, 2013.
• https://stefanheule.com/papers/edbt13-hyperloglog.pdf
– 事前に推定値補正用のテーブルを作成しておく
• 同上
• https://docs.google.com/document/d/1gyjfMHy43U9OWBXxfaeG-
3MjGzejW1dlpyMwEYAAWEI/view?fullscreen
– ハッシュ値が最小のものだけを用いるのではなく、計算過程で出てき
たものも利用する
(そのときそのようなハッシュ値が出る確率を考慮)
• Edith Cohen, All-Distances Sketches, Revisited: HIP Estimators for
Massive Graphs Analysis, 2014.
• http://arxiv.org/pdf/1306.3284.pdf
22
HyperLogLogの改善
- 24. Copyright © BrainPad Inc. All Rights Reserved. 24
approx_distinctはHyperLogLogを利用
approx_distinctでは
HyperLogLogが利用されている
– https://github.com/prestodb/p
resto/blob/master/presto-
main/src/main/java/com/face
book/presto/operator/aggregat
ion/ApproximateCountDistinctA
ggregations.java
– ソースコードにそのまま
HyperLogLogという名前がある
• 内部ではAirliftというパッケージ
を利用
• Airlift : RESTサービスを構築する
ためのフレームワーク
- 25. Copyright © BrainPad Inc. All Rights Reserved.
https://github.com/airlift/airlift/blob/master/stats/docs/hl
l.md
ハッシュ関数はMurmurHash3-128bit
– 衝突困難性、一様性、計算コストに優れている
– 実際に利用するのは128ビットではなく64ビットもしくは26ビット
LinearCounting用のメソッドも準備
– https://github.com/airlift/airlift/blob/master/stats/src/main/ja
va/io/airlift/stats/cardinality/Utils.java
推定値補正用のテーブルも準備
– https://github.com/airlift/airlift/blob/master/stats/src/main/ja
va/io/airlift/stats/cardinality/BiasCorrection.java
25
AirliftにおけるHyperLogLogの実装
- 27. Copyright © BrainPad Inc. All Rights Reserved.
Philippe Flajolet, Éric Fusy, Oliver Gandouet and Frederic Meunier,
HyperLogLog: the analysis of a near-optimal cardinality estimation
algorithm, 2007.
– http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf
Stefan Heule, Marc Nunkesser, Alexander Hall , HyperLogLog in Practice:
Algorithmic Engineering of a State of The Art Cardinality Estimation Algorithm,
2013.
– https://stefanheule.com/papers/edbt13-hyperloglog.pdf
Edith Cohen, All-Distances Sketches, Revisited: HIP Estimators for Massive Graphs
Analysis, 2014.
– http://arxiv.org/pdf/1306.3284.pdf
Kyu-young Whang, Brad T. Vander-zanden and Howard M. Taylor, A Linear-Time
Probabilistic Counting Algorithm for Database Applications, 1990.
– http://dblab.kaist.ac.kr/Prof/pdf/Whang1990%28linear%29.pdf
RedisのBitCountとHyperLogLogを使用した超高速Unique User数集計
– http://recruit.gmo.jp/engineer/jisedai/blog/redis_fast_counting/
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
– http://www.slideshare.net/iwiwi/minhash
27
参考文献
- 28. Copyright © BrainPad Inc. All Rights Reserved.
株式会社ブレインパッド
〒108-0071 東京都港区白金台3-2-10 白金台ビル3F
TEL:03-6721-7001
FAX:03-6721-7010
info@brainpad.co.jp
Copyright © BrainPad Inc. All Rights Reserved.
www.brainpad.co.jp