我们的Hadoop集群每天都会收集数TB的Web日志。每个日志记录包含用户IP地址,cookie ID等信息。但是,不同的IP地址和cookie ID可以对应于一个物理用户(家庭/工作计算机等)。我们设计了一个计算任何一对记录的匹配分数的函数,分数越高意味着两个记录对应一个物理用户的概率越高。
目标是将所有记录分成可能对应于使用评分功能的一个物理用户的组,并通过唯一组ID(即物理用户ID)标记组中的所有记录。使用Hadoop / Mahout实现此逻辑的最佳方法是什么?
答案 0 :(得分:2)
首先,我将假设您知道如何链接MapReduce作业。如果没有,请参阅http://developer.yahoo.com/hadoop/tutorial/module4.html#chaining了解详情。
其次,我假设你有一个分布式的键/值存储,比如Cassandra。
第三,你的得分功能对我没有意义。我不认为“这里的一条记录,那里的一条记录”会让你知道他们是同一个人。我可以相信“这里的记录与那里的记录相比=估计是否是同一个人”。因此,与您的描述相反,我将假设这是您的评分功能实际上的工作方式。
现在解决问题的理论方法是什么?
处理日志,将存储的唯一机器标识符(IP地址+ cookie)+所有已记录事件的日期范围映射到您的商店。
提取所有唯一计算机标识符的列表。也存储它。
执行MapReduce,其中地图获取机器标识符,获取所有其他的列表,并发出所有不同的机器标识符对,第一个小于第二个。对每个记录事件的reduce查询计算得分,然后如果得分超过阈值,则发出较大的机器标识符映射到较小的数据点的数据点。
3的输出通过管道传输到地图缩小,其地图不执行任何操作,并且其每个机器标识符的查找是它映射到的最小机器标识符。
4的输出通过管道传输到地图缩小,其地图采用一对(机器标识符,规范机器标识符),从#1中的商店抓取事件,并将它们重新映射到(规范机器标识符,其余部分事件),其减少存储规范机器标识符(也称为组ID),相关事件。 (如果你愿意,可以按日期。)
问题是所有标识符对都太多了。该列表最终可能会达到10 18 的顺序,因为每个数据都会提取日志。除非你拥有真正非凡的硬件,否则你将耗尽处理能力来计算它。因此,您需要找到启发式来减少它。
第一个也是最简单的是,任何已识别的“这两个标识符映射到同一个标识符”都应该存储并尽可能地重复使用。
其次,在一个大型的初始工作之后,你可能可以逃脱,“在最近创建的所有标识符中,它们映射到了什么?”这些是您的规范映射的补充,您不希望总是重新创建。
第三,我确信你有一个“类似记录”的概念。因此将记录映射到某种记录组,然后在reduce中将所有“足够小”的组映射到“可能相同”。将这些对发送到地图中减少抓取“可能相同”的记录,然后创建一个查找映射机器标识符,所有“出现的可能相同超过X次”。保存。现在重复上面的步骤,除了在步骤2中你将一个机器标识符发送到所有自己的对,并且“可能是相同的”其他对。这条捷径将大大减少工作量。
这是一项总体战略,需要做很多工作。祝你好运。