2017-06-03 73 views
1

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

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

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

在mapper m/c的硬盘没有介入的情况下,我们能不能直接将数据在mapper中处理后从mapper转移到reducer。我的意思是当数据在映射器中被处理时,它在内存中,一旦计算出来,它就直接传递给reducer,映射器可以传递下一块数据,类似地没有磁盘卷入。

在spark中,据说有内存中的计算,与上面有什么不同?什么让火花计算内存比地图减少更好?另外,如果数据过于庞大,那么就会出现磁盘卷入的情况。

请解释

回答

1

很多问题在这里。我会尽力解释每一个。

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

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

如果没有映射器m/c的硬盘卷入,我们是不是可以直接将数据在映射器中处理后从映射器转移到reducer中。

任何处理中最耗费的操作是机器之间的“数据传输”。减少地图的整个范例是将处理靠近数据而不是移动数据。因此,如果它按照你所建议的方式完成,就会有很多数据移动。与在网络上写入相比,写入本地磁盘的速度更快。通过合并溢出文件可以减少这些数据。 排序是在溢出文件时完成的,因为它更容易(更快)地合并排序后的数据。分区完成后,因为您只需要合并相同的分区(数据将转到同一个reducer)。在合并过程中,组合器再次运行以减少数据。这个减少的数据然后被发送到减速器。

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

火花和地图缩小程序在你从某些数据集中读取,执行一个地图功能和一个缩小功能时没有区别。它将在磁盘上执行与mapreduce代码相同的读写操作。当您需要在同一数据集上运行少量操作时,就会出现差异。在map reduce中,每次操作都会从磁盘读取,但在spark中,您可以选择使用内存来存储它,在这种情况下,它只会从磁盘读取一次,后面的操作应该在存储器中运行,这显然会更快。 或者在第1次操作的输出被输入到第2次的操作连锁的情况下。在Mapreduce中,第一个操作的输出将被写入磁盘并在第二个操作中从磁盘读取,而在spark中,您可以将第一个操作的输出保存在内存中,以便第二个操作从内存中读取并且应该更快。

+0

非常感谢你这么深入的回答。但是,通过mapreduce分区,你的意思是洗牌吗?这里他们是一样的吗? –

+0

阅读此https://stackoverflow.com/questions/22141631/what-is-the-purpose-of-shuffling-and-sorting-phase-in-the-reducer-in-map-reduce –

+0

你一直非常有帮助,你也可以请回答这个问题[链接](https://stackoverflow.com/questions/44351229/what-does-the-shuffling-phase-actually-do)..感谢很多 –

相关问题