Hadoop_1: wordcount

  • mapreduce=map()+ reduce()
  • map=输入 <key,value>+<key,value>
  • redeuce=输入 <key , list_of_value> + 输出 <key,value>

wordcount

  • input: str1= Hello World; str2= Hello Hadoop
  • output: Hello 2; World 1; Hadoop 1;

mapreduce的wordcount流程

  • (自动)split分割

Hadoop_1: wordcount_第1张图片

  • map(): 生成的 <key,value>map()

Hadoop_1: wordcount_第2张图片

  • map排序: map端按key排序
  • (自动)combine: map的合并: 讲key相同的value相加

Hadoop_1: wordcount_第3张图片

  • 自动)reduce: 输入 <key ,value-list>;按key排序
  • 用户自定义的reduce

Hadoop_1: wordcount_第4张图片

代码

import ......

public class WordCount {
    public static class TokenizerMapper extends Mapper<Object,Text,Text,IntWirtable> {
               //StringTokenizer是一个用来分隔String的应用类,
               private final static IntWritable one=new IntWritable(1);
               private Text word=new Text(); 
               public void map(Object key,Text value,Context cotext)throws
               IOException,InterruptedException
               {
                   StringTokenizer itr=new StringTokenizer(value.toString());
                   while(itr.hasMoreTokens())
                   {
                       word.set(itr.nextToken);
                       context.write(word,one);
                   }
               }
          }
}
  • Reduce
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
      private IntWritable result=new IntWritable();
      public void reduce(Text key,Iterable<IntWritable>values,
                         Context context
                         )throws IOException,InterupptedException
      {
           int sum=0;
           for(IntWritable val:values)
           {
               sum+=val.get();
           }
           result.set(sum);
           context.write(key,value);
      }
   }
  • mapreduce
 public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();

        if(otherArgs!=2)
        {
            System.err.println("Usage:wordcount<in><out>")
        }
        Job job=new Job(conf,"wordcount");
        job.setJarByClass(WordCount.class);

        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

        j

        System.exit(job.waitForCompletion(true) ? 0 : 1);

    }

MapReduce的数据流

  • 切入分片:64M
  • 数据的本地优化=在存有数据的(HDFS)的节点上,获得最佳性能
  • map是写在本地上的,而非HDFS上
  • reduce的结构存储在HDFS上
  • 多个reduce任务,则每个reduece任务建立一个分区(hash函数)

combiner

  • 集群的可用贷款限制了MapReduce的作业的数量

MapReduce的优化

  • 计算性能优化+I/O优化

1. 任务调度

  • 计算方面:Hadoop优先将任务分配给空闲的机器,任务可以公平的分享系统资源
  • I/O方面:Map尽量将Map分配给InputSplit所在的机器,减少I/O消耗

2. 数据预处理与InputSplit的大小

  • 数据预处理

3. Map和Reduce任务的数量

  • Map和Reduce的任务槽: 集群可以同时运行的MR的最大数量
  • Map运行时间:1分钟
  • Map数量:运行时间来调整
  • Reduce数量:参考任务槽(0.95倍或者1.75倍)

4. Combine函数

  • 本地合并函数

5. 压缩

  • 选择对Map的输入输出结果压缩

6. 自定义comparator

你可能感兴趣的:(Hadoop_1: wordcount)