设为首页 加入收藏

TOP

hadoop淘宝的一些情况
2018-12-12 00:53:26 】 浏览:97
Tags:hadoop 一些 情况

转自:http://cloud.hdu.edu.cn/wiki/index.php/Hadoop

第一期:淘宝Hadoop集群的概况

国内外使用Hadoop的公司比较多,全球最大的Hadoop集群在雅虎,有大约25,000个节点,主要用于支持广告系统与网页搜索。国内用Hadoop的主要有百度、淘宝、网易、华为、中国移动等,其中淘宝的Hadoop集群属于较大的(如果不是最大)。

淘宝Hadoop集群现在超过1700个节点,服务于用于整个阿里巴巴集团各部门,数据来源于各部门产品的线上数据库(Oracle, MySQL)备份,系统日志以及爬虫数据,截止2011年9月,数量总量已经超过17个PB,每天净增长20T左右。每天在Hadoop集群运行的MapReduce任务有超过4万(有时会超过6万),其中大部分任务是每天定期执行的统计任务,例如数据魔方、量子统计、推荐系统、排行榜等等。这些任务一般在凌晨1点左右开始执行,3-4个小时内全部完成。每天读数据在2PB左右,写数据在1PB左右。



Hadoop包括两类节点Master和Slave节点,

  • Master节点包括Jobtracker,Namenode, SecondName, Standby,
    • 硬件配置:16CPU*4核,96G内存。
  • Slave节点主要是TaskTracker和DataNode,
    • 硬件配置存在一定的差别:8CPU*4核-16CPU*4核,16G-24G内存
    • (注:通常是一个slave节点同时是TaskTracker和DataNode,目的是提高数据本地性data locality)。
    • 每个slave节点会划分成12~24个slots。整个集群约34,916个slots,其中Map slots是19,643个,Reduce slots是15,273个

所有作业会进行分成多个Group,按照部门或小组划分,总共有38个Group。整个集群的资源也是按各个Group进行划分,定义每个Group的最大并发任务数,Map slots与Reduce slots的使用上限。每个作业只能使用自己组的slots资源。


第二期:淘宝MapReduce作业特性分析

集群作业特性总体分析

  • 大部分是小作业,大多数运行几分钟或十几分钟.绝大多数在半小时之内。占用的slot数一般为几十到几百。
  • 集群同时在运行的作业数比较多。繁忙的时候同时运行的作业有六百多个, 每天完成的作业数万个。
  • 有些作业被分析多个要求顺序执行的小作业。各作业的依赖性比较大, 后面一组作业的开始时间受限前一组作业的结束时间
  • Map slots与Reduce slots使用率不高,特别是Reduce Slots。
  • 作业周期性比较明显,每个晚上1点到5点左右,集群处于相对忙的状态,白天很空闲。
  • 作业时效性要求较强。大部分作业要求在上午8点前执行结束,特别是涉及前端产品,如量子统计、数据魔方等业务的作业。如果上班前作业没有执行完毕,会招来用户投诉。
  • 为保证某些重要部门的作业及时完成,Hadoop集群资源按公司部门来划分使用,每个部门都一个资源使用量上限,某剖门里的作业只能在他所有部门的配给中申请资源。同一部门的作业资源使用总量不能超过那个上限。这点容易造成有些部门的资源很紧张,而某些部门的资源还有空余。
  • 作业是有优先级,集群总是优先执行优先级高的作业,会发生资源抢占。杀掉某些低优先级的task,获得空闲slots。而且,与Hadoop自带的公平调度器不同,当某个TT有空闲slots时,不是分配给最缺乏slot的那个job,而是分配给优先级最高的job。

Job size.jpg


第三期:Hadoop调度器Scheduler面临的特殊挑战

淘宝Hadoop集群中MapReduce作业的特性已经在第二期专题中阐述,详见作业特性分析
基于以上这些作业特点,在设计Hadoop集群时,特别是设计调度算法时,会遇到很大的挑战。

  • 同时运行的作业数多, 调度算法的效率需要非常高。调度器的效率是个关键。
  • 调度算法的公平性设计要求非常高。为节约成本,集团各部门共用这一个Hadoop集群,然而作业优先级分配,以及slots数量的分配都比较繁琐,对调度空的公平性要求较高。
  • 同时运行的作业数多, JobTracker的性能要求非常高

第四期:详解Slots的含义

