【问题标题】:Efficient Hadoop Word counting for large file大文件的高效 Hadoop 字数统计
【发布时间】:2012-12-01 20:12:53
【问题描述】:

我想实现一个用于字数统计的 hadoop reducer。 在我的减速器中,我使用哈希表来计算单词。但是如果我的文件非常大,哈希表将使用大量内存。我该如何解决这个问题? (例如,一个有 1000 万行的文件,每个 reducer 接收 1 亿个单词他如何计算单词一个哈希表需要 1 亿个键) 我目前的实现是在 python 中。 有没有减少内存量的聪明方法?

【问题讨论】:

  • 我错过了什么吗?但是如果你只是想计算单词,你不需要一个 100 米长的哈希表,因为你会得到很多重复。例如,您可能会获得 250k 词条 the。你不能通过增加collections.Counter 的函数逐行流式传输数据吗?
  • 对不起我的错误我想说,例如,对于 1 亿个不同的单词,我需要在哈希表中包含 1 亿个条目
  • 一亿个不同的单词,真的吗? oxforddictionaries.com/words/…
  • 好吧,当然也许这不现实,我只是在寻找更好的方法!:P(在我的事业中,我没有真正的单词,我真的记忆问题)
  • @nikosdi 英语中的单词数量并不多,甚至每种语言的组合都没有。除非你不是来自这个星球,否则你不需要那么多哈希值。

标签: python hadoop hadoop-streaming


【解决方案1】:

最有效的方法是在映射器中维护词频哈希映射,并在它们达到一定大小(例如 100,000 个条目)时将它们刷新到输出上下文。然后清除地图并继续(记得在清理方法中也刷新地图)。

如果您仍然确实有 1 亿个单词,那么您要么需要等待很长时间才能完成 reducer,要么增加集群大小并使用更多 reducer。

【讨论】:

  • 好的,我现在在映射器中使用组合器。但我仍然有这个问题,因为如果我的减速器收到的不同单词多于内存容量,它将无法继续......好吧,我明白了!这是购买更大的 Haddop 集群的部分答案! ;)
  • 当您到达 reducer 时,您不需要将所有内容都保存在内存中 - 当然您只需将每个键和输出的计数相加即可。在 reducer 中维护 hashmap 需要什么?
  • reducer 可以从 mapper A1 和 A2 接收 word A。所以 reducer 还必须进行计数......A1 发送 {N,100} A2 发送 {N,100}。 ..
  • reducer 中不需要 hashmap。在您的映射器中,每次出现一个单词时都会输出 (word,1)。 Hadoop 的 shuffle & sort 确保每个 reduce 调用都包含每个唯一“单词”的所有“1”作为值。您只需遍历 Iterable 并添加“1”。然后你发出 就完成了。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多