0

我正在使用 hadoop 为我的应用程序处理一系列分析记录。我想根据我在他们的流中看到的事件对用户进行分类,然后在稍后再次迭代流时使用该信息。例如,假设我想为所有从未激活我的应用程序的用户生成数据。

作为我的第一轮减少的一部分,我可以通过在流上迭代一次来计算出谁永远不会激活。

问题是,我将“用户 X 从未激活”的数据放在哪里,以便下次在第二轮映射器中遍历流时,我可以查找该事实?我有一些想法,但我不确定哪个是正确的 hadoop 方式:

  • 从我的第一轮减速器中输出一个包含用户列表的辅助文件,在我的第二轮中读取它——如何避免将整个文件读入内存,如何处理来自多个前端减速器的多个辅助文件(有没有排序/组合边文件的好方法)?
  • 在我的 reducer 中将用户的所有事件缓存在内存中,这样我就可以在将它们输出到磁盘之前将它们全部标记为“未激活”——感觉有点恶心。

其中一个是“正确的方式”吗,还有另一种我想念的方式吗?

我正在使用 AWS Elastic MapReduce。

4

1 回答 1

0

这使用 mapreduce 很容易。

映射器:将每个事件作为键,将您的用户作为值。

例如:

USER_NEVER_ACTIVATED_APP : x
USER_PAID_FOR_APP : x
USER_NEVER_ACTIVATED_APP : y

Reducer:你基本上得到每个事件的每个用户。在这种情况下,它会是这样的:

USER_NEVER_ACTIVATED_APP : x,y
USER_PAID_FOR_APP : x

这样,您甚至不需要第二个映射器或工作。

于 2011-09-17T18:12:09.400 回答