SlideShare a Scribd company logo
FluentdとRedisではじめるカジュアルで
  リアルタイムなレコメンデーション

                 GMO Media, Inc.
                 Business Promotion Office
                 System Architect
                          Hitoshi Asai
WORK
                           ScalaJP
                     backend system
                      data reporting
                                aws

FAVORITE PLUGINS   TWITTER
 input: tail                  Hitoshi ASAI
 buffer: memory               @hito_asa
                              プログラマですよ。
 output: exec                 machida, tokyo, jp

                         #fluentdcasual
TODAYS AGENDA
自社Webサービスに導入したリアルタイム
レコメンデーションシステムのおはなしです。
ごめんなさい。サービス名は秘密。
内容は画像投稿サービスです。




                #fluentdcasual
DEMO


       #fluentdcasual
システム構成




         #fluentdcasual
SYSTEM ARCHITECTURE
                                                                EXEC
      LOG FILE      FORWARD




                               FLUENTD




                                                  FLUENTD

                                                            SCRIPT
                                                             RUBY
                 FLUENTD
PHP




                                         WORKER


         WEB                  SCALA
                                                                       REDIS
                                          API
                                                   #fluentdcasual
スケール




       #fluentdcasual
SYSTEM SCALE
 scale of service

  133 MILLION REQUESTS / DAY
  7.6 MILLION PICTURES
  6.5 MILLION USERS




                          #fluentdcasual
SYSTEM SCALE
 scale of event log

  7GB / DAY
  1500 EVENTS / SEC




                      #fluentdcasual
SYSTEM SCALE
 scale of servers         WEB


  18 WEB SRVS
  6 REDIS SRVS
                                  WORKER
  4 API SRVS
  4 WORKER SRVS
                    API
                          REDIS

                    #fluentdcasual
レコメンデーションの仕組み




         #fluentdcasual
RECOMMENDATION ALGORITHM
画像閲覧時のログを取得

 210.153.84.41 - - [10/May/2012:20:52:08 +0900]
  "GET /JP_r0.prcm.jp/default/pic/index/" 200 57 "-“
  "ip_fdop_docomo2 5Cb3mxt" "51402666 14235104"

                           USER ID       PIC ID




                                     #fluentdcasual
RECOMMENDATION ALGORITHM
各ユーザーの閲覧履歴を時系列にRedisで保持
                 LPUSH
     key                        value (list)
  vlist_user1
          pic5
          pic4
          pic3
          pic2
          pic1

  vlist_user2    pic7    pic2     pic4         pic1   pic2

  vlist_user3    pic4    pic6     pic2         pic3   pic1

                                       #fluentdcasual
RECOMMENDATION ALGORITHM
Listで近接する画像の関連スコアを加算
                       LRANGE 3
     key                             value (list)
  vlist_user1
          pic5                pic4     pic3         pic2    pic1

           pic4        pic5          pic3            pic5
                  +2                           +1



 ※スコアリングルールは随時改善
                                            #fluentdcasual
RECOMMENDATION ALGORITHM
各画像間のスコアをRedisで保持

 key: rel_pic4 (hash)            key: rel_pic3 (hash)
      field   value   HINCRBY         field   value   HINCRBY
     pic5      5
               3            +2       pic5      2
                                               1            +1
     pic6      3                     pic2      1



                                       #fluentdcasual
非リアルタイム時代




       #fluentdcasual
NON-REALTIME GENERATION
 1時間に1回のSCP & MapReduce



               scp                map-reduce
               (houry)            (houry)


 WEB SERVERS             Hadoop                REDIS


                                      #fluentdcasual
NON-REALTIME GENERATION
 低いヒット率




画像:60 - 70%
検索語:20 – 30%
                          #fluentdcasual
リアルタイム時代




       #fluentdcasual
REALTIME GENERATION
 ヒット率の劇的な改善




画像:60 - 70%       画像:70 - 90%
検索語:20 – 30%      検索語:50 – 70%
                          #fluentdcasual
