切片机制和MR工作机制

InputFormat基类

  • TextInputFormat:TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable类型。

  • CombineTextInputFormat:CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。

  • CombineTextInputFormat切片机制

    • 虚拟存储过程:将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较;
      • 小于maxSplitSize:逻辑上划分1块
      • 大于2*maxSplitSize:以最大值划分一块
      • 介于之间时:均分为2块
    • 切片过程
      1. 判断虚拟文件大小是否大于max切片大小
      2. 大于时,单独形成一个切片
      3. 小于时,跟下一个虚拟存储文件进行合并,共同形成一个切片。

切片机制

数据倾斜问题:某个切片的大小太小,浪费了MapTask的CPU资源。
如果剩余数据长度大于128*1.1, 就切片成2份。

MapReduce工作机制

Map阶段

  1. 索引id是哈希和字典序的结合,形象上可以将索引id看做key来进行快排。
  2. 对索引id对索引进行快速排序
  3. 写入磁盘,需要按照分区进行写入,整体有序,分区写入时局部也是有序的。写入时是通过索引在环形缓冲区的右侧数据部分查找对应的数据。
  4. 环型缓冲区一般为100M,实际是指Map的读取数据写入缓冲区和缓冲区索引快排后溢写磁盘的那种往返行为,两者的方向是相反的,一般来说进行快排和溢写(是追加写)的速度是很快的,可以保证写入数据无需等待同时进行,提升效率。
  5. Map在进行溢写后会产生很多局部有序的分区文件,将数据交付给Map前会先进行归并排序,将局部有序的分区文件合并为整体有序的分区数据。

Reduce阶段

  1. copy:从不同Map中拉取分区后的数据
  2. sort:由于是不同Map中的数据,仍然是局部有序,整体无序的数据,Reduce需要将其进行归并排序成为整体有序的数据。
  3. reduce:进行数据的计算

Shuffle机制

Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。

  1. Combiner操作:归并排序后有一次默认的合并操作,第二次合并需要考虑溢写的次数,由于combine合并时需要从磁盘读取数据,数据数量太少时进行合并效率并不高。
  2. Combiner操作是将计算过程提前到了Map阶段,由于Map阶段的数据量较少,一般情况下每次最多128M的数据,减少Reduce阶段的压力。
  3. 进行combiner操作后的结果会一部分放入内存,一部分放入磁盘,后续使用时需要分别进行归并排序合并总体结果,公共需要进行3次归并排序。
  4. 当设置reduceNum为0时,只有map阶段,没有reduce阶段,就没有shuffle阶段。

Partition分区

默认分区器

  1. 分区操作在map阶段之后
  2. key.hashCode() & Integer.MAX_VALUE去除负数
  3. reduce阶段中有默认分区器:
    • 相同的key永远进入同一个分区
    • 不同的key有可能进入不同分区
    • 分区无论怎么算都不会有负数诞生,已经不会超过reduce的上限
  4. 如果对输出结果有具体的分区要求,需要定义分区,继承Partition类
    • 根据业务逻辑定义分区数量
    • 分区数量确定时,分区号已经确定了
    • 如果分区数量大于返回的分区号,会导致reduce空转
    • 如果reduce的数量小于返回的分区号,会报错
    • 当分区数为1时,代码会使用默认的分区器

Combiner合并

  1. Combiner是MR程序中的Mapper和Reducer之外的一种组件
  2. Combiner组件的父类就是Reducer
  3. Combiner和Reducer的区别在于运行的位置
    - Combiner是在每一个MapTask所在的节点运行
    - Reducer是在ReduceTask节点运行
  4. 本质上代码都是一样的,可以直接使用原本的Reduce类作为Combiner类
  5. 如果将ReduceTask的数量设置为0,Combiner将直接不执行,输出结果连排序都没有做,在map阶段直接退出了。即shuffle和reduce两个过程都没有执行。

OutputFormat数据输出

基本上不需要自己实现,有很多现成的工具类,比如Flume, 除非您的公司有自己的文件系统,否则不需要自己操心。

总结

  1. MapTask做了什么?
    • input = 切割 + 读取
    • map:环形缓冲区溢写
    • sort:快排后写入磁盘
  2. ReduceTask做了什么?
    • copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
    • sort阶段:对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
    • reduce阶段:进行数据的规约合并并将结果写入HDFS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/72561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt5下遍历QList的方法

