我知道
Map器(中间数据)的输出存储在每个Map器数据节点的本地文件系统(而不是hdfs)中。这通常是一个临时目录,hadoop管理员可以在config中设置它。一旦mapper作业完成或数据传输到reducer,这些中间数据就会被清除,不再可访问。
但是,我想知道Map器何时将其输出存储到本地硬盘?是不是因为数据太大而无法存储在内存中?只有正在处理的数据留在内存中?如果数据很小,而且整个数据都可以放在内存中,那么就没有磁盘参与了吗?
一旦数据在mapper中处理,我们就不能直接将数据从mapper移动到reducer,而不需要mapper m/c的硬盘参与。我的意思是,由于数据是在Map器中处理的,而且它是在内存中,一旦计算出来,它就直接被传输到reducer,Map器可以以类似的方式传递下一个数据块,而不涉及磁盘。
在spark中,据说有内存计算,那和上面有什么不同?是什么让spark内存计算比map reduce更好?另外,在spark中,如果数据太大,就必须涉及磁盘?
请解释一下
1条答案
按热度按时间mbyulnm01#
这里有很多问题。我将试着解释每一个。
Map器何时将其输出存储到本地硬盘?
Map器将数据存储在配置的内存中。当内存已满80%(同样可配置)时,它对内存中存在的数据运行combiner以减少数据。但是当合并的数据也超过这个内存限制时,它就会溢出到磁盘。这些文件称为溢出文件。在整个操作过程中,会写入多个溢出的文件。在编写spill文件时,mapper根据reducer对数据进行排序和分区。在Map操作结束时,需要合并这些溢出文件。
一旦数据在mapper中处理,我们就不能直接将数据从mapper移动到reducer,而不需要mapper m/c的硬盘参与。
任何处理过程中最昂贵的操作是机器之间的“数据传输”。map-reduce的整个范例是在数据附近进行处理,而不是移动数据。因此,如果按照你的建议进行,将会有大量的数据移动。写本地磁盘比在网络上写更快。这些数据可以通过合并溢出文件来减少。排序是在溢出文件时进行的,因为合并排序后的数据更容易(更快)。分区完成了,因为您只需要合并相同的分区(数据将进入同一个缩减器)。在合并过程中,再次运行合并器以减少数据量。这些简化的数据随后被发送到简化器。
在spark中,据说有内存计算,那和上面有什么不同?
在spark和map reduce程序中没有区别,您只需从一些数据集读取数据,执行一个map函数和一个reduce函数。它将在磁盘中执行与mapreduce代码相同的读写操作。当您需要在同一个数据集上运行几个操作时,就会出现差异。在map reduce中,每次操作都会从磁盘读取数据,但在spark中,您可以选择使用内存来存储数据,在这种情况下,它只从磁盘读取一次数据,以后的操作将在内存中存储的数据上运行,这显然快得多。或者在有一系列操作的情况下,第一个操作的输出被输入到第二个操作。在mapreduce中,第一个操作的输出将写入磁盘,并在第二个操作中从磁盘读取,而在spark中,您可以将第一个操作的输出保存在内存中,以便第二个操作从内存读取,并且速度更快。