IMPLEMENTATION
recommendation script (ruby)                                                                                                             43 LINES
 #!/bin/env ruby

 require 'logger'
 require 'redis'
 require 'redis/distributed'

 VIEW_PREFIX = 'r_user_gazo_view_'
 RELATION_PREFIX = 'r_gazo_relation_'

 LOGGER = Logger.new("#{ENV['FLUENTD_HOME']}/logs/gazo_recommend.log", 1, 100 * 1024 * 1024)
 REDISM = Redis.new(:host => "xxx", :port => 6380)
 REDISS = Redis::Distributed.new(["redis://xxx:6380", "redis://xxx:6380", "redis://xxx:6380", "redis://xxx:6380", "redis://xxx:6380"])

 def calc(time, user_id, gazo_id)
   time_s = time.strftime('%Y-%m-%d %H:%M:%S')
   view_key = VIEW_PREFIX + user_id.to_s
   key_org = RELATION_PREFIX + gazo_id.to_s
   if REDISS.lrange(view_key, 0, 0) != [gazo_id] then
     REDISM.lpush(view_key, gazo_id)
     REDISM.expire(view_key, 7200)
     REDISM.expire(key_org, 28800)
     rel = REDISS.lrange(view_key, 0, 3).find_all{|r| r != gazo_id.to_s}.uniq.reverse.take(2).reverse
     rel.each do |r|
       key_rel = RELATION_PREFIX + r.to_s
       score = REDISM.hincrby(key_rel, gazo_id.to_s, 1)
       REDISM.expire(key_rel, 28800)
       LOGGER.info("#{time_s} - #{user_id.to_s} : #{r.to_s} => #{gazo_id.to_s} score: #{score}")
       score = REDISM.hincrby(key_org, r.to_s, 1)
       LOGGER.info("#{time_s} - #{user_id.to_s} : #{gazo_id.to_s} => #{r.to_s} score: #{score}")
     end
   end
 end

 while line = gets
   begin
     l = line.encode!('UTF-8', 'UTF-8', :invalid => :replace).split("¥t")
     if l[1] == 'default' && l[2] == 'pic' && l[3] == 'index' then
       time = l[0]
       user_id = l[5]
       gazo_id = l[6]
       if user_id && gazo_id then
         calc Time.at(time.to_i), user_id.to_i, gazo_id.to_i rescue nil
       end
     end
   rescue => ex
     LOGGER.error("error: #{ex}")
   end
 end




                                                                                                                                          #fluentdcasual
エージェントプロセスの負荷




         #fluentdcasual
LOAD OF AGENT PROCESS
 load average




 リリース時から目立った変化はなし。

                        #fluentdcasual
LOAD OF AGENT PROCESS
 memory usage (rss)




 0.10.15 => 0.10.19 へのバージョンアップで改善。

                        #fluentdcasual
LOAD OF AGENT PROCESS
 memory usage (rss) - weekly




 上昇傾向もありません。

                               #fluentdcasual
トラブル




       #fluentdcasual
TROUBLES
in_tailで取り込んだログのパースが稀に失敗する

 2012-03-27 03:10:27 +0900:
 fluent/parser.rb:85:parse: pattern not match:
 "...(a part of log line)"


直りました。
https://github.com/fluent/fluentd/pull/44
                                            #fluentdcasual
TROUBLES



         あとは特にないです。
     とってもカジュアル。とっても安定。




                 #fluentdcasual
以上です、ありがとうございました。




           #fluentdcasual

More Related Content

PDF
Serf2Excel - Serf を実運用に活かす話 + Consul もあるよ
PDF
consul & consul-alerts を使った監視システム (hbstyle-2015-01-08)
PDF
Piwik fluentd
PDF
MongoDBではじめるカジュアルなタイムラインシステム
PDF
事例で学ぶトレジャーデータ 20140612
PDF
What matters to technology driven business
PDF
Treasure Agent Monitoring Service (ベータ)
PDF
おでかけスポット検索のむずかしさ - Holidayを支える検索技術
Serf2Excel - Serf を実運用に活かす話 + Consul もあるよ
consul & consul-alerts を使った監視システム (hbstyle-2015-01-08)
Piwik fluentd
MongoDBではじめるカジュアルなタイムラインシステム
事例で学ぶトレジャーデータ 20140612
What matters to technology driven business
Treasure Agent Monitoring Service (ベータ)
おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Viewers also liked (12)

