首页 > 其他分享 >深入MapReduce计算引擎

深入MapReduce计算引擎

时间:2023-08-13 21:00:25浏览次数:28  
标签:Mapper Map MapReduce job 引擎 深入 context map

深入MapReduce计算引擎

MapReduce整体处理过程

MapReduce的运行需要经过input(作业输入)--mapper(业务处理接口)--shuffle(map到reduce之间的数据传输环节)--reducer(业务处理接口)--output(作业输出)

整个过程由Driver作为主入口,如下示例代码:

Driver code

Configuration conf= new Configuration();
Job job = new Job(conf,"My Word Count Program");
job.setJarByClass(WordCount.class);

job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
Path outputPath = new Path(args[1]);
//Configuring the input/output path from the filesystem into the job
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

Input

作业输入的核心是InputFormat类,作用是规范作业输入和读取数据的格式。

InputFormat涉及三个接口:InputFormat,InputSplit,RecordReader。

InputFormat Interface

包含两个方法

  • getSplit():获取逻辑分片(InputSplit),逻辑分片用于指定输入到每个Mapper任务的文件大小;
  • getRecordReader():获取记录读取器,记录读取器根据逻辑分配读取文件相应位置的数据,以kv的形式传给Mapper。

InputSplit Interface

包含两个方法:

  • getLength():获取每个分片的大小;
  • getLocations():获取每个分片所在的位置。

RecordReader Interface

包含五个方法:

  • close():close the record reader;
  • getCurrentKey():获取当前的key;
  • getCurrentValue():获取当前的value;
  • nextKeyValue():读取下一个key-value对;
  • getProgress():读取当前逻辑分片的进度。

Mapper

Mapper类负责MapReduce计算引擎在Map阶段的业务逻辑处理。其输入输出均是kv形式,具体的业务逻辑由用户自主开发。核心是Map()。

以下为wordcount的mapper类:

mapper类除了提供map方法外,还提供了其他一些api

run()方法的源码如下:

public void run(Context context) throws IOException, InterruptedException {
    setup(context);
    try {
      while (context.nextKeyValue()) {
        map(context.getCurrentKey(), context.getCurrentValue(), context);
      }
    } finally {
      cleanup(context);
    }
  }

调用run(),通过run()调用setup(),初始化一些信息;再进行一个while循环,将数据一行行循环调用map()方法,最后跳出循环cleanup()释放资源。

扩展:

1. Mapper阶段是一种只移动数据计算逻辑,而不移动数据的模式;mapper中的逻辑会分发到集群的各个节点,并读取节点的本地数据进行处理,最后再写入本地。

2. MapReduce只简单定义了业务处理的输入输出规范,没有丰富的api供业务逻辑开发。相较于Spark来说不易使用。

Reducer

Recuder也是一个业务逻辑实现类,但是输入不同与Mapper,由于Reduce阶段将key相同的value聚集,因此输入的value是集合类型;而输出则同Mapper一致,是kv对形式。Reducer的核心是reduce()。

以下为wordcount的reducer类:

Reducer除了reduce(),同样提供了cleanup() run() setup()。

MapReduce Shuffle

shuffle在官方定义是Mapper输出到Reducer输入的整个,而《Hive性能调优实战》的作者认为shuffle是Mapper类的map()的输出到Reducer类的reduce()的输入整个过程。

下图是MapReduce整体环节的拆解:

可以清晰得看到,map方法结束到reduce方法开始中间经历的步骤。

  1. 在map()方法中,会调用context.write()会将数据计算分区后写入到内存缓冲,当写入数据达到缓冲区(缓冲区大小mapreduce.task.io.sort.mb=100MB)的80%(mapreduce.map.sort.spill.percent=0.8)后,会重新启动一个线程将缓冲区数据写入到hdfs临时目录中。

  2. 在写入hdfs临时目录时,会将数据进行排序,当整个Map阶段结束后,再将临时文件合并成一个文件。

    排序的好处:如果不进行排序,后续Reducer读取该份数据时就需要频繁搜索磁盘,将顺序读变为随机读,会极大降低效率。

    1. Combiner可以进行Map端的聚合(Map端聚合通常指实现Combiner类)。所谓Map端聚合就是在节点先对本地的Mapper进行一次数据聚合,此次数据聚合可以重新编写Conbiner类,也可以使用Reducer类实现业务逻辑。示例如下:

      job.setCombinerClass(IntSumReducer.class)
      

      Map端聚合的好处,限制MapReduce任务的一大瓶颈就是网络传输和io读写。先进行Map端聚合可以减少Suffle过程的数据量,减轻系统磁盘和网络的压力。

Output

Output作业输出主要包含两个类:OutputFormat和OutputCommitter

OutputFormat

包含三个方法:

  • checkOutputSpecs():校验作业的输出规范;
  • getOutputCommitter():获取OutputCommitter对象;
  • getRecordWriter():获取RecordWriter对象,通过该对象将数据写入到HDFS。

