大数据之MapReduce

这篇具有很好参考价值的文章主要介绍了大数据之MapReduce。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MapReduce概述

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

  • 优点:
    • 易于编程,简单的实现一些接口,就可以完成一个分布式程序。
    • 良好的扩展性,可以增加机器来扩展计算能力。
    • 高容错性,子任务失败后可以重试4次。
  • 缺点:
    • 不擅长实时计算
    • 不能进行流式计算,MapReduce的输入数据集是静态的,不能动态变化。
    • 不擅长DAG有向无环图:下一段计算的起始数据取决于上一个阶段的结果。

MapReduce核心思想

  1. Map: 读单词,进行分区
  2. Shuffle:排序是框架内固定的代码,必须排序。进行快排
  3. Reduce:对区间有序的内容进行归并排序,累加单词
  4. 在MapReduce过程中只能有一个Map和一个Reduce
  • MapReduce进程
  1. MrAppMaster:负责整个程序的过程调度及状态协调。
  2. MapTask:负责Map阶段的整个数据处理流程。
  3. ReduceTask:负责Reduce阶段的整个数据处理流程。
  • 序列化
    • 变量类型后面加上Writable,转换成可以序列化的类型
    • String类型有点特别,相应的序列化类型为Text
    • java类型转hadoop类型
      • private IntWritable key = new IntWritable();
      • key.set(java_value);
      • 构造器转换 new intWritable(1);
    • hadoop类型转java类型
      • int value = key.get();

WordCount案例

Driver类的8个步骤

该类中的步骤是使用hadoop框架的核心,这8个步骤是写死的,无法更改,具体为:

  1. 获取配置信息,获取job对象实例
  2. 指定本程序的jar包所在的本地路径
  3. 关联Mapper/Reducer业务类
  4. 指定Mapper输出数据的kv类型
  5. 指定最终输出数据的kv类型,部分案例不需要reduce这个步骤
  6. 指定job的输入原始文件所在目录
  7. 指定job的输出结果所在目录
  8. 提交作业

WordCountMapper类的实现

  1. 继承mapper类,选择mapreduce包,新版本,老版本的叫mapred包
  2. 根据业务需求设定泛型的具体类型,输入的kv类型,输出的kv类型。
    • 输入类型
      • keyIn:起始偏移量,是字节偏移量。一般不参与计算,类型为longwritable
      • valueIn:每一行数据,类型为Text
    • 输出类型
      • keyOut: 每个单词
      • valueOut:数字1
  3. 重写map方法,ctrl + o 快捷键重写方法
	@Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        //1.获取一行
        // atguigu atguigu
        String line = value.toString();

        //2.切割
        //atguigu
        //atguigu
        String[] words = line.split(" ");

        //3.循环写出
        for (String word : words) {
            //封装outKey
            context.write(new Text(word),new IntWritable(1));
        }
    }

WordCountReducer类的实现

  1. 继承Reduce类
  2. 设置输入输出类型
    • 输入: 跟Map的输出类型对应即可
    • 输出:
      • keyInt, 单词,类型为Text
      • keyOut, 次数,类型为IntWritable
  3. 重写reduce方法
	@Override
    protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        int sum = 0;
        //atguigu(1,1)
        //累加
        for (IntWritable value : values) {
            sum += value.get();
        }
        //写出
        context.write(key, new IntWritable(sum);//注意
    }

在处理大数据时,不要在循环中new对象,创建对象是很消耗资源的。可以使用ctrl + alt + F将这两个变量提升为全局变量,作为Reducer类的属性值。但其实还有更好的方法,可以使用Mapper类中的setup()方法来实现该需求。该方法是框架里面原本就设定好的方法,在map阶段前只会执行1次。

private Text outKey;
    private IntWritable outValue;

    @Override
    protected void setup(Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        outKey = new Text();
        outValue = new IntWritable(1);
    }

Driver类的实现

该类的写法基本上是固定的,不同需求只需要在此基础上修改一下map和reduce业务类即可。

public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

        //1.获取Job
        Configuration conf = new Configuration();
        Job job = Job.getInstance();

        //2.设置jar包路径,绑定driver类
        job.setJarByClass(WordCountDriver.class);

        //3.关联mapper和reducer
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);

        //4.设置map的kv类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

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

        //6.设置输入路径和输出路径
        FileInputFormat.setInputPaths(job, new Path("D:\\inputOutput\\input\\wordcount"));
        FileOutputFormat.setOutputPath(job, new Path("D:\\inputOutput\\output\\output666"));

        //7.提交job
        job.waitForCompletion(true);
    }

