假设您只有1GB的堆大小可用于每个映射器,但是,块大小设置为10 GB,每个拆分为10 GB。映射器如何读取大的个体分裂?
映射器是否会将输入缓冲到磁盘并以循环方式处理输入分割?
谢谢!
答案 0 :(得分:1)
映射器的整体模式非常简单:
while not end of split
(key, value) = RecordReader.next()
(keyOut, valueOut) = map(key, value)
RecordWriter.write(keyOut, valueOut)
通常前两个操作只关心记录的大小。例如,当TextInputFormat
被要求下一行时,它将字节存储在缓冲区中,直到找到下一行。然后清除缓冲区。等
地图实施取决于您。如果你不在你的映射器中存储东西,那么你没事。如果你想要它是有状态的,那么你可能会遇到麻烦。确保您的内存消耗有限。
在最后一步中,映射器写入的键和值存储在内存中。然后对它们进行分区和排序。如果内存缓冲区已满,则其内容将溢出到磁盘(最终无论如何,因为即使在映射器消失后,reducers也需要能够下载分区文件)。
所以问题的答案是:是的,没关系。
可能导致麻烦的是:
如果您想了解更多信息,请参阅以下几点:
TextInputFormat