使用Hadoop统计独特访客的最佳方式是什么?

时间:2010-05-21 20:37:53

标签: python hadoop mapreduce

嘿所有,刚刚开始使用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 \ t用户名 reducer将为每个键保留一个唯一用户名的set(),然后发出该组的长度。然而,这可能会在内存中存储数百万个用户名,这似乎并不正确。谁有更好的方法?

我正在使用python流式传输

感谢

4 个答案:

答案 0 :(得分:3)

您可以将其作为两阶段操作:

第一步,发出(username => siteID),并让reducer使用set折叠多次出现的siteID - 因为你的网站通常比用户少得多,这应该没问题。

然后在第二步中,您可以发出(siteID => username)并执行简单计数,因为已删除重复项。

答案 1 :(得分:1)

使用辅助排序对用户ID进行排序。这样,您就不需要在内存中有任何内容 - 只需流式传输数据,并在每次看到特定站点ID的值更改时递增您的独特计数器。

以下是一些documentation

答案 2 :(得分:1)

我的aproach类似于tzaman给出的一个小扭曲

  1. 地图输出:(username,siteid)=> ( “”)
  2. 减少输出:(siteid)=> (1)
  3. map:identity mapper
  4. 减少:longsumreducer(即简单总结)
  5. 请注意,第一个reduce不需要覆盖任何记录。您只需检查密钥并生成输出即可。

    HTH

答案 3 :(得分:0)

使用HiveQL对许多简单任务进行排序通常会更快。 Hive会将您的查询转换为Hadoop MapReduce。在这种情况下,您可以使用

SELECT COUNT(DISTINCT username) FROM logviews

您可以在此处找到更高级的示例: http://www.dataminelab.com/blog/calculating-unique-visitors-in-hadoop-and-hive/