(转)深度分析如何在Hadoop中控制Map的数量

标签: 深度 分析 hadoop | 发表时间:2014-11-03 14:07 | 作者:豆慧
出处:http://www.iteye.com
很 多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数决定。在默认情况下,最终input占据了多 少block,就应该启动多少个Mapper。如果输入的文件数量巨大,但是每个文件的size都小于HDFS的blockSize,那么会造成启动的 Mapper等于文件的数量(即每个文件都占据了一个block),那么很可能造成启动的Mapper数量超出限制而导致崩溃。这些逻辑确实是正确的,但 都是在默认情况下的逻辑。其实如果进行一些客户化的设置,就可以控制了。
在Hadoop中,设置Map task的数量不像设置Reduce task数量那样直接,即:不能够通过API直接精确的告诉Hadoop应该启动多少个Map task。
你 也许奇怪了,在API中不是提供了接口org.apache.hadoop.mapred.JobConf.setNumMapTasks(int n)吗?这个值难道不可以设置Map task的数量吗?这个API的确没错,在文档上解释”Note: This is only a hint to the framework.“,即这个值对Hadoop的框架来说仅仅是个提示,不起决定性的作用。也就是说,即便你设置了,也不一定得到你想要的效果。
1. InputFormat介绍
在具体设置Map task数量之前,非常有必要了解一下与Map-Reduce输入相关的基础知识。
这个接口(org.apache.hadoop.mapred.InputFormat)描述了Map-Reduce job的输入规格说明(input-specification),它将所有的输入文件分割成逻辑上的InputSplit,每一个InputSplit将会分给一个单独的mapper;它还提供RecordReader的具体实现,这个Reader从逻辑的InputSplit上获取input records并传给Mapper处理。
InputFormat有多种具体实现,诸如FileInputFormat(处理基于文件的输入的基础抽象类), DBInputFormat(处理基于数据库的输入,数据来自于一个能用SQL查询的表),KeyValueTextInputFormat(特 殊的FineInputFormat,处理Plain Text File,文件由回车或者回车换行符分割成行,每一行由key.value.separator.in.input.line分割成Key和 Value),CompositeInputFormat,DelegatingInputFormat等。在绝大多数应用场景中都会使用 FileInputFormat及其子类型。
通过以上的简单介绍,我们知道InputFormat决定着InputSplit,每个InputSplit会分配给一个单独的Mapper,因此InputFormat决定了具体的Map task数量。
2. FileInputFormat中影响Map数量的因素
在 日常使用中,FileInputFormat是最常用的InputFormat,它有很多具体的实现。以下分析的影响Map数量的因素仅对 FileInputFormat及其子类有效,其他非FileInputFormat可以去查看相应的 getSplits(JobConf job, int numSplits) 具体实现即可。
请看如下代码段(摘抄自org.apache.hadoop.mapred.FileInputFormat.getSplits,hadoop-0.20.205.0源代码):
long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits); 
long minSize = Math.max(job.getLong("mapred.min.split.size", 1), minSplitSize); 
 
for (FileStatus file: files) { 
  Path path = file.getPath(); 
  FileSystem fs = path.getFileSystem(job); 
  if ((length != 0) && isSplitable(fs, path)) {  
    long blockSize = file.getBlockSize(); 
    long splitSize = computeSplitSize(goalSize, minSize, blockSize); 
     
    long bytesRemaining = length; 
    while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { 
      String[] splitHosts = getSplitHosts(blkLocations,length-bytesRemaining, splitSize, clusterMap); 
      splits.add(new FileSplit(path, length-bytesRemaining, splitSize, splitHosts)); 
      bytesRemaining -= splitSize; 
    } 
 
    if (bytesRemaining != 0) { 
      splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining, blkLocations[blkLocations.length-1].getHosts())); 
    } 
  } else if (length != 0) { 
    String[] splitHosts = getSplitHosts(blkLocations,0,length,clusterMap); 
    splits.add(new FileSplit(path, 0, length, splitHosts)); 
  } else {  
    //Create empty hosts array for zero length files 
    splits.add(new FileSplit(path, 0, length, new String[0])); 
  } 

 
return splits.toArray(new FileSplit[splits.size()]); 
 
