用Hadoop统计独立访客的最佳方法是什么?
大家好,我刚开始学习Hadoop,想知道在MapReduce中,如何计算独立访客的最佳方法,如果你的日志文件看起来像这样……
DATE siteID action username
05-05-2010 siteA pageview jim
05-05-2010 siteB pageview tom
05-05-2010 siteA pageview jim
05-05-2010 siteB pageview bob
05-05-2010 siteA pageview mike
而且你想知道每个网站的独立访客数量?
我在想,mapper可以输出siteID和用户名,然后reducer可以为每个key保持一个唯一用户名的集合,最后输出这个集合的长度。不过,这样可能会在内存中存储数百万个用户名,这样似乎不太对。有没有人有更好的方法?
顺便说一下,我是用Python流式处理的。
谢谢!
4 个回答
1
我的方法跟tzaman的有点像,不过稍微有点不同。
- 映射输出: (用户名, 网站ID) => ("")
- 归约输出: (网站ID) => (1)
- 映射:身份映射器
- 归约:长整型求和器(也就是简单地汇总)
注意,第一个归约过程不需要处理它收到的任何记录。你只需要检查一下键,然后生成输出就可以了。
希望这对你有帮助。
1
使用二次排序来根据用户ID进行排序。这样,你就不需要在内存中存储任何东西,只需将数据流过,每当你看到某个特定网站ID的值发生变化时,就增加你的独特计数器。
这里有一些 文档。
3
你可以把这个过程分成两个步骤来做:
第一步,发出 (用户名 => 网站ID)
,然后让处理器把多个相同的网站ID合并成一个,使用 set
这个工具就可以了。因为通常网站的数量会比用户少很多,所以这样做是没问题的。
第二步,你可以发出 (网站ID => 用户名)
,然后简单地统计一下,因为重复的部分已经被去掉了。