打包本地程序到集群中运行

  1. 修改本地程序Driver类中的输入输出路径
//6.设置输入路径和输出路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
  1. 使用maven的package命令打包本地程序成.jar文件,生成的jar包在target目录下
  2. 使用jar命令解压运行jar 包名 数据输入路径 数据输出路径

可以直接在window中的IDEA中发送任务到Linux集群中,但配置方式较为烦琐,生产环境中使用该方法的人较少。

序列化

java序列化

序列化目的是将内存的对象放进磁盘中进行保存,序列化实际上是为了传输对象中的属性值,而不是方法。序列化本质上是一种数据传输技术,IO流。

  • ObjectOutputStream 序列化流 writeObject()
  • ObjectInputStream 反序列化流 readObject(Object obj)
  • 序列化前提条件:
    • 实现Serializable接口
    • 空参构造器
    • 私有的属性
    • 准备get和set方法

总结:java序列化是一个比较重的序列化,序列化的内容很多,比如属性+校验+血缘关系+元数据。

hadoop序列化

特点: 轻量化,只有属性值和校验

hadoop中自定义bean对象步骤:

  1. 实现writable接口
  2. 空参构造器
  3. 私有的属性
  4. get和set方法
  5. 重写write方法和readFields方法(write方法出现的属性顺序必须和readFields的读取顺序一致)
  6. 如果自定义的bean对象要作为reduce的输出结果,需要重写toString方法,否则存入磁盘的是地址值
  7. 如果自定义的bean对象要作为map输出结果中的key进行输出,并进行reduce操作,必须实现comparable接口。

MapReduce框架原理

  • 粗略流程:mapreduce = map + reduce
  • 大体流程:mapreduce = inputFormat --> map --> shuffle(排序) --> reduce -->outputFormat
  • 源码流程:
    1. inputformat
    2. map
      • map
      • sort: 按照字典序进行快排
    3. reduce
      • copy:拉取map的处理结果
      • sort:由于结果是局部有序,不是整体有序,进行归并排序
      • reduce:之后再进行数据合并规约

InputFormat/OutputFormat基类

实现类有TextInputFormat和TextOutputFormat, 其中重点是切片逻辑和读写逻辑,读写部分的代码框架已经写死了,主要关注如何切片即可。

切片与MapTask并行度决定机制

数据块:Block是物理上真的分开存储了。
数据切片:只是逻辑上进行分片处理,每个数据切片对应一个MapTask。

正常来说,如果数据有300M,我们按照常理来说会平均划分成3 x 100 M,但是物理上每个物理块是128M,每个MapTask进行计算时需要从另外那个主机读取数据,跨越主机读取数据需要进行网络IO,这是很慢的。
大数据之MapReduce,大数据,mapreduce
所有MR选择的是按照128M来进行切分,尽管这样会导致划分的数据块并不是十分均匀,但是对于网络IO的延迟来说,还是可以接受的。文章来源地址https://www.toymoban.com/news/detail-697162.html

Hadoop提交流程源码和切片源码

提交源码主要debug节点

  1. job.waitForCompletion()
    • JobState枚举类,DEFINE、RUNING
  2. submit()
  3. connect()
    • 匿名内部类、new方法 无法进入,打好断点,点击快速运行进入
    • ctrl + alt + 左方向键,可以返回原先的位置
    • initProviderList(): 添加了本地客户端协议和Yarn客户端协议
    • create(conf): 根据配置文件来决定代码的运行环境(Yarn分布式环境/本地单机环境)
  4. submitter 根据运行环境获取相应的提交器
  5. checkSpecs(job):检查输出路径是否正确
  6. jobStagingArea: job的临时运行区域,给定一个绝对路径的目录D:\tmp\hadoop\mapred\staging,里面存放了:
    • local: 切片结果+8个配置文件总和
    • yarn:切片结果+8个配置文件总和+jar包
  7. copyAndConfigureFiles(): 读取任务需要的支持文件读取到job的临时运行环境中,在Yarn环境中,会上传jar包到该路径中
  8. writeSplits():给数据添加切片标记,实际还未切分,会生成切片文件到临时区域中
  9. writeConf(): 写配置文件到目录中

