【发布时间】:2015-08-18 13:16:45
【问题描述】:
我想了解在这种情况下该怎么做。
例如,我有 1TB 的文本数据,假设其中 300GB
这个单词
“你好”。
每次map操作后,我都会有一个的键值对集合。
但正如我所说,这是一个巨大的集合,300GB,据我所知,reducer 得到了所有这些并将粉碎。
解决办法是什么?
让我们假设组合器在这里对我没有帮助(WordCount 示例只是为了简单起见),并且对于 reducer 来说数据仍然太大。
【问题讨论】:
我想了解在这种情况下该怎么做。
例如,我有 1TB 的文本数据,假设其中 300GB
这个单词
“你好”。
每次map操作后,我都会有一个的键值对集合。
但正如我所说,这是一个巨大的集合,300GB,据我所知,reducer 得到了所有这些并将粉碎。
解决办法是什么?
让我们假设组合器在这里对我没有帮助(WordCount 示例只是为了简单起见),并且对于 reducer 来说数据仍然太大。
【问题讨论】:
中间(映射器)输出存储在运行映射器任务的节点的本地文件系统中,然后进行清理。请注意,此映射器输出未存储在 HDFS 中。 reducer 确实获得了任何特定键的所有中间键值对(即键 'Hello' 的所有 300 GB 输出将由同一个 Reducer 任务处理)。仅在需要时才将这些数据带入内存。
希望这会有所帮助。
【讨论】:
reducer 确实获取了所有这些数据,但这些数据实际上是写入磁盘的,并且仅在您遍历值的 Iteratable 时才被带入内存。事实上,该迭代返回的对象被重复用于每个值:字段和其他状态在对象被交给您之前被简单地替换。这意味着您必须显式复制值对象才能同时在内存中拥有所有值对象。
【讨论】: