专栏首页米虫的家BigData--MapReduce入门

BigData--MapReduce入门

MapReduce入门

一、MapReduce概述

MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架

MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。

1、优点

  • MapReduce易于编程
  • 良好的扩展性
  • 高容错性
  • 适合海量数据的离线处理

2、缺点

  • 不擅长实时计算,无法像MySQL一样,在毫秒或者秒级内返回结果。
  • 不擅长流式计算,MapReduce的输入数据是静态。
  • 不擅长DAG(有向图)计算,如果每个MapReduce作业的输出结果都写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

3、MapReduce核心编程思想

  • 1)分布式的运算程序往往需要分成至少2个阶段。
  • 2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
  • 3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
  • 4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。

4、MapReduce进程

一个完整的MapReduce程序在分布式运行时有三类实例进程:

  • 1)MrAppMaster:负责整个程序的过程调度及状态协调。
  • 2)MapTask:负责Map阶段的整个数据处理流程
  • 3)ReduceTask:负责Reduce阶段的整个数据处理流程。

5、MapReduce编程规范

1) Mapper阶段
2)Reducer阶段
3)Driver阶段

用于提交封装了MapReduce程序相关运行参数的job对象。

二、WordCount案例实操

主要实现的是对文件中单词出现频率的分析,统计出单词出现的次数,这也是官方的示例教程

1、WcMapper ,负责数据的切分

java

package cn.buildworld.mapreduce.wordcount;

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;

/**
 * @author MiChong
 * @date 2020-05-24 11:32
 */
public class WcMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    private Text word = new Text();
    private IntWritable one = new IntWritable(1);


    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // 拿到这行数据
        String line = value.toString();
        //按照空格切分数据
        String[] words = line.split(" ");
        //遍历数组
        for (String word : words) {
            this.word.set(word);
            context.write(this.word, this.one);
        }

    }
}

2、WcReducer,负责数据的统计

java

package cn.buildworld.mapreduce.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * @author MiChong
 * @date 2020-05-24 11:33
 */
public class WcReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    private IntWritable total = new IntWritable();

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;

        //累加
        for (IntWritable value : values) {
            sum += value.get();
        }

        //包装结果并输出
        total.set(sum);
        context.write(key, this.total);
    }
}

3、WcDriver,代码相对固定,负责提交我们的Job

java

package cn.buildworld.mapreduce.wordcount;

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.FileOutputFormat;

import java.io.IOException;

/**
 * @author MiChong
 * @date 2020-05-24 11:33
 */
public class WcDriver {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        // 1、获取一个job实例
        Job job = Job.getInstance(new Configuration());
        // 2、设置类路径
        job.setJarByClass(WcDriver.class);
        // 3、设置Mapper和Reducer
        job.setMapperClass(WcMapper.class);
        job.setReducerClass(WcReducer.class);

        // 4、设置Mapper和Reducer输出类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        // 5 设置最终输出kv类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //6、设置输入输出数据
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        // 7、提交我们的job
        boolean b = job.waitForCompletion(true);
        System.exit(b ? 0 : 1);
    }
}

三、Hadoop序列化

不可以使用Java自带的序列化,要使用自定义bean对象实现序列化接口(Writable)

示例代码

java

package cn.buildworld.mapreduce.flow;

import org.apache.hadoop.io.Writable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

/**
 * @author MiChong
 * @date 2020-05-24 18:15
 */

/**
 * 必须实现Writable接口
 */
public class FlowBean implements Writable {
    private long upFlow;
    private long downFlow;
    private long sumFlow;

    /**
     * 反序列化时,需要反射调用空参构造函数,所以必须有空参构造
     */
    public FlowBean() {
    }

    public void set(long upFlow, long downFlow) {
        this.upFlow = upFlow;
        this.downFlow = downFlow;
        this.sumFlow = upFlow + downFlow;
    }

    public long getUpFlow() {
        return upFlow;
    }

    public void setUpFlow(long upFlow) {
        this.upFlow = upFlow;
    }

    public long getDownFlow() {
        return downFlow;
    }

    public void setDownFlow(long downFlow) {
        this.downFlow = downFlow;
    }

    public long getSumFlow() {
        return sumFlow;
    }

    public void setSumFlow(long sumFlow) {
        this.sumFlow = sumFlow;
    }

    /**
     * 最后会按照下面的格式显示在输出文件中
     *
     * 要想把结果显示在文件中,需要重写toString(),可用”\t”分开,方便后续用。
     * @return
     */
    @Override
    public String toString() {
        return "FlowBean{" +
                "upFlow=" + upFlow +
                ", downFlow=" + downFlow +
                ", sumFlow=" + sumFlow +
                '}';
    }