PDF
R&D at Foodtech company - #CookpadTechConf 2016
PDF
サービス改善はログデータ分析から
PDF
Kibanaでsysstatを可視化する
PPTX
Norikra + Fluentd + Elasticsearch + Kibana リアルタイムストリーミング処理 ログ集計による異常検知
PDF
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
PDF
開発した新技術から、新しい価値を作るためのクックパッド検索チームのプロダクト開発手法
PDF
モバイルアプリのインタラクションプロトタイピング - 高速に仮説・実行・検証サイクルを回すために
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
Cookpad TechConf 2016 - DWHに必要なこと
PDF
Cookpad Techconf@kimura 2016/01/23
PDF
Fluentd v1 and Roadmap
PDF
Treasure Data Intro for Data Enthusiast!!
R&D at Foodtech company - #CookpadTechConf 2016
サービス改善はログデータ分析から
Kibanaでsysstatを可視化する
Norikra + Fluentd + Elasticsearch + Kibana リアルタイムストリーミング処理 ログ集計による異常検知
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
開発した新技術から、新しい価値を作るためのクックパッド検索チームのプロダクト開発手法
モバイルアプリのインタラクションプロトタイピング - 高速に仮説・実行・検証サイクルを回すために
ヤフー社内でやってるMySQLチューニングセミナー大公開
Cookpad TechConf 2016 - DWHに必要なこと
Cookpad Techconf@kimura 2016/01/23
Fluentd v1 and Roadmap
Treasure Data Intro for Data Enthusiast!!
Ad

Similar to Fluentd Casual Talks LT #fluentd #fluentdcasual (20)

PDF
fluentd を利用した大規模ウェブサービスのロギング
PDF
Hadoopによるリクルートでの技術調査とその活用
PDF
Fluentd casual
PDF
Facebookのリアルタイム Big Data 処理
PDF
Fluentd in #tkrk10
PDF
Hadoopを用いた大規模ログ解析
PPTX
Code4Lib Conference 2012 : 参加報告 ( 常川真央 )
PDF
Osc2008 Opensuse Moonlinx
PDF
異分野融合型の科学データ公開サイトLink data.org
PDF
Flume cassandra real time log processing (日本語)
PDF
社内向けTech Talk資料~Fluentdの基本紹介~
PDF
Heroku Postgres
PDF
PPTX
20130215 fluentd esper_2
PDF
Redmine 過去・2.1・未来
PDF
スマートフォン向けサービスにおけるサーバサイド設計入門
PDF
WDD2012_SC-004
PDF
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
PDF
地方企業がソーシャルゲーム開発を成功させるための10のポイント
PDF
Kyoto Tycoon Guide in Japanese
fluentd を利用した大規模ウェブサービスのロギング
Hadoopによるリクルートでの技術調査とその活用
Fluentd casual
Facebookのリアルタイム Big Data 処理
Fluentd in #tkrk10
Hadoopを用いた大規模ログ解析
Code4Lib Conference 2012 : 参加報告 ( 常川真央 )
Osc2008 Opensuse Moonlinx
異分野融合型の科学データ公開サイトLink data.org
Flume cassandra real time log processing (日本語)
社内向けTech Talk資料~Fluentdの基本紹介~
Heroku Postgres
20130215 fluentd esper_2
Redmine 過去・2.1・未来
スマートフォン向けサービスにおけるサーバサイド設計入門
WDD2012_SC-004
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
地方企業がソーシャルゲーム開発を成功させるための10のポイント
Kyoto Tycoon Guide in Japanese
Ad

Fluentd Casual Talks LT #fluentd #fluentdcasual