`
cloudeagle_bupt
  • 浏览: 540527 次
文章分类
社区版块
存档分类
最新评论

JobTracker在集群规模扩大后可扩展性瓶颈~

 
阅读更多

当hadoop集群规模很小的时候,比如100台,200台,300台的时候,可能 一切看上去都很好,jobtracker分配task到计算槽位非常高效,集群的槽位资源在计算多的时候基本能够打满,所以集群的利用率非常高,一切看上 去都运转良好。在这种情况下,当计算越来越多,提交作业的人越来越多,集群的计算槽位逐渐无法满足需求的时候,大多数人第一个想到的解决办法就是:加机 器。的确,hadoop设计上的优秀和可扩展性可以方便的让集群管理员对集群增删机器,所以当集群计算资源紧缺,又有空闲的机器可用时,集群管理员很容易 想到给集群加机器来解决这个问题。当加入的机器不多,比如给原本300台的集群再加50台,可能仍然没有问题,集群的计算槽位增多 了,jobtracker能调度的槽位也多了,集群里能并行的map数和reduce数也增多了。但是,当集群规模扩大到一定程度,比如1200台,再往 上加机器,会发现计算作业没有增多,本应该运行的更快的作业并没有比预期的快,有时候甚至跟加机器前跑的一样,集群的槽位是变多了,但是被调度用来跑 task的槽位总是用不满,jobtracker的cpu使用率始终保持100%,但是集群的计算槽位总是达不到饱和,即使集群在最繁忙的时候,槽位的使 用率也只能达到比如60%,每一个时刻总有一部分的计算槽位是空闲的但是无法往上分配task任务。这就不得不让人怀疑hadoop的程序实现到了这个规 模的时候,触发了某些瓶颈,造成这种现象。


发现了这种情况后,在一个1100台机器的集群jobtracker上每隔一秒钟输出一次的 jobtracker进程jstack日志,持续输出一分钟,只要能获取jobtracker内每秒钟都在处理哪些调用,哪些是被BLOCK住的,就能发 现jobtracker中的调用瓶颈了。根据所有60份 jstack日志的统计可以看出如下现象:

  • 从所有jstack日志中,每一秒钟由于 jobtracker对象锁而被BLOCK住的heartbeat调用有41 ~ 42次,而由于tasktracker汇报心跳的时间间隔是jobtracker根据集群 规模计算出来的,在我的hadoop员jobtracker程序中计算方法为:ceil(cluster_size / 50),所以jobtracker计算出来的tasktracker平均心跳间隔为: ceil(1100 / 50) = 22秒钟。而按照集群现有的规模1100台机 器,1100 / 21 =52 次。这就说明,平均每一秒钟会有52次左右的 tasktracker的heartbeat调用发送到jobtracker,而平均每秒钟被jobtracker对象锁BLOCK住的为42次。因此在 现有集群规模和计算规模下,平均每秒jobtracker只能处理10个heartbeat, 也就是为10台tasktracker分配task任务,而其他的都被BLOCK住了。
  • 同样,每个tasktracker上都会有一个 MapEventsFetcherThread来从jobtracker获取map完成的信 息,以决定是否获取map完成后的output数据,这最终会调用jobtracker中的getTaskCompletionEvents2方法,该方 法也是对jobtracker加同步锁的方法,从jstack日志统计,平均没秒钟有56次getTaskCompletionEvents 的调用由于jobtracker的对象锁原因被BLOCK住,造成的后果是这些调用所来自的tasktracker上的reduce task无法开始shuffle数据,task运行进程被托慢。
  • 同样,jobtracker中还有多个方法调用 都存在该对象的对象锁问题,造成jobtracker本身的scalability无法提高, 而如果jobtracker的这种synchronized方法中还涉及到hdfs文件的读写访问,效率就会更加低,甚至会出现jobtracker对象 锁由于hdfs访问发生问题而无法释放,导致jobtracker无法正常调度的问题,前几天出现的tasktracker集体下线经检查也非常有可能就 是这种原因造成的。


所以,jobtracker本身的scalability存在严重的性能瓶颈,这肯定是 jobtracker目前调度任务低效,槽位无法用满的原因之一。

同时,有些jobtracker的synchronized方法内部还会有hfds文件的读写操 作,一旦某个时刻hdfs发生异常,而此时刚好jobtracker进入到这种调用(如submitJob),那么就会导致jobtracker在被 synchronized以后,等待hdfs访问的返回,这中间的时间jobtracker无法处理heartbeat,也就无法调度task任务,如果 tasktracker自动下线时间比较短(默认为10分钟),比如3分钟,甚至有可能发生tasktracker大批量自动下线的情况。

所以从cpu相关的指标来 看,jobtracker的cpu在平常的调度中单核一直是处于99%的状态,且jobtracker并没有把多核用包合,很多 的时候都block在了一个核上,cpu的使用效率不高。这也是制约集群扩容的一个非常大的瓶颈所在,如果集群继续扩大到2000左右,那么 jobtracker每秒被BLOCK住的heartbeat和getTaskCompletionEvents2以及其他同步锁操作会更多,调度的效率 会更加底下,介时可能更多的计算节点的加入意义就不大了。

知道了原因之后,接下来就该考虑如何解决。要解决jobtracker的scalability 问题,最大的修改之处就在于JobTracker.java类中许多类方法的synchronized加锁力度过大,有的调用甚至不需要进行同步,最严重 的地方为两处,就是上面提到的:

  1. JobTracker.submitJob
  2. JobTracker.getTaskCompletionEvents


这两处调用中不仅对jobtracker加锁, 而且还有hdfs文件的读写访问,最容易造成jobtracker的使用率下降甚至jobtracker服务延迟。而submigJob中需要对 JobInProgress进行初始化,该初始化中涉及到了hdfs文件的读写,效率很慢,对jobtrakcer的加锁时间就变得很长。

另外,还有 getMapTaskReports(), getReduceTaskReports(), getCleanupTaskReports(), getSetupTaskReports(),这些调用,当job还没有被init的时候,是无须进行接下来的操作的,由于这些方法也都是 jobtracker的synchronized方法,所以当job != null时,增加对job.inited()的判断也能够提高jobtracker的同步锁效率。

  1. 将这些方法的锁力度细化
  2. 去掉某些不必要的同步锁
  3. 将存在hdfs访问的操作移出 jobtracker的同步锁之外


通过这一系列的优化,jobtracker的调度效率应该可以大大提高,具体对比数据有待进一步 测试。jobtracker的调度效率提高,意味这可以为集群加入更多的机器而不会造成资源浪费,这可都是成本啊!血的教训……

当hadoop集群规模很小的时候,比如100台,200台,300台的时候,可能 一切看上去都很好,jobtracker分配task到计算槽位非常高效,集群的槽位资源在计算多的时候基本能够打满,所以集群的利用率非常高,一切看上 去都运转良好。在这种情况下,当计算越来越多,提交作业的人越来越多,集群的计算槽位逐渐无法满足需求的时候,大多数人第一个想到的解决办法就是:加机 器。的确,hadoop设计上的优秀和可扩展性可以方便的让集群管理员对集群增删机器,所以当集群计算资源紧缺,又有空闲的机器可用时,集群管理员很容易 想到给集群加机器来解决这个问题。当加入的机器不多,比如给原本300台的集群再加50台,可能仍然没有问题,集群的计算槽位增多 了,jobtracker能调度的槽位也多了,集群里能并行的map数和reduce数也增多了。但是,当集群规模扩大到一定程度,比如1200台,再往 上加机器,会发现计算作业没有增多,本应该运行的更快的作业并没有比预期的快,有时候甚至跟加机器前跑的一样,集群的槽位是变多了,但是被调度用来跑 task的槽位总是用不满,jobtracker的cpu使用率始终保持100%,但是集群的计算槽位总是达不到饱和,即使集群在最繁忙的时候,槽位的使 用率也只能达到比如60%,每一个时刻总有一部分的计算槽位是空闲的但是无法往上分配task任务。这就不得不让人怀疑hadoop的程序实现到了这个规 模的时候,触发了某些瓶颈,造成这种现象。


发现了这种情况后,在一个1100台机器的集群jobtracker上每隔一秒钟输出一次的 jobtracker进程jstack日志,持续输出一分钟,只要能获取jobtracker内每秒钟都在处理哪些调用,哪些是被BLOCK住的,就能发 现jobtracker中的调用瓶颈了。根据所有60份 jstack日志的统计可以看出如下现象:

  • 从所有jstack日志中,每一秒钟由于 jobtracker对象锁而被BLOCK住的heartbeat调用有41 ~ 42次,而由于tasktracker汇报心跳的时间间隔是jobtracker根据集群 规模计算出来的,在我的hadoop员jobtracker程序中计算方法为:ceil(cluster_size / 50),所以jobtracker计算出来的tasktracker平均心跳间隔为: ceil(1100 / 50) = 22秒钟。而按照集群现有的规模1100台机 器,1100 / 21 =52 次。这就说明,平均每一秒钟会有52次左右的 tasktracker的heartbeat调用发送到jobtracker,而平均每秒钟被jobtracker对象锁BLOCK住的为42次。因此在 现有集群规模和计算规模下,平均每秒jobtracker只能处理10个heartbeat, 也就是为10台tasktracker分配task任务,而其他的都被BLOCK住了。
  • 同样,每个tasktracker上都会有一个 MapEventsFetcherThread来从jobtracker获取map完成的信 息,以决定是否获取map完成后的output数据,这最终会调用jobtracker中的getTaskCompletionEvents2方法,该方 法也是对jobtracker加同步锁的方法,从jstack日志统计,平均没秒钟有56次getTaskCompletionEvents 的调用由于jobtracker的对象锁原因被BLOCK住,造成的后果是这些调用所来自的tasktracker上的reduce task无法开始shuffle数据,task运行进程被托慢。
  • 同样,jobtracker中还有多个方法调用 都存在该对象的对象锁问题,造成jobtracker本身的scalability无法提高, 而如果jobtracker的这种synchronized方法中还涉及到hdfs文件的读写访问,效率就会更加低,甚至会出现jobtracker对象 锁由于hdfs访问发生问题而无法释放,导致jobtracker无法正常调度的问题,前几天出现的tasktracker集体下线经检查也非常有可能就 是这种原因造成的。


所以,jobtracker本身的scalability存在严重的性能瓶颈,这肯定是 jobtracker目前调度任务低效,槽位无法用满的原因之一。

同时,有些jobtracker的synchronized方法内部还会有hfds文件的读写操 作,一旦某个时刻hdfs发生异常,而此时刚好jobtracker进入到这种调用(如submitJob),那么就会导致jobtracker在被 synchronized以后,等待hdfs访问的返回,这中间的时间jobtracker无法处理heartbeat,也就无法调度task任务,如果 tasktracker自动下线时间比较短(默认为10分钟),比如3分钟,甚至有可能发生tasktracker大批量自动下线的情况。

所以从cpu相关的指标来 看,jobtracker的cpu在平常的调度中单核一直是处于99%的状态,且jobtracker并没有把多核用包合,很多 的时候都block在了一个核上,cpu的使用效率不高。这也是制约集群扩容的一个非常大的瓶颈所在,如果集群继续扩大到2000左右,那么 jobtracker每秒被BLOCK住的heartbeat和getTaskCompletionEvents2以及其他同步锁操作会更多,调度的效率 会更加底下,介时可能更多的计算节点的加入意义就不大了。

知道了原因之后,接下来就该考虑如何解决。要解决jobtracker的scalability 问题,最大的修改之处就在于JobTracker.java类中许多类方法的synchronized加锁力度过大,有的调用甚至不需要进行同步,最严重 的地方为两处,就是上面提到的:

  1. JobTracker.submitJob
  2. JobTracker.getTaskCompletionEvents


这两处调用中不仅对jobtracker加锁, 而且还有hdfs文件的读写访问,最容易造成jobtracker的使用率下降甚至jobtracker服务延迟。而submigJob中需要对 JobInProgress进行初始化,该初始化中涉及到了hdfs文件的读写,效率很慢,对jobtrakcer的加锁时间就变得很长。

另外,还有 getMapTaskReports(), getReduceTaskReports(), getCleanupTaskReports(), getSetupTaskReports(),这些调用,当job还没有被init的时候,是无须进行接下来的操作的,由于这些方法也都是 jobtracker的synchronized方法,所以当job != null时,增加对job.inited()的判断也能够提高jobtracker的同步锁效率。

  1. 将这些方法的锁力度细化
  2. 去掉某些不必要的同步锁
  3. 将存在hdfs访问的操作移出 jobtracker的同步锁之外


通过这一系列的优化,jobtracker的调度效率应该可以大大提高,具体对比数据有待进一步 测试。jobtracker的调度效率提高,意味这可以为集群加入更多的机器而不会造成资源浪费,这可都是成本啊!血的教训……

分享到:
评论

相关推荐

    腾讯大规模Hadoop集群实践

    本文主要从需求、挑战、方案和未来计划等方面,介绍了TDW在建设单个大规模集群中采取的JobTracker分散化和NameNode高可用两个优化方案。TDW(TencentdistributedDataWarehouse,腾讯分布式数据仓库)基于开源软件...

    Hadoop大数据平台构建、规划大数据平台集群教学课件.pptx

    规划Hadoop大数据平台集群 Hadoop集群的三种模式 单机模式 在单机上运行。 没有分布式文件系统,直接读写本地操作系统。 伪分布模式 在单机上运行。 使用分布式文件系统。 hadoop集群只有一个节点,因此hdfs的块复制...

    JobTracker:Hadoop JobTracker OS X 菜单栏应用程序

    JobTracker Mac 菜单栏应用程序 Hadoop JobTracker 的 Mac 菜单栏应用程序界面。 它使您可以轻松访问 JobTracker 中的作业,并提供有关开始、完成和失败作业的 Growl/通知中心通知。 请参阅了解更多信息并下载二...

    MapReduceV1:Job提交流程之JobTracker端分析

    上一篇我们分析了Job提交过程中JobClient端的处理流程(详见文章MapReduceV1:Job提交流程之JobClient端分析),这里我们继续详细分析Job提交在JobTracker端的具体流程。通过阅读源码可以发现,这部分的处理逻辑还是...

    Hadoop集群安装

    Hadoop集群安装的详细说明文档, 實作七: Hadoop 叢集安裝 前言 您手邊有兩台電腦,假設剛剛操作的電腦為"主機一" ,另一台則為"主機二" 。則稍後的環境如下 • 管理Data的身份 管理Job的身份 "主機一" namenode ...

    2013中国大数据技术大会PPT——腾讯大规模Hadoop集群实践

    【大数据架构与系统】腾讯数据中心资深专家翟艳堂分享了腾讯建立大规模Hadoop集群的过程,首先要解决单点问题,将JobTracker分散化,做NameNode高可用。在业务选型方面,选择了成熟度更高的Facebook开源的Corona。

    伪集群分布

    hadoop在windows的伪集群分布,在一台主机模拟多主机。  -Hadoop启动NameNode、DataNode、JobTracker、TaskTracker这些守护进程都在同一台机器上运行,是相互独立的Java进程。  -在这种模式下,Hadoop使用的是...

    MapReduceV1:JobTracker处理Heartbeat流程分析

    这篇文章的内容,更多地主要是描述处理/交互流程性的东西,大部分流程图都是经过我梳理后画出来的(开始我打算使用序列图来描述流程,但是发现很多流程在单个对象内部都已经非常复杂,想要通过序列图表达有点担心...

    大数据云计算技术 Hadoop应用浅析(共16页).pptx

    集群规模 共大、小 2个集群:数据中心和实验室集群 数据中心: 1台NameNode, 1台SecondNameNode, 1台JobTracker,100来台DataNode 共100多台高配服务器; 数据中心又分为10多个机架,每个机架上10多台服务器; 实验室...

    Hadoop面试题

    Hadoop常见习题汇编,最新2018年版,仅供大家学习和交流使用,不得作为其他用途。

    Hadoop集群_WordCount运行详解--MapReduce编程模型

    MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说,MapReduce就是"任务的分解与结果的汇总"。 在...

    Springboard JobTracker-crx插件

    Jobtracker是您的求职伴侣,可帮助您保持求职的顶峰! 记录和跟踪:只需单击一下,即可保存流行网站中的求职申请和网络联系人。 扩大您的网络:从Springboard社区发现网络和推荐机会。 日志和跟踪:使用Springboard...

    Storm集群安装部署步骤【详细版】

    本文以TwitterStorm官方Wiki为基础,详细描述如何快速搭建一个Storm集群,其中,项目实践中遇到的问题及经验总结,在相应章节以“注意事项”的形式给出。Storm集群中包含两类节点:主控节点(MasterNode)和工作节点...

    搭建hadoop伪分布式.docx

    这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode),请注意分布式运行中的这几个结点的区别:从分布式存储的角度来说,...

    大数据平台常见面试题.pdf

    ⼤数据平台常见⾯试题 第1部分 申请ID..... 下列哪项通常是集群的最主要瓶颈 a)CPU b)⽹络 c)磁盘 IO d)内存 解析: 由于⼤数据⾯临海量数据,读写数据都需要 io,然后还要冗余数据,hadoop ⼀般备 3 份数据,所以 IO

    Yarn框架代码详细分析V0.5

    对于扩展性目前主要体现在计算节点规模上,以前 JobTracker-TaskTracker 模型下最多大约在 5000 台机器左右,对于 YARN,官方说可以支持大约 10w 台机器,当然这个目前还没有一家公司去试用过,连 300 台机器目前...

    大数据平台构建:YARN的重要概念.pptx

    jobtracker兼顾资源管理和作业控制跟踪功能跟踪任务,启动失败或迟缓的任务,记录任务的执行状态,维护计数器),压力大,成为系统的瓶颈 2、可靠性差: 采用了master/slave结构,master容易单点故障 3、资源利用率...

    MapReduceV1:TaskTracker端启动Task流程分析

    TaskTracker周期性地向JobTracker发送心跳报告,在RPC调用返回结果后,解析结果得到JobTracker下发的运行Task的指令,即LaunchTaskAction,就会在TaskTracker节点上准备运行这个Task。Task的运行是在一个与...

Global site tag (gtag.js) - Google Analytics