hadoop - MapReduce 中的高效集合运算

标签 hadoop mapreduce set

我继承了一个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/

相关文章:

python - 对 python 字典键 View 的限制集操作

hadoop - hbase 设计连接长键值对与多列

mapreduce - RavenDb MapReduce 数据子集

python - 声明 mrjob 映射器而不忽略 key

hadoop - 如何为配置单元查询编写 mapreduce 代码

c++ - C++ 程序的异常/错误行为

hadoop - Apache Spark 在 YARN 错误上运行 spark-shell

用于图像存储的 Hadoop (HDFS)

hadoop - Hadoop作业在 map 上完成0%减少0%

arrays - 使用 Ruby 生成多重集的分区