MapReduce模型

MapReduce对于大数据来说就是一个特别简单的青铜时代,现在我们可能用到的并不多,但是还要学一些,MapReduce用来处理分布式并行计算

对为什么MapReduce被淘汰想了解一些的可以看以下这个    mapreduce为什么被淘汰了?

 

MapReduce是Hadoop系统核心组件之一,它是一种可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算,是目前分布式计算模型中应用较为广泛的一种。

简单说MapReduce就是Map   和   Reduce  。  Map就是吧东西分开    Reduce就是把东西合起来 。

拿武侠小说打个比喻,一个人学会一项技能Map,这个技能能够将自己分成无数份,这无数份自己去分开去世界各地学习知识,最后在一个时间节点,所有的分身再通过Reduce技能将每个自己进行融合,获取知识

 

MapReduce 拥有两个阶段 ,可以理解为这样一个过程,也就是键值对转化的过程(<K1,V1>  -> (map)  <K2,V2>->(reduce)<K3,V3>)(输入通过TextInputForma进行处理,把每一行转换成键值对)

 

 

 

经典案例一:词频统计

(第一次的时候我们也做过一个词频统计,就是108个爸爸和1个儿子的故事,看看这次的统计与上次的词频统计有啥相同有啥不同)

流程就是那么个流程   就上面那个  

map对单词进行切割(从源数据文件中逐行读取数据,然后将每一行数据切分成单词,再将单词构造成键值对,最后把键值对发送给reduce) 

reduce在将相同的合并(reduce接收键值对,将相同键值汇聚,同时对累加求和,再将键值对输出到HDFS文件中)

这个0 12 24 是偏移量

 

 1.首先在eclipse建一个maven文件(不会的看这个配置   新建maven文件

2.建完maven文件之后当然是写配置文件啦,前面还是和上一个项目一样,不一样的地方是这次我们要打成jar包,所以在后面追加了一些配置代码(注意注释代码不是用//,而是用的<!---->)

(看不懂pom文件中标签啥意思?    可以看看这位大佬的解释   Maven-pom-configuration    还可以看看这个加深理解打包    maven打包详情)、

pom.xml代码详情   (在下面标红的地方是下面我们要建的类中的一个,驱动类)(junit是单元测试的jar包)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.longshisan</groupId>
  <artifactId>hadoop-wordcount</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-common</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-hdfs</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>RELEASE</version>
      </dependency>
  </dependencies>
 
  <build>
  <!-- 配置打包名称  -->
      <finalName>hadoop-longshisan-wordcount</finalName>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>2.4</version>
              <configuration>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <classpathPrefix>lib/</classpathPrefix>
                          <mainClass>cn.longshisan.hadoop.wordcount.Run</mainClass>
                      </manifest>
                  </archive>
              </configuration>
          </plugin>
          
          <!-- 配置依赖包 -->
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.0</version>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
                  <encoding>UTF-8</encoding>
                  <verbal>true</verbal>
              </configuration>
          </plugin>    
      </plugins>
  </build>
 
</project>

 

 

 

 

 

 

 注:看了一个打包的的解释

 

 

3.接下来我们要写一个mapper类,这个类继承Mapper这个类,把它泛型具体化一下

建立一个

 

 

接下来按shift+alt+s  选择这个

 

选择map方法

 

 输入:

package cn.longshisan.hadoop.wordcount;

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;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        String[] words = line.split(" ");
        for(String word: words) {
            context.write(new Text(word),new IntWritable(1));
        }
    }

}

对15行代码进行解释:创建一个line的string量,来将value的值进行string化

对16行代码进行解释:建立一个string数组,来保存将line通过空格区分的切片的单词

对17行代码进行解释:将words中切片获得单词一个一个拿出来

对18行代码进行解释:将获得的单词用键值对的方式发给reduce(例如这样:<hello,1>)

 

 4.接下来我们要写一个reduce类,这个类继承Reduce这个类,把它泛型具体化一下(具体操作同Map,不再截图)(这个和上面的逻辑挺重要,建议自己打出来)

 

 

 5.接下来我们要写一个Run类,这个类要把那个是mapper,那个是reducer,啥是啥,通过job对象,提交给集群,让集群去运行(也挺简单易懂的吧)

前两句的意思是获取配置信息或者Job对象实例,之后给这个实例设置运行类,Map类,Reduce类,对于前面,告诉啥是啥,下面四行是输入输出,再下面两行是输入文件和输出文件的路径设置,最下面是调用函数执行Job

 

 6.将它打成jar包

 

 

 

 7.jar包都有了,剩下的操作就和第一次一样了,先把jar包传到software下用Xshell

 

 

 

 如果wordcount下有output文件夹,记得删掉

 

 

 

 我们再去data下建立一个words02.txt,再把这个文件放在Hadoop的input下,这样就有俩txt文件了,我们再运行一下jar包

 

 

 

 再到刚才的jar包路径下就行运行(吐槽一下,这个过程慢了,甚至使我以为失败了。记得关防火墙)

 

效果:

 

 

 

 

 

 

终于结束了!!!

 

posted @ 2021-06-16 20:30  泷十三  阅读(218)  评论(0编辑  收藏  举报