博客
关于我
MapReduce之入门概述以及WordCount 案例
阅读量:331 次
发布时间:2019-03-03

本文共 4417 字,大约阅读时间需要 14 分钟。

一:MapReduce定义

  1.  简介
          Mapreduce 是一个分布式运算程序的编程框架,是用户开发“基于 hadoop 的数据分析应用”的核心框架。
          Mapreduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,
    并发运行在一个 hadoop 集群上。
  2. Mapreduce 优缺点
          ⑴优点:
                    a:MapReduce  易于编程
                              它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量
                         廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模
                         一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。
                    b:良好的 扩展性
                               当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
                    c: 高容错性
                               MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上,这就要求它具有很高的容错性。
                          比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行
                          失败,而且这个过程不需要人工参与,而完全是由Hadoop 内部完成的。
                    d:适合 PB  级以上海量数据的 离线处理
                               这里加红字体离线处理,说明它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,
                          MapReduce 很难做到。
          ⑵缺点:
                    a:MapReduce 不 擅长做实时计算、流式计算、DAG(有向图 ) 计算
                    b:实时计算:
                               MapReduce 无法像 Mysql 一样,在毫秒或者秒级内返回结果。
                    c:流式计算:
                                流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。
                          这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
                    d:DAG (有向图)计算
                                 多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,
                          MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到磁盘,
                          会造成大量的磁盘 IO,导致性能非常的低下。
  3. MapReduce的核心思想
         
                   

二:MapReduce进程

  1.  简介
               

三:MapReduce  编程规范 (八股文)

  1. 简介
          用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行 mr 程序的客户端)。
  2. Mapper阶段
          
  3. Reducer阶段
          
  4. Driver 阶段
         整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信息的 job 对象            

四:WordCount 案例

  1. 需求:
            在一堆给定的文本文件中统计输出每一个单词出现的总次数。
  2. 数据准备,一个文件hello.txt,内容如下
      
  3. 案例分析
      
  4. 代码实现
        ⑴在eclipse中创建工程
                  
                  jar包和之前的一样,从hadoop安装包中拷贝出来。环境变量之前已经配置好了。
                 
        ⑵创建自定义的Mapper类去对数据进行分类,注意:我们这里会将所有数据分类完成后才会进入到下一阶段
             
    package com.kgf.mapreduce;import java.io.IOException;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;/*** *  * 继承的Mapper参数如下: *第一个参数key:LongWritable表示输入的key的行号 *第二个参数value:Text表示一行内容 *第三个参数key: Text表示单词 *第四个参数value:IntWritable表示计算后的单词的个数 * @author kgf * */public class WordCountMapper extends Mapper
    { Text k = new Text(); IntWritable v = new IntWritable(1); /** * 使用map方法去处理数据,数据是一行一行进入到这个方法处理的 * key:表示行号 * value:表示一行数据内容 */ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //首先我们将一行内容转换成String String line = value.toString(); //数据的单词之间是以空格切割的 String[] words = line.split(" "); //将数据循环写出到下一阶段 for (String word : words) { k.set(word); context.write(k, v); } }}

    ⑶创建自定义的Reducer类对分类的数据进行汇总

        

    package com.kgf.mapreduce;import java.io.IOException;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;/** * 注意:这里继承Reducer的前两个入参就是Mappper的出参数 * @author kgf * */public class WordCountReducer extends Reducer
    { /** * 这个方法主要是对map分类之后的数据进行聚合的 */ @Override protected void reduce(Text key, Iterable
    values, Context context) throws IOException, InterruptedException { //统计单词个数 int sum = 0; for (IntWritable count : values) { sum+=count.get(); } //输出单词总个数 context.write(key, new IntWritable(sum)); } }

    ⑷创建Driver提交任务

        

    package com.kgf.mapreduce;import java.io.IOException;import org.apache.hadoop.conf.Configuration;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.FileOutputCommitter;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCountDriver {	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {				//1:首先获取job信息		Configuration conf = new Configuration();		Job job = Job.getInstance(conf);				//2:获取jar包位置,指定入口类,hadoop会自己找到		job.setJarByClass(WordCountDriver.class);				//3:关联自定义的mapper和reducer		job.setMapperClass(WordCountMapper.class);		job.setReducerClass(WordCountReducer.class);				//4:设置map输出类型		job.setMapOutputKeyClass(Text.class);		job.setMapOutputValueClass(IntWritable.class);				//5:设置reducer输出类型		job.setOutputKeyClass(Text.class);		job.setOutputValueClass(IntWritable.class);				//6:设置数据输入和输出文件路径,这里我们通过main方法获取参数路径		FileInputFormat.setInputPaths(job, new Path(args[0]));		FileOutputFormat.setOutputPath(job, new Path(args[1]));				//7:提交代码		boolean result = job.waitForCompletion(true);		System.exit(result?0:1);	}	}

     

  5.   在eclispe上将程序打成jar包
      
  6.  对jar包进行测试
     ⑴启动集群
     ⑵将jar包以及准备的hello.txt数据文本上传到/opt/module/hadoop-2.7.2目录下,并且设置有权限
           
           
      ⑶将准备的hello.txt文件上传的hdfs指定目录下
            
            
      ⑷使用我们的jar去测试(当前路径:/opt/module/hadoop-2.7.2):
            命令:hadoop jar +jar名称 +Driver入口的全路径 +输入路径 +输出路径
            
           执行成功生成的文件:
           
       ⑸查看文件内容
              
  7. 本地模式运行
        ⑴上面我们是将jar包放到集群上运行,这里我们们需要在本地直接运行,因为本地我们有hadoop的jar包
        ⑵在eclise上配置环境变量
             
             注意:输出路径不能提前建好。
            
        ⑶执行效果:
            
                    

转载地址:http://hfql.baihongyu.com/

你可能感兴趣的文章
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>
mysql 的存储引擎介绍
查看>>
MySQL 的存储引擎有哪些?为什么常用InnoDB?
查看>>
Mysql 知识回顾总结-索引
查看>>
Mysql 笔记
查看>>
MySQL 精选 60 道面试题(含答案)
查看>>
mysql 索引
查看>>
MySQL 索引失效的 15 种场景!
查看>>
MySQL 索引深入解析及优化策略
查看>>
MySQL 索引的面试题总结
查看>>
mysql 索引类型以及创建
查看>>
MySQL 索引连环问题,你能答对几个?
查看>>
Mysql 索引问题集锦
查看>>
Mysql 纵表转换为横表
查看>>
mysql 编译安装 window篇
查看>>
mysql 网络目录_联机目录数据库
查看>>