我继承了一个mapreduce代码库,它主要计算不同广告在一段时间内看到的唯一用户ID的数量。对我来说,它看起来并没有非常高效地完成,我想知道是否有人对如何在 MapReduce 中尽可能高效地进行此类计算有任何提示或建议。
我们使用 Hadoop,但我会用伪代码给出一个示例,不包含任何繁琐内容:
map(key, value):
ad_id = .. // extract from value
user_id = ... // extract from value
collect(ad_id, user_id)
reduce(ad_id, user_ids):
uniqe_user_ids = new Set()
foreach (user_id in user_ids):
unique_user_ids.add(user_id)
collect(ad_id, unique_user_ids.size)
代码不多,也不是很难理解,但是效率不是很高。我们每天都会获得更多的数据,因此每天我们都需要从头开始查看所有广告展示次数,以计算该广告的唯一用户 ID 的数量,因此每天都会花费更长的时间,并使用更多的内存。此外,在没有实际分析代码(不知道如何在 Hadoop 中执行此操作)的情况下,我非常确定几乎所有工作都是在创建唯一 ID 集。它也会消耗大量的内存。
我尝试过非 MapReduce 解决方案,并且获得了更好的性能(但问题是如何以与 Hadoop 扩展相同的方式扩展它),但感觉应该有更好的在mapreduce 中执行此操作的方法是我所拥有的代码。这一定是一个足够常见的问题,其他人已经解决了。
如何使用 MapReduce 高效地实现唯一 ID 的计数?
最佳答案
问题在于,您继承的代码是以“我将自己确定唯一集”的心态编写的,而不是“让我们利用框架为我做这件事”。
我想要这样的东西(伪代码):
map(key, value):
ad_id = .. // extract from value
user_id = ... // extract from value
collect(ad_id & user_id , unused dummy value)
reduce(ad_id & user_id , unused dummy value):
output (ad_id , 1); // one unique userid.
map(ad_id , 1): --> identity mapper!
collect(ad_id , 1 )
reduce(ad_id , set of a lot of '1's):
summarize ;
output (ad_id , unique_user_ids);
关于hadoop - MapReduce 中的高效集合运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816569/