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