• 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包路径下就行运行(吐槽一下,这个过程慢了,甚至使我以为失败了。记得关防火墙)

    效果:

     

    终于结束了!!!

  • 相关阅读:
    Javascript笔记09:Javascript的下拉式导航菜单
    Javascript笔记08:Javascript的if...else语句
    Android(java)学习笔记84:SQLiteDatabase的query方法参数
    Android(java)学习笔记83:各种边距设置
    Android(java)学习笔记82:利用SpannableString设置复合文本
    PHP笔记06:http响应中的状态码
    html笔记04:在html之中导入css两种常见方法
    POJ 3307 Smart Sister
    ZOJ 2872 Binary Partitions
    HDU 4685 Prince and Princess
  • 原文地址:https://www.cnblogs.com/longshisan/p/14888144.html
Copyright © 2020-2023  润新知