我想知道在这种情况下该怎么做。
例如,我有1TB的文本数据,假设有300GB这个词"你好"。
每次map操作后,i将有一个<"Hello",1>的键值对集合。
但正如我所说的,这是一个巨大的集合,300GB,据我所知,减速器得到所有这些,并将粉碎。
这个问题的解决方案是什么?
让我们假设组合器在这里没有帮助(WordCount示例只是为了简单起见),并且对于reducer来说数据仍然太大。
中间(Mapper)输出存储在运行Mapper任务的节点的Local File System中,然后进行清理。请注意,此映射器的输出不存储在HDFS中。reducer确实获取任何特定键的所有中间键-值对(即…键'Hello'的所有300gb输出将由同一个Reducer任务处理)。这些数据只有在需要的时候才会被存入内存。
reducer确实获取所有这些数据,但是这些数据实际上被写入磁盘,并且只有在迭代值的Iteratable时才被带入内存。实际上,该迭代返回的对象对每个值都是重用的:字段和其他状态在对象交给您之前被简单地替换。这意味着你必须显式地复制value对象,以便同时在内存中拥有所有的value对象。