我是 hadoop 的新手,我正在使用集群中的 3 个节点(每个节点都有 2GB RAM)。输入文件很小(5 MB),但地图输出非常大(大约 6 GB)。
在地图阶段,我的内存变满了,任务运行得很慢。它的原因是什么?
谁能帮助我如何使我的程序更快?
我是 hadoop 的新手,我正在使用集群中的 3 个节点(每个节点都有 2GB RAM)。输入文件很小(5 MB),但地图输出非常大(大约 6 GB)。
在地图阶段,我的内存变满了,任务运行得很慢。它的原因是什么?
谁能帮助我如何使我的程序更快?
使用 NLineInputFormat ,其中 N 是指每个映射器将接收的输入行数。通过这种方式,您可以创建更多的拆分,从而将较小的输入数据强制分配给每个映射器任务。如果没有,整个 5 MB 将进入一个 Map 任务。
map 输出的大小本身不会导致内存问题,因为 mapper 可以在“流”模式下工作。它使用记录,处理它们并写入输出。Hadoop 会在内存中存储一些数据,然后将其溢出到磁盘。
所以你的问题可能是由以下两者之一引起的:
a)你的映射器算法在处理过程中以某种方式积累数据。b) 给映射器的累积内存小于节点的 RAM。然后操作系统开始交换,您的性能可能会下降几个数量级。
情况 b 的可能性更大,因为 2 GB 实际上对于通常的 hadoop 配置来说太少了。如果您要处理它 - 我建议配置 1 个,每个节点最多 2 个映射器插槽。