Jamzy Wang

life is a struggle,be willing to do,be happy to bear~~~

如何确定map和reduce的任务数

2015-02-28 19:29

原创声明:本作品采用知识共享署名-非商业性使用 3.0 版本许可协议进行许可,欢迎转载,演绎,但是必须保留本文的署名(包含链接),且不得用于商业目的。

如何确定 map任务数

确定map任务数时依次优先参考如下几个原则:

(1) 每个map任务使用的内存不超过800M,建议在500M以下

假设处理256MB数据需要的时间为10分钟,内存为800MB,此时如果处理128MB时,内存可以减小为400MB,则建议选择每一个map的处理数据量为128MB

(2) 每个map任务运行时间控制在大约20分钟,最好1-3分钟

假设处理256MB数据需要的时间为30分钟,内存为200MB,则应该考虑减小map的计算时间,比如将每一个map的处理数据量设置为128MB,将时间减小为15分钟。

(3) 每个map任务处理的最大数据量为一个HDFS块大小(比如64MB,128MB,256MB),一个map任务处理的输入不能跨文件

假设一个HDFS块大小为256MB,指定map任务数为N,输入数据总量为S。如果 S/N > 256MB,平台会自动增加map任务数使每个map任务处理数据量不超过256MB;如果 S/N < 256MB,平台认为每个map任务最多处理S/N大小的数据,但是一个map任务的输入不能跨文件,所以可能有的文件切分到最后一部分时较小于S/N,那么下一个map任务的输入小于平均,最终的map任务数大于N。最终实际运行的map任务数可以在JobTracker监控页面查看。

(4) map任务总数不超过平台可用的任务槽位

如果在一个map处理256MB时就能将平台可用的任务槽位占满,此时不应该再增加map任务数。假设集群有N个tasktracker,jobtracker让tasktracker每隔 5 + N/100 秒汇报一次心跳,一次心跳最多分配1map + 1reduce。如果map运行时间小于心跳间隔时,那么tasktracker上始终没有足够数量的map任务运行,这样的设置将导致槽位不能被利用满。

如何确定 reduce任务数

确定reduce任务数时依次优先参考如下几个方面:

(1) 每个reduce任务使用的内存不超过800M,尽量在500M以下

(2) 每个reduce任务运行时间控制在大约20分钟,最好1-3分钟

(3) 整个reduce阶段的输入数据总量

reduce的输入是map的输出,整个reduce阶段的输入数据总量就是所有map任务的输出数据总量,如果map输出的中间结果较大,推荐使用lzo进行压缩

(4) 每个reduce任务处理的数据量控制在500MB以内

由于一个reducer处理的数据会按照key进行排序,每个reduce任务处理数据量过大会导致shuffle和排序时间很长

(5) map任务数与reduce任务数的乘积

在reduce的shuffle阶段每一个reducer需要到多个mapper去用tcp连接来下载自己要处理的数据。如果map任务数和reduce任务数乘积较大,可能造成需要建立过多的tcp连接,如果每一次连接传输数据又很少,就会导致reduce的 shuffle时间很长。建议每个reduce的一次连接下载的数据量 = map输出数据总量 /(map数*reduce数)不要小于100KB。

(6) 输出数据要求

如果reduce计算后的结果数据用于下一次MapReduce计算,或者结果文件不宜太小,那么在满足或者大致满足以上原则的前提下,可以调小reduce任务数,以便每一个reduce任务数的输出不会太小。

Comments