热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Job的任务分解

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd
JobTracker任务调度器之JobQueueTaskScheduler中(见  2012-01/50857.htm),我讲述Job任务调度的时候简单地讲述了一下Job任务的分解,也就是将一个作业Job切分为一个个相对独立的map任务,以及后面的reduce任务。那么,Hadoop的Mapreduce,确切的说是JobTracker是如何来分解作业Job的呢?当然,在JobTracker中并不把这个动作叫做作业分解,而是叫做“初始化作业”。所以,在接下来的时间里,我将给大家详细的讨论这个过程的实现。

     先来看看“初始化作业”这个过程所以来的类图吧!


       当客户端JobClient向JobTracker提交一个Job之后,JobTracker会把这个Job对应的JobInProgress交给监听器JobInProgressListener,从上面的类图我们可以看出,JobTracker把新来的Job交给JobInProgressListener的一个实现EagerTaskInitializationListener来初始化它。在EagerTaskInitializationListener中,它有一个后台线程JobInitManager,专门负责初始化JobInProgress。在JobInitManager中又采用线程池的方式有效的完成Job的初始化。


     根据上面的一个新到的Job初始化过程可知,对一个Job进行map和reduce任务的划分,最终还是由这个Job对应的JobInProgress来完成,所以接下来我们就要重点关注一下JobInProgress的initTasks()方法,这也却如其名。

     在JobInProgress的initTasks()方法中,它会首先读取这个Job的job.split文件,关于这个文件的产生和存放位置我记得在前面的博文中详细的提到过,不清楚的童鞋可以去好好看看。但是要注意的是,此时的这个split文件在逻辑上并不在JobTracker本地的文件系统。split文件记录了对所有的输入数据的切分,它被读取之后的每一个输入数据切片都被用一个RawSplit(RawSplit记录了数据的路径,范围,所有的位置信息)来表示,同时每一个RawSplit也就对应了一个MapTask——Job的map任务也就是这样产生了。之后就根据客户端提交Job是设置的reduce任务数来创建Job的reduceMaps,这个reduce任务数量是根据job.xml中的配置项mapred.reduce.tasks确定的。然后又会计算在什么时候开始调用reduce任务,也就是当有多少个map任务被成功完成之后就开始调用reduce任务。这个阈值是怎么计算的呢?很简单:
DEFAULT_COMPLETED_MAPS_PERCENT_FOR_REDUCE_SLOWSTART = 0.05f;

completedMapsForReduceSlowstart = (int)Math.ceil((conf.getFloat("mapred.reduce.slowstart.completed.maps",       DEFAULT_COMPLETED_MAPS_PERCENT_FOR_REDUCE_SLOWSTART) * numMapTasks));

客户端如何自己配置这个阈值,就不用我说了吧。最后,JobInProgress还会创建另外的四个Task,它们分别是map的cleanup任务、setup任务,reduce的cleanup任务、setup任务,至于这个Task的用户,我会在后面的博文中详细阐述。

    在上面的流程图中,大家可能对预分配map任务感到有些莫名其妙,我首先要申明这个名字是我自己取的,因为实在是找不到关于这个步骤的中文解释,若有大牛有跟准确的解释,请及时给我指正,拜谢先!那么这个“预分配map任务”到底干了什么事情呢?它首先是对每一个输入数据切片的所有副本位置信息就行解析(我们知道,在Hadoop中,所有的节点或被解析成一个网络拓扑图,根据这个图来计算任意两个节点之间的距离),每一个副本的位置被解析成一个Node,然后依次向上获取这个Node的父Node,祖父Node,...,究竟向上扩展多少层,由hadoop的配置文件中的项mapred.task.cache.levels来设置,这些节点就会和这个数据切片对应的map任务进行绑定,当我们给一个TaskTracker分配map任务的时候,就会参考这个缓存信息并根据就近原则来分配了。贴出源代码:

private Map> createCache(JobClient.RawSplit[] splits, int maxLevel) {
    Map> cache = new IdentityHashMap>(maxLevel);
    
    for (int i = 0; i       String[] splitLocatiOns= splits[i].getLocations();
      if (splitLocations.length == 0) {
        nonLocalMaps.add(maps[i]);
        continue;
      }

      for(String host: splitLocations) {
        Node node = jobtracker.resolveAndAddToTopology(host);
        LOG.info("tip:" + maps[i].getTIPId() + " has split on node:" + node);
        for (int j = 0; j           List hostMaps = cache.get(node);
          if (hostMaps == null) {
            hostMaps = new ArrayList();
            cache.put(node, hostMaps);
            hostMaps.add(maps[i]);
          }
          if (hostMaps.get(hostMaps.size() - 1) != maps[i]) {
            hostMaps.add(maps[i]);
          }
          node = node.getParent();
        }
      }
    }
    
    return cache;
  }


推荐阅读
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
author-avatar
叫爸算了_459
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有