用Hadoop统计独立访客的最佳方法是什么?

9 投票
4 回答
6259 浏览
提问于 2025-04-15 23:00

大家好,我刚开始学习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的有点像,不过稍微有点不同。

  1. 映射输出: (用户名, 网站ID) => ("")
  2. 归约输出: (网站ID) => (1)
  3. 映射:身份映射器
  4. 归约:长整型求和器(也就是简单地汇总)

注意,第一个归约过程不需要处理它收到的任何记录。你只需要检查一下键,然后生成输出就可以了。

希望这对你有帮助。

1

使用二次排序来根据用户ID进行排序。这样,你就不需要在内存中存储任何东西,只需将数据流过,每当你看到某个特定网站ID的值发生变化时,就增加你的独特计数器。

这里有一些 文档

3

你可以把这个过程分成两个步骤来做:

第一步,发出 (用户名 => 网站ID),然后让处理器把多个相同的网站ID合并成一个,使用 set 这个工具就可以了。因为通常网站的数量会比用户少很多,所以这样做是没问题的。

第二步,你可以发出 (网站ID => 用户名),然后简单地统计一下,因为重复的部分已经被去掉了。

撰写回答