    /**
     * 重写序列化方法
     *
     *注意反序列化的顺序和序列化的顺序完全一致
     *
     * @param out 框架给我们提供的数据出口
     * @throws IOException
     */
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeLong(upFlow);
        out.writeLong(downFlow);
        out.writeLong(sumFlow);
    }

    /**
     * 重写反序列化方法
     *
     * 注意反序列化的顺序和序列化的顺序完全一致
     *
     * @param in 框架给我们提供的数据来源
     * @throws IOException
     */
    @Override
    public void readFields(DataInput in) throws IOException {
        upFlow = in.readLong();
        downFlow = in.readLong();
        sumFlow = in.readLong();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 大数据学习之路04——使用IDEA开发MapReduce程序

    这里以Hadoop的官方示例程序WordCount为例,演示如何一步步编写程序直到运行。

    汪志宾
  • Mac做java开发(四):​hadoop分布式环境搭建

    大数据时代,分布式技术至关重要,因此,这篇文章介绍hadoop分布式环境搭建,作为个人学习大数据技术的实验环境。

    用户5473628
  • shell字符串处理实例

    变量string="Bigdata process framework is Hadoop,Hadoop is an open source project"

    好派笔记
  • Hadoop-HA高可用搭建

    2、hosts文件要配置好,三台都可以相互通过主机名ping通,三台虚拟机都要配置!如下:

    可爱见见
  • 一文教你快速了解伪分布式集群搭建(超详细!)

    首先,我们需要知道配置伪分布式集群要修改的配置文件 所有配置文件都在 /opt/module/hadoop-2.7.2/etc/hadoop/内

    不温卜火
  • Sqoop学习之路

    Sqoop (SQL to Hadoop) 是Apache顶级项⽬,官⽹地址:http://sqoop.apache.org.

    白贺
  • 大数据那些事(12):Michael,Daniel和轮子

    美国大选,公司年度用户大会,事情繁多一直不能更新,诸位见谅。 在大数据时代,最著名的故事莫过于造轮子,有些轮子很成功,早年的比如Hadoop,Hive,有些一...

    用户1564362
  • 大数据学习必备 | 推荐几个牛X 的 github 项目,助你事半功倍

    大家好,我是 梦想家 Alex 。我们都知道 github 对于程序员们而言,就是一个巨大的“聚宝盆”,上面不仅有很多优质的开源项目,还有很多热...

    大数据梦想家
  • [大数据架构 ]Apache大数据项目目录

    在使用BigData大约8年以上之后,我遇到了大量的项目。Esp Apache的运动对于BigData域非常强大。每个人都会提出一个针对特定解决方案的项目。但是...

    首席架构师智库
  • 【Spark】Spark SQL原理、编译、配置及运行方式详述

    (1)在Hadoop中运行SQL的工具 在Hadoop中运行SQL的工具有Hive、Impala、Apache Drill、Presto、Spark SQL等...

    魏晓蕾
  • MapReduce入门了解

    1.MapReduce计算模型介绍 1.1.理解MapReduce思想 MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduc...

    刘浩的BigDataPath
  • 1.shell编程之变量的高级用法

     注意:使用expr索引是从1开始计算,使用${string:position},索引从0开始计算。

    zhang_derek
  • 2019精炼的大数据技术学习路线

    近年来大数据BigData、人工智能AI、物联网Iot等行业发展迅猛,很多人都想要从事大数据技术开发工作,但是,请问要怎么做,路线是什么?从哪里开始学?学哪些?...

    用户2292346
  • BigData--MapReduce进阶(二)之工作机制

    Bean对象实现WritableComparable几口,重写compareTo()方法

    MiChong
  • BigData--MapReduce进阶(一)之框架原理

    数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。

    MiChong
  • Storm简介及Storm集群的安装部署

    (1)Storm简介 Storm最早是由BackType公司开发的实时处理系统,底层由Clojure实现。Clojure也是一门基于JVM的高级面向函数式的编...

    魏晓蕾
  • 【Spark】Spark Local 及 Spark On Standalone 环境搭建

    (1)解压spark安装包 $ cd /opt/softwares/cdh cdh]$ tar -zxf spark-1.6.1-bin-2.5.0-cdh...

    魏晓蕾
  • 大数据的那些事(1):Google的后悔药

    新坑,鉴于工作越来越忙,填坑速度会慢一些,一周争取两到三次更新吧。 大数据这个概念红红火火的也有两三个年头了,我在这个坑里的时间可能要更长一些,勉强可以从08...

    用户1564362
  • 大数据与Hadoop最有影响力150人(英)

    There are more than 284 million activeusers on twitter. This makes following t...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券