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

  很多文档中描述,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.setNumMap">Tasks(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源代码):

  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://blog.csdn.net/yishao_20140413/article/details/24932655

时间: 2024-10-02 11:07:52

深度分析如何在Hadoop中控制Map的数量的相关文章

App营销案例分析 如何在APP中植入广告

中介交易 SEO诊断 淘宝客 云主机 技术大厅 你有使用过付费应用吗?在免费和付费应用这两者间,你更倾向于选择哪种呢?据Flurry报道,目前应用商店里90%的应用都是免费的,现在越来越多的应用正以广告补贴.应用内购买等形式换取用户的免费使用. Flurry的报告认为,由于前期开发成本很高,许多应用开发者无法实现盈利,必须转而依赖应用内购买或者广告的形式.我们相信是时候把话题的讨论从'应用内是否应该有广告'转移到'如何把应用内广告做得更有趣.与消费者联系更紧密,对广告主和开发者最有效'上来.既然

html-如何在页面中控制显示select的openion数量。。。。。。。。。。。

问题描述 如何在页面中控制显示select的openion数量........... 假如有10个数据.我想只显示5条,多的显示滚动条,有大神指点一下吗 解决方案 http://www.iefans.net/css3-shuxing-user-select-kongzhi-xuanze-fanwei/ 解决方案二: 如果你是指select(单选)弹出的下拉选项,那个控制不了,需要用前天插件模拟select,如select2 如果是多选,可以指定size属性 <select multiple si

如何在Java中选择Map/List/Set

简单版本 复杂版本 参考: http://initbinder.com/articles/cheat-sheet-for-selecting-maplistset-in-java.html http://www.sergiy.ca/guide-to-selecting-appropriate-map-collection-in-java/ 原文发布时间为:2012-04-16 本文来自合作伙伴CSDN博客,了解相关信息可以关注CSDN博客.

读取两文本-关于如何在Hadoop实现文本匹配

问题描述 关于如何在Hadoop实现文本匹配 你好,请问如何在Hadoop中进行大数据文本匹配呢? 我不知道怎么同时读取两个文本?然后在MapReduce中以怎样思路进行比较?请大家帮帮我. 说说流程就好,不胜感激.

《深入理解Hadoop(原书第2版)》——第2章 Hadoop中的概念 2.1 Hadoop简介

第2章 Hadoop中的概念 价格实惠的普通计算机经常满足不了应用程序的计算资源需求,很多企业的业务应用程序已经不再适合在单台廉价的计算机上运行.这时,一个简单昂贵的解决方案就是购买一些具有多CPU的高端服务器,这通常需要巨额资金.只要能买到最高端的服务器,这个解决方案就能够达到理想的效果,但预算往往是个大问题.另一个替代方案,就是搭建一个高可用的集群,这个集群经过专业的安装和精心的管理服务,使用起来就像一台计算机一样.很多高可用的集群都是企业专有的而且价格也十分贵. 为了获取所需的计算资源,一

spring-Java如何在Spring AOP中返回Map

问题描述 Java如何在Spring AOP中返回Map Java如何在Spring AOP中返回Map 各路Java业界大神,请帮小弟一把. 在spring mvc的控制器中,需要频繁返回Map来反应前端网页是否修改成功. 所以我就想做一个AOP控制所有的void delete*()等方法实现自动加上Map类型返回. 以下是未修改代码: @RequestMapping("delete") @ResponseBody public Map delete(Integer id){ Map

如何在c语言中控制时间啊,

问题描述 如何在c语言中控制时间啊, 例如,在运行时需要输入,如果过了时间,就不允许输入,该怎么弄,求大神帮忙 解决方案 这个问题可以用双线程也可以用双进程. 假设用双进程, 父进程计时间,到时间了就向子进程发送信号. 子进程收到进程不管scanf(当然或者其他输入数据的函数也可)是否收到数据 子进程一律终止. 事例代码如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <

hadoop中slot简介(map slot 和 reduce slot)

Slots是Hadoop的一个重要概念.然而在Hadoop相关论文,slots的阐述难以理解.网上关于slots的概念介绍也很少,而对于一个有经验的Hadoop开发者来说,他们可能脑子里已经理解了slots的真正含义,但却难以清楚地表达出来,Hadoop初学者听了还是云里雾里.我来尝试讲解一下,以期抛砖引玉. 首先,slot不是CPU的Core,也不是memory chip,它是一个逻辑概念,一个节点的slot的数量用来表示某个节点的资源的容量或者说是能力的大小,因而slot是 Hadoop的资

C# Winfrom项目,如何在from窗体中控制两个timer控件时间的同步显示

问题描述 C# Winfrom项目,如何在from窗体中控制两个timer控件时间的同步显示 在C# Winfrom项目中,一个from窗体,两个timer控件(timer1和timer2),两个Label控件(labe1和label2), timer1是实现0到1分钟的倒计时显示在显示labe1中,timer2是实现到1分钟后自动显示当前时间到label2中. 两个button控件(button1和button2).button1和button2分别控制timer1的开始和暂停. timer1