您的位置:首页 > 运维架构

关于Hadoop分布式计算:多个Map分布在不同节点上执行

2016-07-16 19:16 281 查看
1 背景&问题

学习Hadoop已经快一年了,也是似懂非懂的样子。由于项目的原因,再次启动Hadoop,一直以为这个很简单就能够实现多个机器一起完成一个任务,其实并不然。在实验过程中,发现Map的数量并不能通过设置“mapreduce.job.maps"来改变,这方面的资料也有很多。而且最大问题是,只有当输入文件分块达到8时才会出现7个分布在一个节点上,另外一个分布在另一个节点上。这个是与资源申请有关“Containers”(具体可以参考牛人“董的博客”),每个节点最多能容纳8个Containers(可以通过web查看),大致解释是一个Job对应一个Containers,然后每个Map也是。但是输入文件分块多,导致map数量变多,这样消耗的时间会更多。怎么才能做到多个Map比较均匀分布在不同的机器上呢?

2 解决过程

第一章中,已经描述了,只有分块很多时,才能分布在不同节点上,但这并不是有效的方法。于是抱着尝试的心态“如果有多个Job呢,每个Job分成3个Map(用3个输入文件),能不能达到并行的效果”。今天,做了几个实验,猜对了,比如:6000条记录放在一个文本里,只有一个Map执行;如果将6000行纪录分割成6部分,两个Job分别处理3个小文件。同时执行这两任务,第一个测试耗时:10185s,第二个测试耗时:7572s。下图是将6000条记录分成3个Job每个Job对应4个小文件(当作四个splits),执行3个Job任务如下:



每个节点上均分配了4个Map任务,另外3个是ApplicationMaster,这里不讨论。

2.1 201610

发现上述方法治标不治本,于是又查找资料,只需修改yarn-site.xml配置文件即可,关于这些参数说明,网上资源还是很多,这里先不多说了,后续。

<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256<alue>
</property>

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>


一个节点上运行的任务数目主要由两个因素决定,一个是NodeManager可使用的资源总量,一个是单个任务的资源需求量,比如一个NodeManager上可用资源为8 GB内存,8 cpu,单个任务资源需求量为1 GB内存,1cpu,则该节点最多运行8个任务。NodeManager上可用资源是由管理员在配置文件yarn-site.xml中配置的,相关参数如下:

yarn.nodemanager.resource.memory-mb:总的可用物理内存量,默认是8096

yarn.nodemanager.resource.cpu-vcores:总的可用CPU数目,默认是8
对于任务的相关参数如下:

yarn.scheduler.minimum-allocation-mb:最小可申请内存量,默认是1024

yarn.scheduler.minimum-allocation-vcores:最小可申请CPU数,默认是1

yarn.scheduler.maximum-allocation-mb:最大可申请内存量,默认是8096

yarn.scheduler.maximum-allocation-vcores:最大可申请CPU数,默认是4

3 总结

后面继续把数据量增多,感觉这样做还可以。因为网上谈这方面基本没有,所以先把思路纪录下来,后面再把实验进行可视化,进一步证明这样做的可行性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Hadoop 分布式计算