Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hadoop如何处理非常大的单个拆分文件_Hadoop_Split_Mapreduce - Fatal编程技术网

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

hadoop如何处理非常大的单个拆分文件,hadoop,split,mapreduce,Hadoop,Split,Mapreduce,假设每个映射器只能使用1GB堆大小,但是,块大小设置为10GB,每个拆分为10GB。映射程序如何读取较大的单个分割 映射程序是否会将输入缓冲到磁盘中,并以循环方式处理输入拆分 谢谢 映射器的总体模式非常简单: while not end of split (key, value) = RecordReader.next() (keyOut, valueOut) = map(key, value) RecordWriter.write(keyOut, valueOut) 通常前两个操

假设每个映射器只能使用1GB堆大小,但是,块大小设置为10GB,每个拆分为10GB。映射程序如何读取较大的单个分割

映射程序是否会将输入缓冲到磁盘中,并以循环方式处理输入拆分


谢谢

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

while not end of split
  (key, value) = RecordReader.next()
  (keyOut, valueOut) = map(key, value)
  RecordWriter.write(keyOut, valueOut)
通常前两个操作只关心记录的大小。例如,当要求
TextInputFormat
输入下一行时,它将字节存储在缓冲区中,直到找到下一行的末尾。然后清除缓冲区。等等

map的实现取决于您。如果你不把东西存储在你的映射器中,那么你就没事了。如果您希望它是有状态的,那么您可能会遇到麻烦。确保内存消耗是有限制的

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

因此,你的问题的答案是:是的,会很好

可能引起麻烦的是:

  • 大记录(指数级缓冲区增长+内存拷贝=>极大的内存开销)
  • 在映射器中存储来自上一个键/值的数据
  • 在自定义(输入|输出)格式实现中存储来自上一个键/值的数据(如果有)
如果您想了解更多信息,以下是一些入门要点:

  • 在中,您可以看到while循环
  • 在中,您可以看到
    TextInputFormat
  • 您很可能想了解泄漏机制,因为它会影响您的工作绩效。例如然后,您将能够决定适合您的用例的最佳设置(大拆分与小拆分)
感谢您的精彩解释。我最感兴趣的部分是通过mapper从磁盘读取到内存的分割。假设我们有1GB的内存,而映射器的内存是100MB(可以用来缓冲输入的部分)。是否会有1GB/100MB的访问磁盘次数来读取和处理整个拆分?谢谢你。基本上,RecordReader只关心当前记录,并将当前记录的字节数填充到下一个二次幂(指数增长)。它向InputStream请求下一个字节,如
DFSInputStream
。InputStream实现使用缓冲区来限制昂贵的IO操作(磁盘或网络)的数量,就像BufferedInputStream一样。缓冲区的大小由dfs控制。流缓冲区大小。图像已经消失,这可以帮助你。