hadoop如何处理非常大的单个拆分文件

时间:2014-08-14 20:31:07

标签: hadoop split mapreduce

假设您只有1GB的堆大小可用于每个映射器,但是,块大小设置为10 GB,每个拆分为10 GB。映射器如何读取大的个体分裂?

映射器是否会将输入缓冲到磁盘并以循环方式处理输入分割?

谢谢!

1 个答案:

答案 0 :(得分:1)

映射器的整体模式非常简单:

while not end of split
  (key, value) = RecordReader.next()
  (keyOut, valueOut) = map(key, value)
  RecordWriter.write(keyOut, valueOut)

通常前两个操作只关心记录的大小。例如,当TextInputFormat被要求下一行时,它将字节存储在缓冲区中,直到找到下一行。然后清除缓冲区。等

地图实施取决于您。如果你不在你的映射器中存储东西,那么你没事。如果你想要它是有状态的,那么你可能会遇到麻烦。确保您的内存消耗有限。

在最后一步中,映射器写入的键和值存储在内存中。然后对它们进行分区和排序。如果内存缓冲区已满,则其内容将溢出到磁盘(最终无论如何,因为即使在映射器消失后,reducers也需要能够下载分区文件)。

所以问题的答案是:是的,没关系。

可能导致麻烦的是:

  • 大记录(指数缓冲区增长+内存副本=>对于疯狂的内存开销很重要)
  • 存储映射器中上一个键/值的数据
  • 如果您有自定义(输入|输出)格式实施,则存储上一个键/值的数据

如果您想了解更多信息,请参阅以下几点:

  • Mapper.java中,您可以看到while循环
  • LineRecordReader中,您可以看到TextInputFormat
  • 如何读取一行
  • 您最有可能想要了解泄漏机制,因为它会影响您的工作绩效。例如See theses Cloudera slides。然后,您将能够确定用例的最佳设置(大型和小型分割)。