• Hadoop学习笔记(4)——MapReduce(1)


    目录

    一、MapReduce概述

    1、MapReduce定义

    2、MapReduce优缺点

    2.1 优点

    2.2 缺点

    3、MapReduce核心思想 

    4、MapReduce进程

    5、官方WordCount源码

    6、常用数据序列化类型

    7、MapReduce编程规范 

    8、WordCount案例实操

    8.1 本地测试 

    8.2 案例集群运行


     

    MapReduce内容: 

     

    一、MapReduce概述

    1、MapReduce定义

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

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

    2、MapReduce优缺点

    2.1 优点

    1)MapReduce易于编程

    它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce编程变得非常流行。

    2)良好的扩展性

    当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。

    3)高容错性

    MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。

    4)适合PB级以上海量数据的离线处理

    可以实现上千台服务器集群并发工作,提供数据处理能力。

    2.2 缺点

    1)不擅长实时计算

    MapReduce无法像MySQL一样,在毫秒或者秒级内返回结果。

    2)不擅长流式计算

    流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。

    3)不擅长DAG(有向无环图)计算

    多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

    3、MapReduce核心思想 

     

    4、MapReduce进程

     

    5、官方WordCount源码

            采用反编译工具反编译源码,发现WordCount案例有Map类、Reduce类和驱动类。且数据的类型是Hadoop自身封装的序列化类型。

    6、常用数据序列化类型

    7、MapReduce编程规范 

     

    8、WordCount案例实操

    8.1 本地测试 

     

    代码:

    WordCountMapper

    1. package com.me.mapreduce.wordcount;
    2. import org.apache.hadoop.io.IntWritable;
    3. import org.apache.hadoop.io.LongWritable;
    4. import org.apache.hadoop.io.Text;
    5. import org.apache.hadoop.mapreduce.Mapper;
    6. import java.io.IOException;
    7. /**
    8. * Mapper<>中的泛型参数说明
    9. * KEYIN:map阶段输入的key的类型:LONGWritable(这个参数是偏移量)
    10. * VALUEIN:map阶段输入的value类型:Text
    11. * KEYOUT:map阶段输出的key类型:Text
    12. * VALUEOUT:map阶段输出的value类型:IntWritable
    13. */
    14. public class WordCountMapper extends Mapper {
    15. private Text outK = new Text();
    16. private IntWritable outV = new IntWritable(1);
    17. @Override
    18. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    19. //1、获取一行
    20. String line = value.toString();
    21. //2、切割
    22. String[] words = line.split(" ");
    23. //3、循环写出
    24. for (String word : words) {
    25. //封装
    26. outK.set(word);
    27. //写出
    28. context.write(outK, outV);
    29. }
    30. }
    31. }

    WordCountReducer

    1. package com.me.mapreduce.wordcount;
    2. import org.apache.hadoop.io.IntWritable;
    3. import org.apache.hadoop.io.Text;
    4. import org.apache.hadoop.mapreduce.Reducer;
    5. import java.io.IOException;
    6. /**
    7. * Reducer<>中的泛型参数说明
    8. * KEYIN:reduce阶段输入的key的类型:Text
    9. * VALUEIN:reduce阶段输入的value类型:IntWritable
    10. * KEYOUT:reduce阶段输出的key类型:Test
    11. * VALUEOUT:reduce阶段输出的value类型:IntWritable
    12. */
    13. public class WordCountReducer extends Reducer {
    14. private IntWritable outV = new IntWritable();
    15. @Override
    16. protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
    17. int sum = 0;
    18. //两个atguigu被切分后,变成(atguigu,1),传入reduce中又会变成(atguigu,(1,1))
    19. for (IntWritable value : values) {
    20. sum += value.get();
    21. }
    22. outV.set(sum);
    23. //写出
    24. context.write(key, outV);
    25. }
    26. }

     

    WordCountDriver

    1. package com.me.mapreduce.wordcount;
    2. import org.apache.hadoop.conf.Configuration;
    3. import org.apache.hadoop.fs.Path;
    4. import org.apache.hadoop.io.IntWritable;
    5. import org.apache.hadoop.io.Text;
    6. import org.apache.hadoop.mapreduce.Job;
    7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    9. public class WordCountDriver {
    10. public static void main(String[] args) throws Exception {
    11. //1、获取job
    12. Configuration conf = new Configuration();
    13. Job job = Job.getInstance(conf);
    14. //2、设置jar包路径
    15. job.setJarByClass(WordCountDriver.class);
    16. //3、关联mapper和reducer
    17. job.setMapperClass(WordCountMapper.class);
    18. job.setReducerClass(WordCountReducer.class);
    19. //4、设置map输出的kv类型
    20. job.setMapOutputKeyClass(Text.class);
    21. job.setMapOutputValueClass(IntWritable.class);
    22. //5、设置最终输出的kv类型
    23. job.setOutputKeyClass(Text.class);
    24. job.setOutputValueClass(IntWritable.class);
    25. //6、设置最终输出的kv类型
    26. FileInputFormat.setInputPaths(job, new Path("D:\\Hadoop\\input\\inputword"));
    27. FileOutputFormat.setOutputPath(job, new Path("D:\\Hadoop\\output1"));
    28. //7、提交job
    29. boolean result = job.waitForCompletion(true);
    30. System.exit(result ? 0 : 1);
    31. }
    32. }

    8.2 案例集群运行

     

     后面的内容之后再进行学习

     

  • 相关阅读:
    教你复制大量文件,保存到多个文件夹中
    MQTT协议消息代理服务公网远程连接
    夯实基础,不能忽视的“数据库”
    智工教育:环评师考试重要知识点
    Windows环境部署Hadoop-3.3.2和Spark3.3.2
    车载通信架构 —— SOME/IP-SD 协议介绍
    redis 发布者订阅者实例
    RL Note 1, Basic Concepts in Reinforcement Learning
    SAP BC ENQUEUE_READ
    三行Python代码即可将视频转Gif
  • 原文地址:https://blog.csdn.net/qq_64557330/article/details/126086855