hadoop如何处理非常大的单个拆分文件
假设每个映射器只能使用1GB堆大小,但是,块大小设置为10GB,每个拆分为10GB。映射程序如何读取较大的单个分割 映射程序是否会将输入缓冲到磁盘中,并以循环方式处理输入拆分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) 通常前两个操
谢谢 映射器的总体模式非常简单:
while not end of split
(key, value) = RecordReader.next()
(keyOut, valueOut) = map(key, value)
RecordWriter.write(keyOut, valueOut)
通常前两个操作只关心记录的大小。例如,当要求TextInputFormat
输入下一行时,它将字节存储在缓冲区中,直到找到下一行的末尾。然后清除缓冲区。等等
map的实现取决于您。如果你不把东西存储在你的映射器中,那么你就没事了。如果您希望它是有状态的,那么您可能会遇到麻烦。确保内存消耗是有限制的
在最后一步中,映射程序编写的键和值存储在内存中。然后对它们进行分区和排序。如果内存中的缓冲区已满,则其内容将溢出到磁盘(最终还是会溢出,因为即使映射器消失,还原程序也需要能够下载分区文件)
因此,你的问题的答案是:是的,会很好
可能引起麻烦的是:
- 大记录(指数级缓冲区增长+内存拷贝=>极大的内存开销)
- 在映射器中存储来自上一个键/值的数据
- 在自定义(输入|输出)格式实现中存储来自上一个键/值的数据(如果有)
- 在中,您可以看到while循环
- 在中,您可以看到
TextInputFormat
- 您很可能想了解泄漏机制,因为它会影响您的工作绩效。例如然后,您将能够决定适合您的用例的最佳设置(大拆分与小拆分)李>
DFSInputStream
。InputStream实现使用缓冲区来限制昂贵的IO操作(磁盘或网络)的数量,就像BufferedInputStream一样。缓冲区的大小由dfs控制。流缓冲区大小。图像已经消失,这可以帮助你。