映射器何时将其输出存储到其本地硬盘?
Posted
技术标签:
【中文标题】映射器何时将其输出存储到其本地硬盘?【英文标题】:When does a mapper store its output to its local hard disk? 【发布时间】:2017-11-04 21:07:10 【问题描述】:我知道
Mapper 的输出(中间数据)存储在每个单独的 Mapper 数据节点的本地文件系统(不是 HDFS)上。这通常是一个临时目录,可以由 Hadoop 管理员在配置中设置。一旦 Mapper 作业完成或将数据传输到 Reducer,这些中间数据将被清理,不再可访问。
但是,我想知道映射器何时将其输出存储到本地硬盘?是因为数据太大而无法在内存中吗?并且只有正在处理的数据保留在内存中?如果数据很小,整个数据都可以放在内存中,那么不涉及磁盘吗?
我们可以不直接移动数据,一旦在mapper中处理,从mapper到reducer,而不需要mapper m/c的硬盘参与。我的意思是,由于数据是在 mapper 中处理的,并且它在内存中,一旦计算出来,它就会直接传输到 reducer,mapper 可以类似地传递下一个数据块,而不涉及磁盘。
在spark中,据说有内存计算,和上面有什么不同?是什么让 spark 在内存中计算比 map reduce 更好?此外,如果数据太大,在火花中是否必须涉及磁盘?
请解释
【问题讨论】:
【参考方案1】:这里有很多问题。我将尝试解释每一个。
映射器何时将其输出存储到其本地硬盘?
映射器将数据存储在配置的内存中。当内存已满 80%(再次可配置)时,它会对内存中存在的数据运行组合器以减少数据。但是当组合数据也超过这个内存限制时,它会溢出到磁盘。这些文件称为溢出文件。在整个操作过程中,会写入多个溢出文件。在写入溢出文件时,mapper 根据 reducer 对数据进行排序和分区。在映射操作结束时,需要合并这些溢出文件。
我们可以不直接移动数据,一旦在mapper中处理,从mapper到reducer,而不需要mapper m/c的硬盘参与。
任何处理中成本最高的操作是机器之间的“数据传输”。 map reduce 的整个范例是在数据附近进行处理,而不是移动数据。因此,如果按照您建议的方式完成,将会有大量的数据移动。与在网络上写入相比,写入本地磁盘更快。这些数据可以通过合并溢出文件来减少。 排序是在溢出文件时完成的,因为它更容易(更快)合并排序的数据。分区完成,因为您只需要合并相同的分区(数据进入相同的减速器)。在合并过程中,再次运行组合器以减少数据。然后将这些缩减的数据发送到缩减器。
在spark中,据说有内存计算,和上面有什么不同?
在 spark 和 map reduce 程序中没有区别,你只是从一些数据集中读取,执行一个 map 函数和一个 reduce 函数。它将在磁盘中执行与 mapreduce 代码相同的读取和写入操作。当您需要在同一数据集上运行少量操作时,差异就会出现。在 map reduce 中,它将为每个操作从磁盘读取,但在 spark 中,您可以选择使用内存来存储它,在这种情况下,它只会从磁盘读取一次,以后的操作将在内存中存储的数据上运行,这显然更快。 或者在存在将第一个操作的输出输入到第二个操作的操作链的情况下。在 Mapreduce 中,第一个操作的输出将写入磁盘并在第二个操作中从磁盘读取,而在 spark 中,您可以将第一个操作的输出持久化到内存中,以便第二个操作从内存中读取并且应该更快。
【讨论】:
非常感谢您提供如此深入的回答。但是,通过 mapreduce 中的分区,你的意思是改组吗?它们在这里是一样的吗? 阅读此***.com/questions/22141631/… 你帮了很大的忙,你能不能也回答一下这个问题link..非常感谢以上是关于映射器何时将其输出存储到其本地硬盘?的主要内容,如果未能解决你的问题,请参考以下文章