lines定义如下 QMap<QString,Line> lines; Line的定义如下 class Line{protected:QString name;QColor color;QList<int> total_stations; // all statuibQList<QString> start_stas,end_stas; //start end stationQList<QList<QString>>sta_li…

Golang - api中生产数据,另一个进程控制并发数去消费api中生产的数据

api示例&#xff1a;该实例主要功能是实现一个API&#xff0c;API在调用的时候会向channel中发送任务数据。Consumer函数去消费channel中的任务数据&#xff0c;并且可以通过maxConcurrency去控制消费的并发数 package mainimport ("fmt""github.com/kataras/i…

微信小程序和 Vue 中的遍历循环和列表渲染有一些区别。

在微信小程序中&#xff0c;我们可以使用 wx:for 指令来进行遍历循环&#xff0c;例如&#xff1a; <view wx:for"{{items}}" wx:key"index">{{item}}</view>这里的 items 是一个数组&#xff0c;wx:for 指令会遍历这个数组&#xff0c;并将数…

区块链技术的应用场景和优势

区块链技术的应用场景和优势主要包括以下几个方面&#xff1a; 金融领域&#xff1a;区块链技术可以实现去中心化的交易和支付&#xff0c;提高交易速度和安全性&#xff0c;降低交易成本&#xff0c;有效防止恶意攻击和欺诈行为。比如比特币和以太坊就是区块链技术在金融领域的…

React原理 - React Reconciliation-上

目录 扩展学习资料 React Reconciliation Stack Reconciler【15版本、栈协调】 Stack Reconciler-事务性 事务性带来的弊端&#xff1a; 扩展学习资料 名称 链接 备注 官方文档 Reconciliation – React 英文 stack reconciler Implementation Notes – React 英文…

Ubuntu22.04安装Mongodb7.0

Ubuntu安装Mongodb 1.平台支持2.安装MongoDB社区版2.1导入包管理系统使用的公钥2.2为MongoDB创建列表文件2.3重新加载本地包数据库2.4安装MongoDB包1.安装最新版MongoDB2.安装指定版MongoDB 3.运行MongoDB社区版1.目录2.配置文件3.初始化系统4.启动MongoDB5.验证MongoDB是否成功…

java 实现原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许创建对象的副本&#xff0c;而无需暴露对象的创建细节。在Java中&#xff0c;原型模式通常通过克隆对象来实现。要实现原型模式&#xff0c;需要满足以下条件&#xff1a; 被克隆的对…

Spring是如何解决循环依赖的问题的?

循环依赖是指多个Bean之间互相依赖&#xff0c;形成一个闭环的情况。这种情况可能会导致系统无法正常初始化或运行&#xff0c;因此需要一种机制来解决循环依赖问题。 Spring解决循环依赖问题的核心思想是延迟注入和三级缓存机制。下面详细介绍这些概念&#xff1a; 1. 延迟注…

Python的pandas库来实现将Excel文件转换为JSON格式的操作

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

物联网应用中蓝牙模块怎么选?_蓝牙模块厂家

在蓝牙模块选型前期&#xff0c;一定要了解应用场景以及需要实现的功能&#xff08;应用框图&#xff09;&#xff0c;以及功能实现过程中所能提供调用的接口&#xff08;主从设备&#xff0c;功能&#xff09;&#xff0c;考虑模块供电&#xff0c;尺寸&#xff0c;接收灵敏度…

【已更新建模代码】2023数学建模国赛B题matlab代码--多波束测线问题

一、 问题重述 1.1问题背景 海洋测深是测定水体深度与海底地形的重要任务&#xff0c;有两种主要技术&#xff1a;单波束测 深与多波束测深。单波束适用于简单任务&#xff0c;但多波束可提供更精确的地形数据。多 波束系统的关键在于覆盖宽度与重叠率的设计&#xff0c;以确保…

【JavaSE】面试01

文章目录 1. JDK、JRE、JVM之间的关系2. 补充3. 面试题&#xff1a;重载和重写的区别&#xff1f;4. super和this5. &#xff08;重点&#xff01;&#xff01;&#xff09;若父类和子类均有静态代码块、实例代码块以及无参构造方法&#xff0c;则继承关系上的执行顺序&#xf…

RK3588平台产测之ArmSoM-W3 DDR压力测试

1. 简介 RK3588从入门到精通 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试&#xff0c;以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验 2. 环境介绍 硬件环境&#xff1a; …

Hadoop生态之hive

一 概述与特点 之所以把Hive放在Hadoop生态里面去写,是因为它本身依赖Hadoop。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能。 其本质是将 SQL 转换为 MapReduce/Spark 的任务进行运算,底层由 HDFS 来提供…

JavaExcel:自动生成数据表并插入数据

故事背景 出于好奇&#xff0c;当下扫描excel读取数据进数据库 or 导出数据库数据组成excel的功能层出不穷&#xff0c;代码也是前篇一律&#xff0c;poi或者easy excel两种SDK的二次利用带来了各种封装方法。 那么为何不能直接扫描excel后根据列的属性名与行数据的属性建立S…

UDP攻击是什么?

UDP是一个简单的面向数据报的运输层协议&#xff0c;也是最常见的作为流量攻击最多的一种协议&#xff0c;需要用到UDP的主要都是视频通讯&#xff0c;枪战类实时通讯的游戏类。UDP不提供可靠性&#xff0c;它只是把应用程序传给IP层的数据报发送出去&#xff0c;但并不保证它们…

备战计算机二级公共基础知识(五)----数据库设计基础

数据库设计基础 目录 数据库设计基础 数据库的基本概念&#xff1a;数据库&#xff0c;数据库管理系统&#xff0c;数据库系统 数据模型&#xff0c;实体联系模型及 &#xff25;&#xff0d;&#xff32; 图&#xff0c;从 &#xff25;&#xff0d;&#xff32; 图导出关系…

基于JAVA SSM框架和JSP的超市小卖部管理系统设计

摘要 随着时代的发展&#xff0c;传统的超市购物方式已经不能满足人们的需求&#xff0c;对于顾客来说&#xff0c;排队购物和支付购物费用的问题亟待解决。对于实体超市来说&#xff0c;他们面临着网上购物的竞争压力&#xff0c;作为超市经理&#xff0c;他们要降低成本&…

如何自启动MySQL服务与解决MySQL字符集问题

1、自启动mysql服务 &#xff08;1&#xff09;查看mysql是否自启动&#xff08;默认自启动&#xff09; systemctl list-unit-files|grep mysqld.service &#xff08;2&#xff09;如不是enabled可以运行如下命令设置自启动 systemctl enable mysqld.sercice2、字符集…

SpringBoot 博客网站

SpringBoot 博客网站 系统功能 登录注册 博客列表展示 搜索 分类 个人中心 文章分类管理 我的文章管理 发布文章 开发环境和技术 开发语言&#xff1a;Java 使用框架: SpringBoot jpa H2 Spring Boot是一个用于构建Java应用程序的开源框架&#xff0c;它是Spring框架的一…