Map-Reduce编程模型
环境:Hadoop1.2.1 
  
  Map-Reduce编程模型 
   
 
  
  没有reduce的简单编程模型 
   
 
  
  复杂的编程模型 
   
 
  
  Mapper 
      Map-reduce的思想就是“分而治之” 
      Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”执行 
      “简单的任务”有几个含义:1 数据戒计算规模相对于原任务要大大缩小;2 就近计算,即会被分配到存放了所需数据的节点迚行计算;3 这些小任务可以幵行计算,彼此间几乎没有依赖关系 
  
  Reducer 
      对map阶段的结果进行汇总 
      Reducer的数目由mapred-site.xml配置文件里的项目mapred.reduce.tasks决定。缺省值为1,用户可以覆盖之 
  
  Shuffle 
      目前对Shuffle理解不是很深,Shuffle应该是描述着数据从map task输出到reduce task输入的这段过程,主要就是对map task输出的内容做Merge操作,然后输送到reduce task 
  
  分片的问题 
      分片非常接近物理块边界 
      通常每个分片对应一个task 
      通过分片实现计算数据本地化 
      分片包含的数据未必都在本地 
   
 
  
  Combiner 
      工作于Map输出端。简化输出,减少网络数据传送量。Combiner实际上就是在Map端先作一次Reducer,使用Combiner的前提是不能影响最终结果并能提高执行效率。 
  
  性能调优 
      究竟需要多少个reducer? 
      输入:大文件优于小文件 
      减少网络传输:压缩map的输出 
      优化每个节点能运行的任务数:mapred.tasktracker.map.tasks.maximum 和 mapred.tasktracker.reduce.tasks.maximum (缺省值均为2) 
  
  Map-Reduce工作机制剖析 
   
 
  1.运行Job 
  2.请求作业号 
  3.复制作业资源文件 
  4.提交作业 
  5.初始化,创建作业对象 
  6.获得输入划分 
  7.保持心跳 
  8.获得作业资源文件 
  9.登陆子JVM 
  10.启动任务 
  MapReduce的执行流程简单概括如下: 
      用户作业执行JobClient.runJob(conf)代码会在Hadoop集群上将其启动。 
      启动之后JobClient实例会向JobTracker获取JobId,而且客户端会将作业执行需要的作业资源复制到HDFS上,然后将作业提交给JobTracker。 
      JobTracker在本地初始化作业,再从HDFS作业资源中获取作业输入的分割信息,根据这些信息JobTracker将作业分割成多个任务,然后分配给在与JobTracker心跳通信中请求任务的TaskTracker。 
      TaskTracker接收到新的任务之后会首先从HDFS上获取作业资源,包括作业配置信息和本作业分片的输入,然后在本地启动一个JVM并执行任务。 
      任务结束后将结果写回HDFS。 
  
  调度机制 
      缺省为先入先出作业队列调度 
      支持公平调度器 
      支持容量调度器 
  
  任务执行优化 
      推测式执行:即如果jobtracker发现有拖后腿的任务,会再启动一个相同的备份任务,然后哪个先执行完就会kill去另外一个。因此在监控网页上经常能看到正常执行完的作业有被kill掉的任务 
      推测式执行缺省打开,但如果是代码问题,并不能解决问题,而且会使集群更慢,通过在mapred-site.xml配置文件中设置 mapred.map.tasks.speculative.execution和 mapred.reduce.tasks.speculative.execution可为map任务或reduce任务开启或关闭推测式执行 
      重用JVM,可以省去启动新的JVM消耗的时间,在mapred-site.xml配置文件中设置mapred.job.reuse.jvm.num.tasks设置单个JVM上运行的最大任务数(1,>1戒-1表示没有限制) 
      忽略模式,任务在读取数据失败2次后,会把数据位置告诉jobtracker,后者重新启动该任务并且在遇到所记录的坏数据时直接跳过(缺省关闭,用SkipBadRecord方法打开) 
  
  错误处理机制:硬件故障 
      硬件故障是指jobtracker故障或tasktracker故障 
      jobtracker是单点,若发生敀障目前hadoop还无法处理,唯有选择最牢靠的硬件作为jobtracker 
      Jobtracker通过心跳(周期1分钟)信号了解tasktracker是否发生故障或负载过于严重 
      Jobtracker将从任务节点列表中移除发生故障的tasktracker 
      如果故障节点在执行map任务并且尚未完成,jobtracker 会要求其它节点重新执行此map任务 
      如果故障节点在执行reduce 任务并且尚未完成,jobtracker 会要求其它节点继续执行尚未完成的reduce任务 
  
  错误处理机制:仸务失败 
      由于代码缺陷或进程崩溃引起任务失败 
      Jvm自动退出,向tasktracker父进程发送错误信息,错误信息也会写入到日志 
      Tasktracker监听程序会发现进程退出或进程很久没有更新信息送回,将任务标记为失败 
      标记失败任务后,任务计数器减去1以便接受新任务,并通过心跳信号告诉jobtracker任务失败的信息 
      Jobtrack获悉任务失败后,将把该任务重新放入调度队列,重新分配出去再执行 
      如果一个任务失败超过4次(可以设置),将不会再被执行,同时作业也宣布失败