MapReduce入门案例

MapReduce概述及其Wordcount案例

    • 一、MapReduce简介
    • 二、MapReduce核心思想
    • 三、MapReduce实例进程
    • 四、MapReduce程序组成
    • 五、WordCount实现

一、MapReduce简介


  • Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;其思想来源于Google的MapReduce。Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。

二、MapReduce核心思想


  • 简单而言,就是拆分的思想,即“分而治之”,大任务被拆分成小的任务并行计算,具体如下:
  • 1)分布式的运算程序往往需要分成至少2个阶段。
  • 2)第一个阶段的maptask并发实例,完全并行运行,互不相干。
  • 3)第二个阶段的reduce task并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask并发实例的输出。
  • 4)MapReduce编程模型只能包含一个map阶段和一个reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个mapreduce程序,串行运行。
    MapReduce入门案例_第1张图片

三、MapReduce实例进程


  • 一个完整的mapreduce程序在分布式运行时有三类实例进程:
    MapReduce入门案例_第2张图片

四、MapReduce程序组成


  • 用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
    MapReduce入门案例_第3张图片

五、WordCount实现


  • 分析MapReduce经典案例Wordcount的设计思路及数据处理过程
    MapReduce入门案例_第4张图片

  • 测试数据,如wordcount.txt文本,内容如下:

    I love Guiyang
    I love Guizhou
    Guiyang is the capical of Guizhou
    
  • 定义WordCountMapper,继承于Hadoop的Mapper

    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    import java.io.IOException;
    
    public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
           
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
           
            // key 偏移量    value 每行文本:I love Guiyang
            // 按照空格对每行文本进行分词操作:[I,love,Guiyang]
            String line = value.toString(); // 数据类型的转换
            String[] words = line.split(" "); // 对字符串进行拆分 [I,love,Guiyang]
            for (int i = 0; i < words.length; i++) {
           
                // (I,1)
                Text word = new Text(words[i]);
                IntWritable value2 = new IntWritable(1);
                context.write(word,value2);
            }
        }
    }
    
  • 定义WordCountReducer,继承于Hadoop的Reducer

    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    public class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable> {
           
        @Override
        protected void reduce(Text k3, Iterable<IntWritable> v3, Context context) throws IOException, InterruptedException {
           
            // 进行求和操作,需要计算v3的长度
            // 
            int count = 0;
            for (IntWritable v: v3) {
           
                int value = v.get();
                count += value;
            }
            context.write(k3,new IntWritable(count));
        }
    }
    
  • 定义WordCountJob

    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    import java.io.IOException;
    
    public class WordCountJob {
           
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
           
            // 实列化Job
            Job job = Job.getInstance();
            job.setJarByClass(WordCountJob.class);
            // 设置Mapper
            job.setMapperClass(WordCountMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            // 设置Reducer
            job.setReducerClass(WordCountReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            // 指明输入文件的路径
            FileInputFormat.setInputPaths(job,new Path("d:/wordcount.txt"));
            // 指明输出文件的路径
            FileOutputFormat.setOutputPath(job,new Path("d:/mr_result/wc01"));
            // 开始运行任务
            boolean completion = job.waitForCompletion(true);
            if (completion){
           
                System.out.println("程序运行成功~");
            }else {
           
                System.out.println("程序运行失败~");
            }
        }
    }
    
  • 本地运行,测试其功能是否正常
    MapReduce入门案例_第5张图片
    打开结果文件part-r-00000,内容如下:
    MapReduce入门案例_第6张图片

  • 将程序打包,上传到服务器,利用hadoop命令执行程序(读者自行打包)

你可能感兴趣的:(Hadoop,hadoop)