提问者:小点点

映射器何时将其输出存储到其本地硬盘?


这我知道

Mapper的输出(中间数据)存储在每个单独的mapper数据节点的本地文件系统(不是HDFS)中。这通常是一个临时目录,可以由Hadoop管理员在config中设置。一旦Mapper作业完成或将数据传输到Reducer,这些中间数据就会被清理,不再可访问。

但是,我想知道映射器何时将其输出存储到本地硬盘?是因为数据太大而无法保存在内存中吗?只有正在处理的数据保留在内存中?如果数据很小,整个数据可以放入内存,那么就没有磁盘参与?

我们不能直接移动数据,一旦它在映射器中处理,从映射器到减速器,而不涉及映射器m/c的硬盘。我的意思是,当数据在映射器中处理时,它在内存中,一旦计算出来,它就直接传输到减速器,映射器可以同样地传递下一个数据块,而不涉及磁盘。

在火花中,据说有内存计算,这和上面有什么不同?是什么让火花在内存中计算比地图减少更好?此外,在火花中,如果数据太大,就必须涉及磁盘?

请解释一下


共1个答案

匿名用户

这里有很多问题。我会试着解释每一个。

映射器何时将其输出存储到其本地硬盘?

映射器将数据存储在配置的内存中。当内存满80%时(再次可配置),它会对内存中存在的数据运行组合器以减少数据。但是当组合的数据也超过这个内存限制时,它会溢出到磁盘。这些文件称为溢出文件。在整个操作过程中,会写入多个溢出文件。在写入溢出文件时,映射器会根据还原器对数据进行排序和分区。在映射操作结束时,需要合并这些溢出文件。

我们能不能不直接移动数据,一旦它在映射器中被处理,从映射器到减速机,而不涉及映射器m/c的硬盘。

任何处理中最昂贵的操作是机器之间的“数据搬迁”。地图还原的整个范例是在数据附近进行处理,而不是移动数据。因此,如果按照您建议的方式进行,将会有大量数据移动。与在网络上写入相比,写入本地磁盘更快。可以通过合并溢出文件来减少这些数据。在溢出文件时进行排序,因为合并排序数据更容易(更快)。分区完成,因为您只需要合并相同的分区(数据进入相同的还原器)。在合并过程中,再次运行组合器来减少数据。然后将这些简化的数据发送到简化器。

在Spark中,据说有内存计算,这与上面有什么不同?

在火花和地图减少程序中,你只需从一些数据集中读取,执行一个地图函数和一个减少函数。它将在磁盘中执行与mapduce代码相同的读写。当您需要在同一数据集上运行少数操作时,就会出现差异。在地图减少中,它会为每个操作从磁盘读取,但在火花中,您可以选择使用内存来存储它,在这种情况下,它只会从磁盘读取一次,以后的操作将在内存中存储的数据上运行,这显然要快得多。或者当有操作链时,第一个操作的输出被输入到第二个操作。在MapReduce中,第一个操作的输出将被写入磁盘并在第二个操作中从磁盘读取,而在Spark中,您可以将第一个操作的输出持久化在内存中,以便第二个操作从内存中读取,并且应该更快。

相关问题