protected long computeSplitSize(long goalSize, long minSize, long blockSize) { 
    return Math.max(minSize, Math.min(goalSize, blockSize)); 

totalSize:是整个Map-Reduce job所有输入的总大小。
numSplits:来自job.getNumMapTasks(),即在job启动时用org.apache.hadoop.mapred.JobConf.setNumMapTasks(int n)设置的值,给M-R框架的Map数量的提示。
goalSize:是输入总大小与提示Map task数量的比值,即期望每个Mapper处理多少的数据,仅仅是期望,具体处理的数据数由下面的computeSplitSize决定。
minSplitSize:默认为1,可由子类复写函数protected void setMinSplitSize(long minSplitSize) 重新设置。一般情况下,都为1,特殊情况除外。
minSize:取的1和mapred.min.split.size中较大的一个。
blockSize:HDFS的块大小,默认为64M,一般大的HDFS都设置成128M。
splitSize:就是最终每个Split的大小,那么Map的数量基本上就是totalSize/splitSize。
接下来看看computeSplitSize的逻辑:首先在goalSize(期望每个Mapper处理的数据量)和HDFS的block size中取较小的,然后与mapred.min.split.size相比取较大的。
3. 如何调整Map的数量
有了2的分析,下面调整Map的数量就很容易了。
3.1 减小Map-Reduce job 启动时创建的Mapper数量
当处理大批量的大数据时,一种常见的情况是job启动的mapper数量太多而超出了系统限制,导致Hadoop抛出异常终止执行。解决这种异常的思路是减少mapper的数量。具体如下:
3.1.1 输入文件size巨大,但不是小文件
这 种情况可以通过增大每个mapper的input size,即增大minSize或者增大blockSize来减少所需的mapper的数量。增大blockSize通常不可行,因为当HDFS被 hadoop namenode -format之后,blockSize就已经确定了(由格式化时dfs.block.size决定),如果要更改blockSize,需要重新格式化 HDFS,这样当然会丢失已有的数据。所以通常情况下只能通过增大minSize,即增大mapred.min.split.size的值。

3.1.2 输入文件数量巨大,且都是小文件
所 谓小文件,就是单个文件的size小于blockSize。这种情况通过增大mapred.min.split.size不可行,需要使用 FileInputFormat衍生的CombineFileInputFormat将多个input path合并成一个InputSplit送给mapper处理,从而减少mapper的数量。具体细节稍后会更新并展开。

3.2 增加Map-Reduce job 启动时创建的Mapper数量
增加mapper的数量,可以通过减小每个mapper的输入做到,即减小blockSize或者减小mapred.min.split.size的值。

参考资料
http://yaseminavcular.blogspot.com/2011/06/how-to-set-number-of-maps-with-hadoop.html
http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.205.0

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [深度 分析 hadoop] 推荐:

(转)深度分析如何在Hadoop中控制Map的数量

- - 互联网 - ITeye博客
很 多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数决定. 在默认情况下,最终input占据了多 少block,就应该启动多少个Mapper. 如果输入的文件数量巨大,但是每个文件的size都小于HDFS的blockSize,那么会造成启动的 Mapper等于文件的数量(即每个文件都占据了一个block),那么很可能造成启动的Mapper数量超出限制而导致崩溃.

对Hadoop的SWOT分析

- - ITeye博客
在当前大数据研究与应用如火如荼的时代,Hadoop毅然成为业界的翘楚. 我想本着客观的态度,从旁观者的角度分析当前Hadoop所面对的机遇与挑战. 在我的认识中,SWOT分析还算全面,所以就选择这样的分析思路. 当然,我分析Hadoop的初衷是我认同Hadoop所代表的方向,但不具体只是Hadoop这个产品.

Hadoop Metrics体系架构分析

- - 非技术 - ITeye博客
原文: http://blog.csdn.net/chenpingbupt/article/details/7957396. 本文基于Hadoop 0.20.XX版本分析,和现在的Metrics2稍有不同. Hadoop Metrics用来统计集群运行数据,比如接口调用次数,响应时间,队列长度等等,现阶段(0.19版本)支持为数不多的几个层级的数据,分别是dfs,jvm,rpc,mepred等.

HBase性能深度分析

- Rubby - 《程序员》杂志官网
HBase作为BigTable的一个开源实现,随着其应用的普及,用户对它的性能数据愈发关注. 本文将为您揭开HBase性能测试的一角,邀您一起参与到对云计算模块性能调优的深度思考中. 对于BigTable类型的分布式数据库应用来说,用户往往会对其性能状况有极大的兴趣,这其中又对实时数据插入性能更为关注.

Hadoop Metrics体系分析之三:构建自己的Metrics

- - Taobao QA Team
大型分布式系统中需要metrics来了解系统状态已成为系统必需的功能之一. 其实测试系统甚至测试用例中也同样需要metrics. 通过这些指标我们可以了解测试的进度、状况、以及一些过程情况,比如性能指标和一些无法用是否判断数据. 下面我们就用一个简单的例子来看看如何使用hadoop metrics.

Kylin:基于Hadoop的开源数据仓库OLAP分析引擎

- - 标点符
Kylin是一个开源、分布式的OLAP分析引擎,它由eBay公司开发,并且基于Hadoop提供了SQL接口和OLAP接口,能够支持TB到PB级别的数据量. OLAP即联机分析处理,它能够帮助分析人员、管理人员或执行人员从多角度快速、一致、交互地存取信息和更加深入的了解信息. OLAP的目标是满足决策支持或者满足在多维环境下特定的查询和报表需求.

hadoop编程:分析CSDN注册邮箱分布情况

- - CSDN博客云计算推荐文章
hadoop编程:分析CSDN注册邮箱分布情况. 本文博客链接: http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 主机:Ubuntu10.04. hadoop版本:1.2.1. 开发工具:eclipse4.4.0. 要求:原始数据共6428632条,分析不同邮箱的注册情况,并按使用人数从大到小排序.

Hadoop集群硬盘故障分析与自动化修复

- - CSDN博客推荐文章
作者:Zhang, Haohao. 硬盘在服务器中起着至关重要的作用,因为硬盘里面存储的是数据,随着制造业技术的提高,硬盘的类型也在逐渐的改变. 对于硬盘的管理是IAAS部门的责任,但作为业务运维也需要懂得相关的技术. 有的公司采用LVM来管理硬盘,这样做方便扩缩容,也有的公司直接用裸盘来存数据,这样做的好处是不会因LVM而损失掉一部分硬盘I/O速度.

X-RIME: 基于Hadoop的开源大规模社交网络分析工具

- - 并行实验室 | Parallel Labs
文 / 陈冠诚,史巨伟,杨博(IBM中国研究院),杨寅(人民搜索). 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter,人人,微博等为代表的新型社交网站. 这些网站用户数量的迅速增长使得海量的用户数据不断被产生出来,而如何有效地对这些海量的用户数据进行社交网络分析(Social Network Analysis)正成为一个越来越热门的问题.

深度分析:Googorola时代的RIM

- bill - cnBeta.COM
黑莓手机和PlayBook平板电脑的制造商 RIM无疑是这次Google 收购Motorola 移动最大的利益受损者之一. Google以125亿美元收购摩托罗拉这一举动可以说把已经在智能手机市场上逐渐丧失地位的RIM逼到了墙角.