提交源码总结:

  • mapreduce.framework.name这个参数决定了运行环境
  • 切片个数决定了MapTask个数

到了这里,关于大数据之MapReduce的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据基础篇--MapReduce工作原理

    理解什么是map,什么是reduce,为什么叫mapreduce MapReduce可以分成Map和Reduce两部分理解。 Map详解 1.Map:映射过程,把一组数据按照某种Map函数映射成新的数据。我们将这句话拆分提炼出重要信息,也就是说,map主要是:映射、变换、过滤的过程。一条数据进入map会被处理成多条

    2024年02月04日
    浏览(44)
  • 大数据开发之Hadoop(MapReduce)

    MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 1.2.1 优点 1、MapReduce易于编程 它简单的实现一些

    2024年01月22日
    浏览(49)
  • MapReduce:大数据处理的范式

            在当今的数字时代,生成和收集的数据量正以前所未有的速度增长。这种数据的爆炸式增长催生了大数据领域,传统的数据处理方法往往不足。MapReduce是一个编程模型和相关框架,已成为应对大数据处理挑战的强大解决方案。本文探讨了MapReduce的概念、其原理、应

    2024年02月05日
    浏览(36)
  • 云计算 - 3 - 使用MapReduce处理数据

    1.使用 MapReduce 实现对多个文本文件单词总数的统计(WordCount)。 2.使用 MapReduce 实现社交网站好友的推荐。 1.1 启动Hadoop 使用 start-dfs.sh 指令启动 hadoop。 1.2 在 HDFS 文件系统 创建文件夹来作为单词统计的输入 1.3 将用来统计的文件上传到刚建立的文件夹中。 这里选取 hado

    2024年02月06日
    浏览(43)
  • 头歌大数据MapReduce基础运用

    本关任务 词频统计是最能体现 MapReduce 思想的程序,结构简单,上手容易。 词频统计的大致功能是:统计单个或者多个文本文件中每个单词出现的次数,并将每个单词及其出现频率按照 k,v 键值对的形式输出,其基本执行流程如下图所示: 由图可知: 输入文本(可以不只一

    2024年02月05日
    浏览(45)
  • 头歌大数据MapReduce基础编程

    任务描述 本关任务:编程实现文件合并和去重操作。 相关知识 为了实现文件的合并去重,我们首先要知道文件中都有些什么,将文件内容进行“拆解”,映射(Map)到不同节点;然后在通过归约(Reduce)去除重复部分。 Map过程 用法如下: 重载 map 函数,直接将输入中的v

    2024年02月05日
    浏览(39)
  • Hadoop快速入门+MapReduce案例(赠送17到23年往年真题答案+MapReduce代码文件)-----大数据与人工智能比赛

    Hadoop的核心就是HDFS和MapReduce HDFS为海量数据提供了 存储 而MapReduce为海量数据提供了 计算框架 一.HDFS 整个HDFS有三个重要角色: NameNode (名称节点)、 DataNode (数据节点)和 Client (客户机) NameNode :是Master节点(主节点) DataNode : 是Slave节点(从节点),是文件存储的基本

    2024年02月20日
    浏览(52)
  • HDFS+ MapReduce 数据处理与存储实验

    了解HDFS的基本特性及其适用场景; 熟悉HDFS Shell常用命令; 学习使用HDFS的Java API,编程实现HDFS常用功能; 了解MapReduce中“Map”和“Reduce”基本概念和主要思想; 掌握基本的MapReduce API编程,并实现合并、去重、排序等基本功能; 实验平台:基于实验一搭建的虚拟机Hadoop大数

    2023年04月23日
    浏览(65)
  • 大数据学习(6)-hive底层原理Mapreduce

    大数据学习 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞 MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个

    2024年02月08日
    浏览(61)
  • 大数据课程D4——hadoop的MapReduce

    文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州 ⚪ 了解MapReduce的作用和特点; ⚪ 掌握MapReduce的组件; ⚪ 掌握MapReduce的Shuffle; ⚪ 掌握MapReduce的小文件问题; ⚪ 掌握MapReduce的压缩机制; ⚪ 掌握MapReduce的推测执行机制; ⚪ 掌握MapReduce的数据倾斜问题; 1.

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包