• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
搜狐Pv insight(py)技术交流
 

搜狐Pv insight(py)技术交流

on

  • 885 views

 

Statistics

Views

Total Views
885
Views on SlideShare
885
Embed Views
0

Actions

Likes
1
Downloads
7
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 1 正如哲学由最基本的三个问题引申出了很多 2 不同岗位、层级 对广度、深度和持久度要求不一样
  • 1 物以类聚、人以群分,具有相同特征的往往是一起的。 2 栏目由具有相同特征的若干 url 组成。 3 频道由具有相同特征的若干栏目组成,一个栏目可能属于多个频道
  • 第三点 1 python 全局锁的存在,导致使用多线程不如使用单进程来处理 2 节省空间,避免冗余,浪费资源; 减少服务器运算压力, 加快运算速度;相当于多了 9 台服务器 3 (可点击)将访问的 url 处理为 id , 加网址。 不存在的归为第 0 类。 对于 refer 是处理:搜狐内的为 id ,加网址,搜索引擎转化为关键字,其他转化为域名, www2 的转化为 www 的 4 uv 表面只少了一个 0 , 实际上市由字符串变为了整形,节省的空间意义重大。 当然为了记录一些的实际信息, 有些还是需要保存的。 例如来源
  • 1 5 分钟时,根据前面预处理的结果,计算 suv , pv , 并使用集合保留 suv 2 由于 python 的特性, 1 小时和 1 天只需简单加载数据进行归并即可 3 每周、每月
  • 1 人无远虑, 必有近忧 2 所谓分时处理就是将数据分摊到各时间片上进行处理 (翻页)
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
  • 1 知无不言、言无不尽 2 有请韩道亮同学上来和我一起回答大家的问题