Slots是Hadoop的一个重要概念。然而在Hadoop相关论文,slots的阐述难以理解。网上关于slots的概念介绍也很少,而对于一个有经验的Hadoop开发者来说,他们可能脑子里已经理解了slots的真正含义,但却难以清楚地表达出来,Hadoop初学者听了还是云里雾里。我来尝试讲解一下,以期抛砖引玉。

  • 首先,slot不是CPU的Core,也不是memory chip,它是一个逻辑概念,一个节点的slot的数量用来表示某个节点的资源的容量或者说是能力的大小,因而slot是 Hadoop的资源单位。
  • Hadoop利用slots来管理分配节点的资源。每个Job申请资源以slots为单位,每个节点会确定自己的计算能力以及memory确定自己包含的slots总量。当某个Job要开始执行时,先向JobTracker申请slots,JobTracker分配空闲的slots,Job再占用slots,Job结束后,归还slots。
  • 每个TaskTracker定期(例如淘宝Hadoop心跳周期是5s)通过心跳(hearbeat)与Jobtracker通信,一方面汇报自己当前工作状态,JobTracker得够某个TaskTracker是否Alive;同时汇报自身空闲slots数量。JobTracker利用某个调度规则,如Hadoop默认调度器FIFO或者Capacity Scheduler、FairScheduler等。(注:淘宝Hadoop使用云梯调度器YuntiScheuler,它是基于Fair Scheduler进行修改的,具体针对哪些点进行了修改,下次再介绍)。
  • Hadoop里有两种slots, map slots和reduce slots,map task使用map slots,一一对应,reduce task使用reduce slots。注:现在越来越多的观点认为应该打破map slots与 reduce slots的界限,应该被视为统一的资源池,they are all resource,从而提高资源的利用率。区分map slots和reduce slots,容易导致某一种资源紧张,而另一个资源却有空闲。在Hadoop的下一代框架MapR中,已经取消了map slots与reduce slots的概念,并将Jobtracker的功能一分为二,用ResourceManager来管理节点资源,用ApplicationMaster来监控与调度作业。ApplicationMaster是每个Application都有一个单独的实例,application是用户提交的一组任务,它可以是一个或多个job的任务组成。
  • Hadoop中通常每个tasktracker会包含多个slots,Job的一个task均对应于tasktracker中的一个slot。系统中map slots总数与reducer slots总数的计算公式如下:
    • Map slots总数=集群节点数×mapred.tasktracker.map.tasks.maximum
    • Reducer slots总数=集群节点数×mapred.tasktracker.reduce.tasks.maximum
  • 最后,如何确定一个集群map slots以及reduce slots?
    • 请参考 hadoop mapreduce tutorial

http://hadoop.apache.org/common/docs/current/mapred_tutorial.html


第五期:为什么Job会Failed

淘宝Hadoop集群每天运行几万个作业,总有几百个Job是Failed。关于Job的Failed的原因,网上相关资料不多,大部分是讨论task Failed的原因。在这里,我简单归纳下Job Failed的几个原因。

  • 当Job的某个Task失败后,重复尝试多次,(默认是4,这可以通过"mapred.map.max.attempts"和"mapred.reduce.max.attempts"属性来设置)。如果多次尝试后仍然未能完成,这时整个Job会失败。
    • 可以通过增大最大task失败数" mapred.max.max.tracker.failures"来提高稳定性,但是如果有太多task失败, 那么job执行的性能也会降低。
  • 用户提交的作业程序有问题或者作业配置文件有问题,也会导致Job 失败。
    • mapred.child.java.opts配置值比io.sort.mb小job会失败:mapred.child.java.opts表示map/reduce子虚拟机使用的堆,io.sort.mb是排序时的内存上限
    • hadoop-0.20.x版本中一些配置项如果不当的话,也会导致Job Failed:例如服务器端配置参数以及JobConf的配置参数:
  1. mapred.cluster.map.memory.mb 这是服务器分配给一个map slots内存大小;
  2. mapred.cluster.reduce.memory.mb 这是服务器分配给一个reduce slots内存大小;
  3. mapred.cluster.max.map.memory.mb 这是服务器允许TT上运行的最大map内存大小
  4. mapred.cluster.max.reduce.memory.mb 这是服务器允许TT上运行的最大reduce内存大小;
  5. mapred.job.map.memory.mb 这是用户提交Job时配置所需map内存大小;
  6. mapred.job.reduce.memory.mb 这是用户提交Job时配置所需reduce内存大小;
  • 解释:如果上面(1)—(6)都有配置,而(5)中配置值大于(3)或(6)中的配置值大于(4),JobTracker就会拒绝用户提交的这个Job,Job就会失败,另外(1)—(4)配置项都配置了值,而(5)、(6)没配置,则Job也会被拒绝运行,从而导致Job失败。

事实上,job失败时的大部分是由于task 的失败而导致的。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hadoop常见shell操作 下一篇Hadoop误删除恢复

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目