如果减速器';Hadoop MapReduce中的输入太大

如果减速器';Hadoop MapReduce中的输入太大,hadoop,mapreduce,Hadoop,Mapreduce,我想知道在那种情况下该怎么办。 例如,我有1TB的文本数据,假设其中300GB是 字眼 “你好”。 在每次映射操作之后,我将有一个键值对的集合 但正如我所说,这是一个巨大的收藏,300GB,据我所知,减速机得到了所有这些,并将粉碎 解决这个问题的办法是什么让我们假设组合器在这里对我没有帮助(WordCount示例只是为了简单起见),并且数据对于reducer来说仍然太大。reducer确实获取了所有数据,但这些数据实际上是写入磁盘的,并且只有在您迭代可迭代的值时才会被带到内存中。事实上,该迭代返

我想知道在那种情况下该怎么办。
例如,我有1TB的文本数据,假设其中300GB是 字眼 “你好”。
在每次映射操作之后,我将有一个键值对的集合

但正如我所说,这是一个巨大的收藏,300GB,据我所知,减速机得到了所有这些,并将粉碎


解决这个问题的办法是什么
让我们假设组合器在这里对我没有帮助(WordCount示例只是为了简单起见),并且数据对于reducer来说仍然太大。

reducer确实获取了所有数据,但这些数据实际上是写入磁盘的,并且只有在您迭代可迭代的值时才会被带到内存中。事实上,该迭代返回的对象对于每个值都是重复使用的:字段和其他状态只是在对象交给您之前被替换。这意味着您必须显式复制值对象,以便同时将所有值对象存储在内存中。

中间(映射器)输出存储在运行映射器任务的节点的本地文件系统中,并在之后进行清理。请注意,此映射器输出未存储在HDFS中。reducer确实获得任何特定键的所有中间键值对(即,键“Hello”的所有300 GB输出将由同一个reducer任务处理)。只有在需要时,才会将此数据带到内存中


希望这有帮助。

但据我所知,Hadoop不在磁盘上存储中间值。我错了吗?顺便说一句,你能告诉我Spark在这里有什么不同吗?映射任务将其输出写入本地磁盘,而不是HDFS。如果磁盘上没有剩余的300GB空间怎么办?它是否会被分区?为了处理这种情况,存在一个属性“mapreduce.cluster.local.dir”,可以在mapred-site.xml文件中设置该属性。它可以包含逗号分隔的目录路径列表,这些路径可以指向不同设备上的目录,以便扩展磁盘I/O。如果未设置,其默认值为${hadoop.tmp.dir}/mapred/local。注意:hadoop.tmp.dir属性在core-site.xml文件中设置。大多数linux发行版的默认值是“/tmp”。参考以下文件: