基于hadoop的相关/聚类算法

ncgqoxb0  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(269)

我们的hadoop集群每天接收数TB的web日志。每个日志记录都包含用户ip地址、cookie id等信息。但是,不同的ip地址和cookie ID可以对应于一个物理用户(家庭/工作计算机等)。我们设计了一个函数来计算任何一对记录的匹配分数,分数越高意味着两个记录对应一个物理用户的概率越高。
目标是使用计分功能将所有记录分成可能对应于一个物理用户的组,并通过唯一的组id(即物理用户id)标记组中的所有记录。使用hadoop/mahout实现这个逻辑的最佳方法是什么?

5gfr0r5j

5gfr0r5j1#

首先,我假设您知道如何链接mapreduce作业。如果没有,请参阅http://developer.yahoo.com/hadoop/tutorial/module4.html#chaining 详情。
第二,我将假设您有一个分布式的键/值存储,比如cassandra。
第三,你的评分功能对我来说没有意义。我不认为“这里一张唱片,那里一张唱片”会让你知道他们是同一个人。我可以相信“这里的记录与那里的记录相比较=估计是否是同一个人”。所以我会假设,与你的描述相反,这就是你的评分函数实际工作的方式。
从理论上讲,什么是解决问题的好方法?
处理日志,将唯一的机器标识符(ip地址+cookie)+日期范围Map到所有记录的事件。
提取出所有唯一机器标识符的列表。把它也储存起来。
执行mapreduce,其中map获取一个机器标识符,获取所有其他机器标识符的列表,并发出所有不同的机器标识符对,其中第一个小于第二个。reduce查询每个记录的事件,计算分数,然后如果分数超过阈值,则发出较大的机器标识符Map到较小的机器标识符的数据点。
3的输出通过管道传输到map reduce,该map reduce的map不做任何操作,并为每个机器标识符找到它Map到的最小机器标识符。
4的输出通过管道传输到map reduce,该map reduce的Map采用一对(machine identifier,canonical machine identifier),从#1中的存储中获取事件,并将它们重新Map到(canonical machine identifier,rest of event),其reduce存储了一个规范机器标识符(aka group id)的关联事件(如果需要,请按日期。)
好吧,这是一个很好的理论。哪里出了问题?
问题是所有的标识符对都太多了。这个列表最终可能会达到1018的数量级,每一个都会有日志记录。除非你有真正惊人的硬件,否则你将耗尽处理能力来计算。因此,您需要找到启发式方法来减少它。
第一个,也是最简单的,是任何被识别的“这两个标识符Map到同一个”都应该被存储并尽可能地提前重用。
第二,在一个大型的初始工作之后,您可能会侥幸逃脱“在所有最近创建的标识符中,它们Map到什么?”这些是添加到规范Map的候选对象,您不希望总是重新创建规范Map。
第三,我相信你有“相似记录”的概念。因此,将记录Map到某种记录组,然后在reduce中让所有“足够小”的组将所有对Map到“可能相同”。将这些对发送到一个map reduce中,该map reduce获取“可能相同”的记录,然后创建一个查找Map机标识符,使所有“可能相同的次数超过x次”。省省吧。现在重复上面的步骤,除了在步骤2中用“comes up mably same”另一个将机器标识符发送给它自己的所有对之外。这条捷径将大大减少工作量。
这是一个总的策略,需要做大量的工作。祝你好运。

相关问题