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