OutputCommitter

主要工作:

  • 初始化期间,做作业运行的准备工作;如创建临时目录;
  • 作业完成后,清理作业遗留的文件目录;
  • 检查任务是否需要提交;
  • 提交输出任务,任务完成后就需要提交任务;
  • 丢弃任务提交,任务失败或终止,清理输出。

参考资料:

  1. 《Hive性能调优实战》,林志煌编著。

标签:Mapper,Map,MapReduce,job,引擎,深入,context,map
From: https://www.cnblogs.com/nangk/p/17627260.html

相关文章

  • Python文件路径解谜:深入剖析os.path系列函数的精髓
    介绍在Python中,os.path模块提供了一系列用于处理文件路径和文件系统的函数。它是Python标准库中os模块的一部分。本文将深入探讨os.path系列函数的使用方法,从入门到精通。目录导入os.path模块获取文件路径信息os.path.abspath():获取绝对路径os.path.dirname():获取目录......
  • Unity的AssetPostprocessor之Model之动画:深入解析与实用案例 3
    UnityAssetPostprocessor的Model的动画相关的函数修改实际应用在Unity中,AssetPostprocessor是一个非常有用的工具,它可以在导入资源时自动执行一些操作。其中,Model的动画相关的函数修改可以帮助我们在导入模型时自动修改动画相关的函数,从而提高我们的工作效率。本文将介绍如何使......
  • 【Freertos基础入门】深入浅出freertos互斥量
    @TOC前言FreeRTOS是一款开源的实时操作系统,提供了许多基本的内核对象,其中包括互斥锁(Mutex)。互斥锁是一种常用的同步机制,用于确保在同一时间内只有一个任务可以访问共享资源,防止竞态条件等并发问题。本文将介绍FreeRTOS中的互斥锁的使用方法和注意事项。一、互斥量是什么?当多个任务......
  • 深入理解JavaScript正则表达式:释放其强大力量
    深入理解JavaScript正则表达式:释放其强大力量正则表达式是一种强大的工具,用于在字符串中搜索、匹配和替换特定的模式。在JavaScript中,正则表达式是一种内置的功能,可以帮助开发人员处理各种字符串操作。本文将深入探讨JavaScript正则表达式的原理、语法和应用场景,帮助读者充分理解......
  • ChatGPT联网查询基于yahoo搜索引擎
    联网查询原理很简单1.对搜索内容分词2.将分词后的内容用yahoo搜索3.将搜索返回的内容交给ChatGPT整理提炼Demo代码如下importfetchfrom'node-fetch';importSegmentfrom'segment';import{HttpsProxyAgent}from'https-proxy-agent';constproxyUrl='http://1......
  • 深入探究 Spring Boot 自动配置的神奇原理
    SpringBoot是一个广泛使用的微服务框架,以其自动配置功能而著称。这种自动配置功能使开发人员能够快速设置和部署应用程序,而无需显式地配置大量的组件。在本篇博客中,我们将深入探究SpringBoot自动配置的原理,了解它是如何工作的,并通过代码示例演示如何自定义自动配置。1.解析自......
  • 深入解析 Spring Boot 自动配置原理
    SpringBoot作为一个广泛应用的微服务框架,以其强大的自动配置功能而受到瞩目。这一功能能够让开发人员在搭建和部署应用程序时,无需显式配置大量组件。在这篇博客中,我们将深入解析SpringBoot自动配置的原理,揭示其背后的奥秘,并通过代码示例演示如何定制自动配置。1.自动配置的核......
  • 深入理解 Spring Bean 的生命周期与初始化过程
    SpringFramework是一个广泛使用的开发框架,它提供了强大的依赖注入和控制反转功能,同时也涉及了丰富的Bean生命周期管理。在本篇博客中,我们将深入探讨SpringBean的生命周期以及初始化过程,并通过代码示例演示每个阶段的实际调用。1.Bean生命周期阶段SpringBean的生命周期可......
  • 深入探索 Spring Boot 自动配置原理
    SpringBoot是一个流行的微服务框架,以其自动配置功能而闻名。这种自动配置使得开发人员可以快速搭建和部署应用程序,而无需显式地配置大量的组件。在本篇博客中,我们将深入探索SpringBoot自动配置的原理,了解它是如何工作的,并通过实例代码演示自定义自动配置。1.自动配置的背后Sp......
  • 数据库技术--数据库引擎,数据访问接口及其关系详解(附赠形象的比喻)
    背景    数据库技术在现代信息系统中扮演着重要的角色,vb书中有一章讲数据库技术的,里面涉及很多概念,针对这些概念进行一下学习。数据库引擎    数据库引擎是指负责管理和处理数据库的核心组件。它提供了对数据库的访问、查询、更新和维护等功能,就好比汽车的发动机。数据......