Hadoop(四)——编程核心MapReduce(上)

 上篇讲述了Hadoop的核心内容之一HDFS,是Hadoop分布式的平台基础,而这讲的MapReduce则是充分利用Hdfs分布式,提高运行效率的算法模型Map(映射)Reduce(归约)两个主要阶段都以<key,value>键值对作为输入和输出,我们需要做的就是对这些<keyvalue>做我们想要的处理。看似简单实则麻烦,因为这里太灵活多变。

 

     一,好,首先来看下边两个图,看下mapreduceHadoop中的执行流程,以及mapreduce内部的执行流程:


      以分析气象数据为例子:



     二,解析:mapreduce的执行步骤:


   map任务处理:

      1.读取输入文件内容,解析成键值对(key/value).对输入文件的每一行,解析成

        键值对(key/value).每一个键值对调用一次map函数

      2.写自己的逻辑,对输入的键值对(key/value)处理,转换成新的键值对

        (key/value)输出.

      3.对输出的键值对(key/value)进行分区.(partition)

      4.对不同分区的数据,按照key进行排序,分组.相同的key/value放到

        一个集合中.(shuffle)

      5.分组后的数据进行规约.(combiner,可选择的),也就是可以在mapper中处理一部    

        reduce的工作,将reduce的工作进行减压


   reduce任务处理:

      1.对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点.

      2.对多个map任务的输出进行合并,排序.reduce函数自己的逻辑,对输入的

         key/value处理,转换成新的key/value输出.

      3.reduce的输出保存到文件中(写入到hdfs).

 

三,任务执行优化:


    1,推测式执行:即如果jobtracker发现有拖后腿的任务,会再启动一个相同的备份任务,然后那个先执行完就会kill掉另一个。因此在监控网页上经常能看到正常执行完的作业有被kill的任务。

               

    2推测式执行缺省打开,但如果是代码问题,并不能解决问题,而且会使集群更慢,通

过在mapred-site.xml配置文件中设置mapred.map.tasks.speculative.execution和

mapred.reduce.tasks.speculative.execution可为map任务或reduce任务开启或关闭

推测式执行

  

    3重用JVM,可以省去启动新的JVM消耗的时间,在mapred-site.xml配置文件中设置

mapred.job.reuse.jvm.num.tasks设置单个JVM上运行的最大任务数( 1, >1或-1表

示没有限制

 

    4忽略模式, 任务在读取数据失败2次后, 会把数据位置告诉jobtracker, 后者重新启动

该任务并且在遇到所记录的坏数据时直接跳过( 缺省关闭, 用SkipBadRecord方法打

开)

 


四,错误机制处理故障:


  1,硬件故障,即jobtrackertasktracker故障:

A,Jobtracker是单点, 若发生故障目前hadoop还无法处理, 唯有选择最牢靠的硬件作为

jobtracker

B,Jobtracker通过心跳( 周期1分钟) 信号了解tasktracker是否发生故障或负载过于严重

C,Jobtracker将从任务节点列表中移除发生故障的tasktracker

    D,如果故障节点在执行map任务并且尚未完成, jobtracker会要求其它节点重新执行此

map任务

F,如果故障节点在执行reduce任务并且尚未完成,jobtracker会要求其它节点继续执行

尚未完成的reduce任务

     


      2,任务失败:由于代码或者进程崩溃引起任务失败:

    A,Jvm自动退出,向tasktracker父进程发送方错误信息,错误信息也会写入到日志

    B,Tasktracker监听程序会发现进程退出,或进程很久没有更新信息送回,将任务标记为

失败

    C,标记失败任务后,任务计数器减去1以便接受新任务,并通过心跳信号告诉jobtracker

任务失败的信息

    D,Jobtrack获悉任务失败后,将把该任务重新放入调度队列,重新分配出去再执行

    E,如果一个任务失败超过4次(可以设置),将不会再被执行,同时作业也宣布失

 


    五,最后来看一个wordCount的例子:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package job;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.StringTokenizer;  
  5.   
  6. import org.apache.hadoop.conf.Configuration;  
  7. import org.apache.hadoop.fs.Path;  
  8. import org.apache.hadoop.io.IntWritable;  
  9. import org.apache.hadoop.io.Text;  
  10. import org.apache.hadoop.mapreduce.Job;  
  11. import org.apache.hadoop.mapreduce.Mapper;  
  12. import org.apache.hadoop.mapreduce.Reducer;  
  13. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  14. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  15. import org.apache.hadoop.util.GenericOptionsParser;  
  16.   
  17. /** 
  18.  * hadoop的第一个mapreduce例子,wordCount,计算单词的个数 
  19.  *  
  20.  * @author Administrator 
  21.  *  
  22.  */  
  23. public class WordCount {  
  24.       
  25.     /* 
  26.      *  继承mapper接口,设置map的输入类型为<Object,Text>,输出类型为<Text,IntWritable> 
  27.      */  
  28.     public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {  
  29.         //one表示单词出现了一次  
  30.         private final static IntWritable one=new IntWritable(1);  
  31.         //word用来存储切下来的单词  
  32.         private Text word=new Text();  
  33.           
  34.         //map进行将内容分割,以<单词,1>的形式write出来  
  35.         public void map(Object key, Text value,Context context) throws IOException,InterruptedException{  
  36.             //进行单词的切分  
  37.             StringTokenizer itr=new StringTokenizer(value.toString());  
  38.               
  39.             while (itr.hasMoreElements()) {  
  40.                 word.set(itr.nextToken());//切下的单词放到word中  
  41.                 context.write(word, one);  
  42.             }  
  43.         }  
  44.     }  
  45.       
  46.     /** 
  47.      * reducer函数的编写 
  48.      * @author Administrator 
  49.      * 
  50.      */  
  51.     public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable>{  
  52.           
  53.         //result记录单词的频数  
  54.         private IntWritable result=new IntWritable();  
  55.           
  56.         public void reduce(Text key,Iterable<IntWritable> values,Context context)throws IOException,InterruptedException{  
  57.             int sum=0;  
  58.             for(IntWritable val:values){  
  59.                 sum+=val.get();  
  60.             }  
  61.             result.set(sum);  
  62.             context.write(key, result);  
  63.         }  
  64.     }  
  65.       
  66.       
  67.     public static void main(String[] args) throws Exception{  
  68.         Configuration configuration=new Configuration();  
  69.         String[] otherArgs=new GenericOptionsParser(configuration,args).getRemainingArgs();  
  70.         if(otherArgs.length!=2){  
  71.             System.err.println("Usage:wordcount <in> <out>");  
  72.             System.exit(2);  
  73.         }  
  74.           
  75.         //配置作业名  
  76.         Job job=new Job(configuration, "word count");  
  77.         job.setJarByClass(WordCount.class);  
  78.         job.setMapperClass(TokenizerMapper.class);  
  79.         job.setCombinerClass(IntSumReducer.class);  
  80.         job.setReducerClass(IntSumReducer.class);  
  81.         job.setOutputKeyClass(Text.class);  
  82.         job.setOutputValueClass(IntWritable.class);  
  83.         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));  
  84.         FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));  
  85.         System.exit(job.waitForCompletion(true)?0:1);  
  86.     }  
  87. }  

          MapReduce,多理解流程执行,属性对应的API,然后就是锻炼自己的建模的思维,算法的相关锻炼等……


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值