Map/Reduce的内存使用设置

一、背景

今天采用10台异构的机器做测试,对500G的数据进行运算分析,业务比较简单,集群机器的结构如下:

A:双核CPU×1、500G硬盘×1,内存2G×1(Slaver),5台

B:四核CPU×2、500G硬盘×2,内存4G×2(Slaver),4台

C:四核CPU×2、500G硬盘×2,内存4G×8(Master),1台

软件采用Hadoop 0.20.2,Linux操作系统。

二、过程

1、制造了500G的数据存放到集群中。

2、修改配置,主要是并发的Map和Reduce数量。修改如下图:

Map/Reduce的内存使用设置_第1张图片

3、修改mapred-site.xml配置文件中的mapred.child.java.opts参数为-Xmx2046m

4、启动Job,半路出现了Cannot allocate memory错误,明显是内存分配不够。细看报错的机器,是A类机器报此错误。

5、修改A类机器的mapred-site.xml配置文件,将mapred.child.java.opts修改为-Xmx1024m,运行Job,错误消失。

三、分析总结

1、第一次采用这么少的机器处理500G的数据,确实在配置优化上需要做对应的调整。

2、Map的数量和CPU的核数也有直接关系。一般来说最好不要高于CPU的核数。(CPU是4核,并发数最好设置为4).

3、通过调整得出一个简单的公式:Map的并发数量(需要不大于CPU核数)×mapred.child.java.opts < 该节点机器的总内存。

4、当然并发数大于内存或CPU核数也可以,但是有些风险,Task执行错误的风险。

5、计算的能力还是和硬件性能有关系,硬件越好,计算的效率还是很高的。当然差的机器也能使用,添砖加瓦一起干总是好的。

6、如果集群是异构的机器,那么还是建议每台机器做不同的配置参数。统一化的配置还是比较适合同构集群。

7、一些统一的参数也可以通过MR的代码用conf.set(key,value);的方式来设置。

8、有些时候没写东西了,最近事情比较多。如果有疑问还是很欢迎大家发邮件讨论:[email protected]

你可能感兴趣的:(hadoop,linux,优化,制造,集群,测试)