切片机制和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,一经查实,立即删除!

相关文章

React原理 - React Reconciliation-上

目录 扩展学习资料 React Reconciliation Stack Reconciler【15版本、栈协调】 Stack Reconciler-事务性 事务性带来的弊端: 扩展学习资料 名称 链接 备注 官方文档 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是否成功…

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

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

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

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

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

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

【JavaSE】面试01

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

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

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

Hadoop生态之hive

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

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

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

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

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

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

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

SpringBoot 博客网站

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

Unity——脚本与导航系统

Unity内置了一个比较完善的导航系统,一般称为Nav Mesh(导航网格),用它可以满足大多数游戏中角色自动导航的需求。 一、导航系统相关组件 Unity的导航系统由以下几个部分组成: Nav Mesh。Nav Mesh与具体的场景关联&…

终端登录github两种方式

第一种方式 添加token,Setting->Developer Setting 第二种方式SSH 用下面命令查看远程仓库格式 git remote -v 用下面命令更改远程仓库格式 git remote set-url origin gitgithub.com:用户名/仓库名.git 然后用下面命令生成新的SSH秘钥 ssh-keygen -t ed2…

请大家一定不要像我们公司这样打印log日志

前言 最近接手了公司另一个项目,熟悉业务和代码苦不堪言。 我接手一个新项目,有个习惯,就是看结构,看数据库,搜代码。 其中搜代码是我个人这些年不知不觉形成的癖好,我下面给大家展示下这个小癖好。 正文 我…

vue3:3、项目目录和关键文件

关于vsvode的更改 <!-- 加上setup允许在script中直接编写组合式api --> <script setup> // 组件引入后直接用 import HelloWorld from ./components/HelloWorld.vue import TheWelcome from ./components/TheWelcome.vue</script><!-- 1、js放在最上面&am…

linux安装postgresql13

linux安装postgresql13 1. 安装2. 数据库初始化3.配置远程访问3.1 修改配置文件3.2 重启服务3.3 测试连接 1. 安装 linux下载链接&#xff1a;https://www.postgresql.org/download/linux/ubuntu/安装命令sudo sh -c echo "deb https://apt.postgresql.org/pub/repos/apt…

20230908_python练习_服务端与客户端数据交互

用户可以通过简单操作进行服务端数据交互&#xff0c;通过简单的sql语句直接获取EXCEL表&#xff0c;可以用来作为交互的基础。主要涉及三部分&#xff1a; 1:数据库存储表结构 --日志记录表结构 create table shzc.yytowz_service_title (leixing varchar2(18),ziduan1 v…

软件测试/测试开发丨学会与 AI 对话,高效提升学习效率

点此获取更多相关资料 简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中&#xff0c;沟通本来就是很重要的一门课程&#xff0c;沟通的过程中表达越清晰&#xff0c;给到的信息越多&#xff0c;那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&…

单目标应用:基于成长优化算法(Growth Optimizer,GO)的微电网优化调度MATLAB

一、微网系统运行优化模型 微电网是由分布式电源、储能装置和能量转换装置等组成的小型发配电系统&#xff0c;具有成本低、电压低、污染小等特点。由于环保和能源压力&#xff0c;清洁可再生能源和分布式能源工业发展潜力巨大。微电网控制器可实现对电网的集中控制&#xff0…