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

Neh*_*rma 3 hadoop mapreduce reducers mapper apache-spark

我知道

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

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

一旦数据在mapper中处理后,我们是否可以不直接将数据从mapper移动到reducer而不涉及mapper m/c的硬盘。我的意思是,当数据在映射器中处理并且位于内存中时,一旦计算完毕,它就会直接传输到减速器,并且映射器可以类似地传递下一个数据块,而无需磁盘参与。

在spark中,据说有内存计算,这和上面有什么不同?是什么让 Spark 内存计算比 Map Reduce 更好?另外,在spark中,如果数据太大,就必须涉及磁盘?

请解释

小智 6

这里有很多问题。我将尝试逐一解释。

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

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

一旦数据在mapper中处理后,我们是否可以不直接将数据从mapper移动到reducer而不涉及mapper m/c的硬盘。

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

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

Spark 和 MapReduce 程序没有什么区别,您只需从一些数据集中读取数据,执行一个 Map 函数和一个 Reduce 函数。它将在磁盘中执行与 MapReduce 代码相同的读取和写入操作。当您需要对同一数据集运行少量操作时,就会出现差异。在 MapReduce 中,它会从磁盘读取每个操作,但在 Spark 中,您可以选择使用内存来存储它,在这种情况下,它只会从磁盘读取一次,以后的操作将在内存中存储的数据上运行,这显然要快得多。或者,如果存在第一个操作的输出输入到第二个操作的操作链。在 Mapreduce 中,第一个操作的输出将写入磁盘并在第二个操作中从磁盘读取,而在 Spark 中,您可以将第一个操作的输出保留在内存中,以便第二个操作从内存读取并且速度更快。