Top Banner
1 Log にまつわるエトセトラ 2014.8.28@ ヒカラボ 菊池佑太
84

ログにまつわるエトセトラ

Dec 19, 2014

Download

Science

Yuta Kikuchi

2014.8.28@ヒカラボ 菊池佑太
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: ログにまつわるエトセトラ

1

Log にまつわるエトセトラ

2014.8.28@ ヒカラボ 菊池佑太

Page 2: ログにまつわるエトセトラ

2

話しません (´;ω; ` )● GrowthHack

✔ Retention/ConversionUP 施策✔ A/B テストによる UI 改善

● 可視化✔ BI ツール

Page 3: ログにまつわるエトセトラ

3

Log 集計 / 解析必要な事

Page 4: ログにまつわるエトセトラ

4

Web サービス Log広告 Log

Page 5: ログにまつわるエトセトラ

5

Page View (PV)Impression (Imps)Click (CTs)Conversion (CV)

Page 6: ログにまつわるエトセトラ

6

アジェンダ0. 自己紹介1. Log を記録する2. Log を集める3. Log を集計する4. Log を解析する5. 質疑応答

Page 7: ログにまつわるエトセトラ

7

自己紹介● 菊池佑太 @yutakikuc

● EX. Yahoo! AD-Science

● 旅行で世界30都市制覇!

● 陸サーファー、時々サーファー

● http://d.hatena.ne.jp/yutakikuchi

Page 8: ログにまつわるエトセトラ

8

ワイハーのお土産あるお!

Page 9: ログにまつわるエトセトラ

9

経験のあるテクノロジー

Page 10: ログにまつわるエトセトラ

10

仕事内容

開発 20%

研究 10%

データ出し 10%ログ調査 60%

開発

研究

データ出し

ログ調査

雑用がメイン( キリッ

Page 11: ログにまつわるエトセトラ

11

解決しなければならない大きな問題

Page 12: ログにまつわるエトセトラ

12

Log や Data を軽視する人              /)           ///)          / ,.= ゙ ''" /    /     i f   ,.r='"-‐' つ_   /       /     _,.-‐'~ /⌒  ⌒\    /    ,i     , 二ニ⊃( ●) .  (●)\    /     ノ    il ゙フ ::::::⌒ ( __ 人 __ )⌒ ::::: \       , イ「ト、   ,!,!|       |r┬-|       |      /   i トヾヽ _/ ィ " \      ` ー '´     /

Log はどうでもいいんだよ !!

Page 13: ログにまつわるエトセトラ

13

Log や Data 取得が後回しにされる理由● サービスの開発が最優先、 Log は無くても動く

● LogSystem の開発は簡単という誤解 ( 怒 )

● UserData を取得すると User の入力負荷が高くなる

● Data 分析方法が分からない

Page 14: ログにまつわるエトセトラ

14

Log エンジニアの現場人数

アプリエンジニアの

1/20

Page 15: ログにまつわるエトセトラ

15

Page 16: ログにまつわるエトセトラ

16

理解して欲しいこと

Log の重要性

Page 17: ログにまつわるエトセトラ

17

アジェンダ0. 自己紹介1. Log を記録する2. Log を集める3. Log を集計する4. Log を解析する5. 質疑応答

Page 18: ログにまつわるエトセトラ

18

Log の記録目的 ( 冗談 )

元気があれば何でもできる!Log があれば何でも分かる!

Page 19: ログにまつわるエトセトラ

19

Log の記録目的 (真面目 )

Log ≒ EvidenceLog ⇒ Next Strategy

Page 20: ログにまつわるエトセトラ

20

大事な事なので 2度言います

Log 分析はサービス戦略に繋がる

Page 21: ログにまつわるエトセトラ

21

Log の記録で重要な事

3W1H (When,Who,What,How)

Log だけで情報が揃うように

Page 22: ログにまつわるエトセトラ

22

Log の種類と記録項目● AccessLog

✔ RequestTime(When), RequestURI(What), Referer(How)✔ AccessIP, UA✔ ResponseTime, Status✔ Cookie(Who)

✔ BrowserID✔ UserID✔ UserAttribute

✔ DeviceID(Who)

Page 23: ログにまつわるエトセトラ

23

ServerLog の種類と記録項目● ErrorLog

✔ RequestTime, RequestURI, UA, Cookie✔ ErrorLevel, ErrorFile&Line, ErrorComment

● ApplicationLog✔ Application が特定の状況下で記録する Log

Page 24: ログにまつわるエトセトラ

24

BrowserIDUserID/Attribute

超重要

Page 25: ログにまつわるエトセトラ

25

何が重要なの?( 後で! )

Page 26: ログにまつわるエトセトラ

26

「mod_oreore」による BrowserID 発行

● Serverへの初回アクセス時に Cookie を発行する● ApacheModule だから Application の実装が不要● mod_usertrack,mod_session_cookie の不足点をカバー● https://github.com/yutakikuchi/apache_module.git● 30秒で設定可能

Page 27: ログにまつわるエトセトラ

27

UserID/Attribute の記録

● UserID/Attribute は Login をした段階で Cookie に付与(Application のレイヤーで実装 )

● Hacking されないように変換や暗号化

Page 28: ログにまつわるエトセトラ

28

Cookie を Log に落とす

Page 29: ログにまつわるエトセトラ

29

Log に落とす Cookie の例oreore_cookie:id=MTkyLjE2OC41Ni4xMDE0MDkxMTk2ODQwMzg3MTMyMDE2NTQyNzI1MDMzMTY0OA..&attr=Mjg0ZmUyMzk0Yzg0ZGIzZTIzYTI3N2ExYzhmYTZmMGY3Mzk1MjM4Ng..

● id : TimeStamp + LocalIP + ProcessNum + ConnectionNum● attr: UserID + Gender + Age をAES-CBCで暗号化

Page 30: ログにまつわるエトセトラ

30

LogFormat● Default(Apache)

::1 - - [08/Feb/2014:21:32:10 +0900] "GET / HTTP/1.1" 403 5039 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

● Labeled Tab-Separated Values(LTSV)host:::1<Tab>ident:-<Tab>user:-<Tab>time:[08/Feb/2014:21:32:10 +0900]<Tab>Request:GET / HTTP/1.1<Tab>status: 403 <Tab>size:5039<Tab>referer:-<Tab>agent:curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2

● ControllCharcter Separeted Valueshost<^B>::1<^A>ident<^B>-<^A>user<^B>-<^A>time<^B>[08/Feb/2014:21:32:10 +0900]<^A>Request<^B>GET / HTTP/1.1<^A>status<^B> 403 <^A>size<^B>5039<^A>referer<^B>-<^A>agent<^B>curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2

Page 31: ログにまつわるエトセトラ

31

どの Format が良いか?● Log項目の付け足し /削除は後から必ず発生する

● 付け足しが発生しても Parse 後の順番依存が無い事

● 人目で見ても項目と値が分かり易い

LTSVFormat がお勧め

Page 32: ログにまつわるエトセトラ

32

LogServer構成

Page 33: ログにまつわるエトセトラ

33

PV, Imps, CTs, CVLog

⑤Staus:302Location:Url

①Request       

          ②HTML,BeaconURL

③BeaconRequest

④Click⑥Buy

⑦HTML,BeaconURL

⑧ConversionRequest

WebServer PV/ImpBeacon

ClickRedirector広告主 Server

ConversionBeacon

Page 34: ログにまつわるエトセトラ

34

CTs と CVLog少し詳しく

Page 35: ログにまつわるエトセトラ

35

Click情報

どこに掲載したらClick されたのか

Page 36: ログにまつわるエトセトラ

36

導入したClick検知方法● 外部Domainへの遷移検知には Redirector を入れる● Log にどのページのどのリンクが押されたのか記録する

✔ 予約Parameter(?__uri=hoo&__link=bar_1)✔ Click 計測用 Cookie(ClickCookie:__uri=hoo&__link=bar_1)✔ ※Referer は送信しないブラウザがあるので注意

● 識別子の付与は Javascript:Onclick() で出来ると吉● 集計処理で Parameter の値を CountUP● 識別子の管理が FE と BI ツールで共有が必要 ( 改善ポイント )

Page 37: ログにまつわるエトセトラ

37

Click検知の失敗点

アプリエンジニアの実装にミスが発生する!

CTR 集計結果に影響が出る!!

戦略チームから @yutakikuc が怒られる!!!

@yutakikuc がアクセスログから実装ミスをカバーする!!!!

Page 38: ログにまつわるエトセトラ

38

CVLog に必要な事● (外部 ) サイトに検知用 Beaconタグを埋め込んでもらう

● Log にどのサイトでどのような CV が発生したのか記録する- Parameter で表現する(例 )<img src='http://cbeacon.hikalab.com?siteid=25&productid=13&actionid=2&sign=hikalabo0828' />

● BrowserID等の Cookie は当然記録する

Page 39: ログにまつわるエトセトラ

39

CVLog の活用

● User の購入プロセスの状況把握

● 購入済み商品は Recommend の対象外

● 類似商品の Recommend

● 同じような行動履歴の Userへの Recommend

Page 40: ログにまつわるエトセトラ

40

「 Log を記録する」まとめ

●Log 分析は戦略に繋がる

●BrowserID,User,Attribute の記録●LTSV Format●CTs,CVLog の記録

Page 41: ログにまつわるエトセトラ

41

アジェンダ0. 自己紹介1. Log を記録する2. Log を集める3. Log を集計する4. Log を解析する5. 質疑応答

Page 42: ログにまつわるエトセトラ

42

Log の管理構成

RealTime or Batch ?Push or Pull ?

IP Restriction

WebServer①

WebServer②

BeaconServer

Redirector

LogAggregator

MongoDB

FS

Redis

Batch Mysql

LogFile Reference

Save Result

Page 43: ログにまつわるエトセトラ

43

RealTime or BatchPush or Pull

● RealTime(Fluentd,Storm)✔ 即時集計 / 解析✔ 一度の転送量を抑える✗ Batch と比較して転送 / 解析の技術

ハードルが高い

● Batch(Rsyslog,[RD]sync)✔ 定期集計 / 解析✔ 安定した集計✗ 一度の転送量が多くなる

● Push(Fluentd,[RD]Sync)✔ 送信元Server が Log転送する✔ Log を出力 =>転送が自然な流れ✗ 送信元Server の負荷が心配

● Pull(Rsyslog,Storm,[RD]Sync)✔ 受信元ServerLog が Log を回収する✔ メインの設定が受信元Server で出来

る✔ 送信元Server の負荷は軽減 ?✗ 実装 /設定が面倒

Page 44: ログにまつわるエトセトラ

44

RealTime Log転送で気をつけたい事● 処理が詰まらないように (Server 性能の限界を確認しておこう )

● 転送完了したファイル名と Line 数を記録する

● HotStandy の用意

● Batch に切り替える手段を用意

● 小規模かつ重要でない Log から導入テストしてみるとか

Page 45: ログにまつわるエトセトラ

45

Batch Log転送で気をつけたい事● Rotate処理と転送処理の時間が重なった時の取りこぼし※ チェックサムの確認

● 転送時間が大きくならない事※ 複数のデータセンターへの転送

● 冗長化サーバー毎に転送開始時間をづらす

● ファイルの圧縮

Page 46: ログにまつわるエトセトラ

46

広告配信での実例Imps: 500,000 、 Clicks: 2000 、 Log 容量: 200M

Page 47: ログにまつわるエトセトラ

47

集計の土台

安定したPull型Batch※Batch は 1日 1 回

広告主への正確なレポート提出のためRsync + FuelPHP Task

Page 48: ログにまつわるエトセトラ

48

+αImps,CTs は Push型

RealTime 集計を準備中※Imps保証数を必要以上に超過させない

RealTime でのリターゲティングFluentd + fuent-plugin-redis

Page 49: ログにまつわるエトセトラ

49

最小構成でも

トラフィック問題は発生せず ... or2

Page 50: ログにまつわるエトセトラ

50

冗長化対応での問題

回収先サーバーの追加設定漏れ

Page 51: ログにまつわるエトセトラ

51

「 Log を集める」まとめ

●回収方法の特性を理解●集計の土台は Pull型Batch で安定稼働●配信制御に関わる事は極力 RealTime で

Page 52: ログにまつわるエトセトラ

52

アジェンダ0. 自己紹介1. Log を記録する2. Log を集める3. Log を集計する4. Log を解析する5. 質疑応答

Page 53: ログにまつわるエトセトラ

53

KPI / KGI

Page 54: ログにまつわるエトセトラ

54

原始的な集計

cut -f 2 log.txt | sort | uniq | wc -l

Page 55: ログにまつわるエトセトラ

55

強力なツール

※要件が合えば利用

Page 56: ログにまつわるエトセトラ

56

強力ツールで出来ない事●ページ内コンテンツの配信数

● Browser毎の履歴集計

● 無料では出来る事が限られる

●長期的なログ蓄積には不向き

Page 57: ログにまつわるエトセトラ

57

GoogleAnalytics(GA) と RequestLog の違い

GA RequestLog0

200000

400000

600000

800000

1000000

1200000

1400000

1000000

1200000

300000250000

PVUser

✔ RequestLog の PV値は GA の 120%程✔ RequestLog の User値は GA の 70%程✔ CSC と SSC : 表示数と Request 数の違い✔ GA 集計は BlackBox✔ 通信 Error, noscript, 非対応機種 ...✔ GoogleCookie と独自 Cookie の付与状況

Page 58: ログにまつわるエトセトラ

58

独自集計

ツールとの棲み分け緊急性と重要度の判定

Page 59: ログにまつわるエトセトラ

59

緊急性と重要度データの種類 データの項目 緊急性 重要度 格納先

広告 Imps速報 高 中 Redis

広告 CTs速報 高 中 Redis

広告 効果レポート 低 高 Mysql

サービス PV 低 高 Mysql

サービス CTR 低 高 Mysql

サービス PV / UU / UB 低 高 Mysql

全て 生ログ 低 高 FS

全て 準生ログ 高 中 MongoDB

Page 60: ログにまつわるエトセトラ

60

Mysql は安定している心配なのは Write速度

Page 61: ログにまつわるエトセトラ

61

Mysql Table設計● テーブル設計 = 集計する項目の決定

● Relationは作らない– 冗長的な登録は許容

●古いデータは消す事が前提– 日付のPartitioningでparge

●複雑な処理は多段集計– 1次集計Table、2次集計Table

Page 62: ログにまつわるエトセトラ

62

Mysql への Write● Batch処理

✔ Batch でOnMemory(連想配列 ) に集計結果を乗せてから BulkInsert✔ Hadoop で集計し Sqoop で結果を Import

● RealTime処理✔ RunTime でMongoDBへ格納。MogoDB のデータを Batch で集計

し、Mysqlへ格納✔ Mysql の BlackHoleEngine を利用。実体を Slave に✔ 特定行数を一度Queue/Summary して、 BulkInsert

Page 63: ログにまつわるエトセトラ

63

Redis の利用● データ管理をMemory と Storage の両方で旨くこなす凄い奴

● 大量データの INSERT/SELECT もMysql より高速

● Memory と Storage の両方から消えた場合が大変

● 広告の RealTime の Imps 制御で利用✔ 超過 Imps は極力発生させたく無い✔ RealTime で広告 ID と Imps した回数を書き込む✔ 保険として Batch でも整合性を確認

Page 64: ログにまつわるエトセトラ

64

MongoDB の利用● スキーマ定義が不要でカラム追加の運用も要らない

● 大量データのInsertがMysqlより速い(SELECTは同等)

● Index, Sharding等の機能もある

●fnd条件指定が簡単でCross集計も可能(例 . Android×LoginしているUB数)

●準生ログを保存(BIツールからのみ参照させる)

●データが消えるという事例報告がある

Page 65: ログにまつわるエトセトラ

65

Performance担保への最終手段

サンプリング集計※広告は除く

Page 66: ログにまつわるエトセトラ

66

「 Log を集計する」まとめ

●集計の緊急度と重要度で集計方法を変える●Mysql の INSERT速度が心配●MongoDB や Redis も導入すると良い

Page 67: ログにまつわるエトセトラ

67

アジェンダ0. 自己紹介1. Log を記録する2. Log を集める3. Log を集計する4. Log を分析する5. 質疑応答

Page 68: ログにまつわるエトセトラ

68

BrowserIDUserID/Attribute

超重要

Page 69: ログにまつわるエトセトラ

69

何が重要なの?

Page 70: ログにまつわるエトセトラ

70

その① 行動履歴の集約

識別子を key に sort で纏める行動素性の抽出

MapReduce との相性

Page 71: ログにまつわるエトセトラ

71

その② 分類済み正解データからの推定BrowserID : 1

UserID : A女性× 20代

BrowserID : 2UserID : ?女性 ? 20代 ?

@cosmezexy.net

@cosmezexy.net

Page 72: ログにまつわるエトセトラ

72

その③ User×デバイスデータ取得可能1 人で複数台利用

(1 つの UserID での紐付け )複数人で 1台を利用

(複数の UserID での紐付け )

※分析データから除外する

Page 73: ログにまつわるエトセトラ

73

性別推定

Page 74: ログにまつわるエトセトラ

74

性別推定● Userの性別に対してコンテンツや広告をtargetingしたい

● 性別が取れるUserは20%以下。※Login必須サイトで無い場合

● 2値分類 (random推定でも50%)

● 仕組みが単純で高精度が望ましい

●精度とカバー率の塩梅

Page 75: ログにまつわるエトセトラ

75

条件付き確率●推定手法の一例その他決定木やVectorでの分類がある

● 仕組みが単純、実装しやすい

●並列分散処理OK

● P(C|D) P: 確率 , C:カテゴリ, D:事象例) 「サッカー」で検索したUserは80%男性である