搜狐Pv insight(py)技术交流 搜狐Pv insight(py)技术交流 Presentation Transcript

  • 搜狐 PVInsight 运算系统 刘凯毅 ; 尤春
  • PVInsight 系统简介
    • 公司向用户提供的价值
    • 获取的商业价值
  • PVInsight 运系统简介 什么样的用户认可提供的价值? 这些用户有商业价值吗? 有多认可? 开始认识用户吧 !
  • 系统简介 / 用户 关键字 : 响应用户 / 新用户 / 活跃用户 / 流失用户
  • 系统简介 / 用户 关键字 : 连续访问
  • 系统简介 / sohu 企邮 一个企邮用户的连续访问 > 登入 > [ 管理此域 ] > 员工列表 > 广播邮件 * >>> ..... 一通点击 > 群组列表 > 新建群组 > 广播邮件 * > 发送 想发广播邮件的用户 想做了些什么?
  • 系统简介 / sohu 企邮 如何发现 此类连续访问问题 ?
    • 产品经理提出: 希望看到发“广播邮件”的用户都怎么时候 ?
    • 从数据仓库中找出连续访问中
    • > 广播邮件 > 发送 ;之前的 操作
    • 3. 并清洗数据为
    • 离发送广播邮件最后 10 步 :
      • > a_url 访问人数 ;
      • > b_url 访问人数
    • 离发送广播邮件最后 9 步 :
    • > c_url 访问人数
    • > d_url 访问人数 …… .
    • 这样做对商业价值有利吗?
    系统简介 / 商业价值 各个职位上对商业价值的帮助 广告给我们带来效果怎么样 ?
  • 系统简介 / 商业价值角度
  • 名词解释 Pv : page view 浏览次数 Uv : unique visitor 独立访客 Ip : 独立 Ip 数 新老访客 / 回头用户 / 会话次数 / 访问间隔 / 停留时长 / 访问深度 / 回访率 / 跳出率 / 入口率 计费方式 : cpc : 每次点击计费 cpm : 千次效果展现 计费 cpa : 用户行为计费 cps : 销售成本计费
  • 名词解释 现实是很残酷的 : 其实 UV 就很难算 ~ 我们的 UID 是一个 16 位的字符串 一般一个小小的统计就上亿条的记录 ( 16*8* (10**8) ) / ((2**10)**3) = 12 G
  • PVInsight 运系统简介
    • 系统架构
      • 收 集
      • 存 储
      • 结构化
      • 可视化
  • 系统架构 / 图
  • 系统架构 / 使用语言
    • Python
      • ETL : 数据清洗 / 数据完整性
      • 中间数据:结构维护(分时 / 治) / 统计
      • 胶水 : c / r /mysql/ infob / bdb
    • Java
      • Hdfs / mapreduce / hbase
    • Shell
      • 调度 / 维护运行环境配置
  • Py 细节 / 预处理
  • Py 细节 / 预处理 / 数据完整性 url url => 栏目 ID ,频道 ID
  • Py 细节 / 预处理 / 数据完整性 url 域名 +url auto.sohu.com/ /20090914/n266706777.shtml 域名 auto.sohu.com/ 泛域名 i.auto.sohu.com/ 20090913/n237706498.shtml 特例 http://cs.focus.cn/news/2005-09-14/128510.html
  • Py 细节 / 预处理 / 数据完整性 url
    • 存储 btree 需要匹配 url
      • Key = domain 倒序 |url
    • def pointerDrift_domain (self,domain,url,loop=10) :
    • if loop < 0 : return ('0','0')
    • dk2,dv2 = btree_url. previous() # next()
    • dtype,ddmain,durl = dk2.split('|')[:3]
    • if ddmain != domain : return ('0','0')
    • if url.startswith( durl ) :
    • return dv2.split('t')
    • else :
    • return self. pointerDrift_domain (domain,url,loop-1)
  • Py 细节 / 预处理 / 数据完整性 url Btree key url moc.uhos.otua | / 20090913/n237706498.shtml moc.uhos.otua | moc.uhos.otua. i | /20090914/n266706777.shtml | = 174 特例 cs.focus.cn/news/2005-09-14/128510.html
  • Py 细节 / 预处理 / 数据清洗 流水线——预处理 0908251329265655 [26/Aug/2009:13:25:01 +0800] 123.15.49.138 &quot;GET /pv.gif?t?=1251264295765164_1024_768?r?=http://www.sohu.com/ HTTP/1.1&quot; &quot;http://news.sohu.com/20090826/n266231388.shtml&quot; pv.sohu.com CN4107 - - &quot;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; QQDownload 570; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)&quot; iamyp78@sohu.com news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301
  • Py 细节 / 预处理 / 数据清洗 Py 的一些特性正则 >>> re.findall( r’b(?:ab)+b’ , ’ababab abbabb aabaab’) 输出 : ['ababab'] >>> re.findall( ’/*.*?*/’ , ‘/* part 1 */ code /* part 2 */ ‘) 输出 : ['/* part 1 */', '/* part 2 */']     ‘ (?<=…)’ 前向界定 , ‘(?=…)’  后向界定 >>> s=r’/* comment 1 */  code  /* comment 2 */’ >>> re.findall( r’(?<=/*).+?(?=*/)’ , s ) [' comment 1 ', ' comment 2 '] # py 条件正则 大家请注意 。。。
  • Py 细节 / 预处理 / 数据清洗 合理使用正则
  • Py 细节 / 预处理 / 中间结果 / 分时分治
  • PVInsight 运算系统实现 流水线——分时处理
  • Py 细节 / 分时 流水线——分时处理
  • Py 细节 分治
  • 计算 UV 好吧已经知道 UV 就很难算 ~ 我们先来看看 ,目前非常火的 Mapreduce 解决方案!
  • UV 计算, mapreduce 解决方案 目前我这里使用的, mapreduce 很粗暴!
  • UV 计算, mapreduce 解决方案 频道 1,SUV1 频道 2,SUV2 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 SUV1 频道 1 SUV1 频道 1 SUV2 频道 1 SUV3 频道 2 SUV1 频道 1 SUV1 频道 1 SUV1 频道 1 SUV2 频道 1 SUV3 频道 2 SUV1 频道 1,SUV1 频道 2,SUV2 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 SUV1 频道 1 SUV3 频道 1 SUV1 频道 1 SUV2 频道 2 SUV1 频道 1 SUV1 频道 1 SUV3 频道 1 SUV2 频道 2 SUV1
  • UV 计算, mapreduce 解决方案 频道 1,IP1,SUV1 频道 2, IP1,SUV2 频道 1, IP2,SUV3 频道 1 ‘SUV’ SUV1 频道 1 ‘IP’ IP1 频道 2 ‘SUV’ SUV2 频道 2 ‘IP’ IP1 频道 1 ‘SUV’ SUV3 频道 1 ‘IP’ IP2 … …
  • Py 细节 / 预处理 / 中间结果 / 分时分治 Python : marshal
  • UV 计算, python 解决方案 频道 1,SUV1 频道 2,SUV2 频道 1,SUV1 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 001001… 频道 2 100111 … 频道 1 110011… 频道 1 00100… 频道 1 0001010… 频道 2 1001000…
  • UV 计算, python 解决方案 频道 1,SUV1 频道 2,SUV2 频道 1,SUV1 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 001001… 频道 2 100111 … 频道 1 110011… 频道 1 00100… 频道 1 0001010… 频道 2 1001000…
  • UV 计算, python 解决方案 现实又一次的残酷了! 我们的 UID 是一个 16 位的字符串 ~
  • UV 计算, python 解决方案 bc=bitarray() for n in xrange( 1000 ) :     bc.extend(bitarray(10**6)) #120M f1=open('/tmp/bc1.ba','wa') bc.tofile(f1) # 我测试在 160k 左右 sio = StringIO() f2=open('/tmp/bc2.ba','wb') w = GzipFile('/tmp/bc3.ba','wb',9,sio) w.write(bc.tostring()) w.close()
  • UV 计算, python 解决方案
  • UV 计算, python 调度 这么多任务 , 我们需要以个 .. 调度
  • Py 细节 / 调度 - gearman
  • Py 细节 / 调度 – 想象远没现实美好
  • Py 细节 / 胶水 R / rpy2 import rpy2.robjects as robjects r = robjects.r robjects.globalenv[&quot;x&quot;] = robjects.FloatVector([1,2, 3, 4, 5, 6, 7, 8, 9, 10]) robjects.globalenv[&quot;y&quot;] = robjects.FloatVector([0,30,44,57,65,78,68,97,99,120]) lm_d9 = r.lm(&quot;y ~ 1+x&quot;) r.predict( lm_d9, robjects.r(&quot; data.frame(x=11) &quot;), interval=&quot;prediction&quot;,level=0.95)[0] 输出 : 128.26666666666668
  • 数据的重要性 - 数据可视化 Twitter 上我们的关系
  • 数据的重要性 - 数据可视化 facebook 人物关系链图
  • 数据的重要性 - 数据可视化 Yahoo Research 针对地震发生后一小时 twitter 相关微博数据研究
  • 数据的重要性 - 数据可视化 高转帖子的传播环: 二环为粉丝转发 5% , 三环为粉丝们的粉丝转发 55% , 四环是粉丝们的粉丝加泛粉丝 25% , 五环是随机粉丝 15% 。
  • 数据的重要性 - 数据可视化
  • 数据的重要性 - 数据可视化 twitter 上的 love 有关的关键词
  • 数据的重要性 - 数据可视化 twitter 上的 hate 有关的关键词
  • 数据的重要性 - 数据可视化 Yahoo Research 针对地震发生后一小时 twitter 相关微博数据研究
  •