●対数化や正規化などの処理が最後に必要

Page 76: ログにまつわるエトセトラ

76

「Naive Bayes」でぐぐれ!

Page 77: ログにまつわるエトセトラ

77

推定Model作成と評価● まずはオフラインで

●素性はスペース区切り検索Query

●訓練データ、推定対象データの準備 (過去28日間)✔訓練データ : 性別が分かるBrowserID×Query✔推定対象データ : 性別が分からないBrowserID×Query✔複数のUserIDが紐づくBrowserIDは対象外

●訓練データから推定Modelを評価✔K-fold Cross Validation(k-1個のデータセットからModelを作成し、その他1個で精度評価)

● Modelを使って推定対象データから予測✔男性の確率 :90%、女性の確率 :10%

Page 78: ログにまつわるエトセトラ

78

毎日推定● 次にオンラインで

● 2年前はOozie × Pig で素性抽出 /Model作成 /推定を完全自動化

● 今なら hivemall を使いますかね

● R言語でも簡単にできます

● BrowserID を基に推定確率を Redis に格納

Page 79: ログにまつわるエトセトラ

79

精度とカバー率と配信の閾値80%は女性と推定

精度 80%以上のカバー率は 3割

この人は女性で配信しますか?

配信側の閾値調整

Page 80: ログにまつわるエトセトラ

80

気をつけたい事●導入後のKPI変動の監視

✔ Targeting増 => CTs増 => CV下✔導入前のシミュレーションも欠かさずに行う

●推定Model の定期的な評価✔完全自動化での安定運用のため

Page 81: ログにまつわるエトセトラ

81

年代 (10歳区切り )推定マルチ分類への応用

Page 82: ログにまつわるエトセトラ

82

「 Log を解析する」まとめ

● 分類済み正解データの取得● 推定により Targeting 数を増やす● 素性抽出、推定Model作成、推定● 推定確率により配信する / しない

Page 83: ログにまつわるエトセトラ

83

以上

Page 84: ログにまつわるエトセトラ

84

質疑応答