复习打卡大数据篇——Hadoop MapReduce

目录

1. MapReduce基本介绍

2. MapReduce原理


1. MapReduce基本介绍

什么是MapReduce

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


MapReduce思想

核心思想是:先分再合,分而治之,就是把一个复杂的问题先分为若干个小问题,计算后再汇总。map负责“分”,reduce负责“和”,这样做的好处是若干个小问题可以并行同时处理,彼此几乎无依赖关系,每个任务处理完都是一个局部的结果,最后reduce进行全局汇总计算,以此提升效率。不过前提是任务可以拆分,拆分之后没有依赖关系。


该思想在大数据上的应用

对相互间不具有计算依赖关系的大数据计算任务,实现并行最自然的办法就是采取MapReduce分而治之的策略。首先Map阶段进行拆分,把大数据拆分成若干份小数据,多个程序同时并行计算产生中间结果;然后是Reduce聚合阶段,通过程序对并行的结果进行最终的汇总计算,得出最终的结果。需要特别注意不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算。

MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行。MapReduce处理的数据类型是<key,value>键值对。实际使用中考虑每个阶段输入输出 key和value是什么。


MapReduce优点与缺点

  • 优点:易于编程、良好的扩展性、高容错性、适合海量数据的离线处理
  • 缺点:实时计算性能差、不能进行流式运算

MapReduce官方word count案例演示

首先在HDFS的/wordcount/input里准备一份单词数据


里面是几行单词:

现在任务是统计每个单词出现了几次,而且要使用mapreduce实现,在Hadoop的share/hadoop/mapreduce目录下官方提供了hadoop-mapreduce-examples-3.3.0.jar的jar包来实现简单的示例。执行下行代码,执行wordcount案例:

hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /wordcount/input /wordcount/output

可以看到首先是Connecting to ResourceManager连接yarn的RM申请资源,然后执行mapreduce,而且是map先100%了reduce才100%。

在指定的目标目录下生成了2个文件,一个是成功标识,一个是分区文件,这里只有一个分区,点开后可以看到已经完成了单词计数。

在word count案例中map阶段把输入的数据经过切割,全部标记1,输出就是<单词,1>。中间还有个shuffle阶段,经过默认的排序分区分组,key相同的单词会作为一组数据构成新的kv对。reduce阶段处理shuffle完的一组数据,该组数据就是该单词所有的键值对。对所有的1进行累加求和,就是单词的总次数。

读取数据组件,写出数据组件MR框架已经封装好,读取数据组件InputFormat、输出数据组件OutputFormat。

2. MapReduce原理

mapreduce超详细全流程:

  1. 把输入所有文件按照一定的标准逐个进行逻辑切片,形成切片规划。默认情况下,切片个数 = block块的个数,一个块默认是128M,每一个切片由一个MapTask处理,因此MapTask个数=切片个数=block块个数,其最终还是由文件个数和大小综合决定。
  2. 接下来每个map都相同,以一个map为例,其中读取数据的组件TextInputFormat是按照行进行读取的,一次读取一行数据,默认规则是把每一行文本内容解析成键值对。key是每一行的起始位置(单位是字节),value是本行的文本内容。
  3. 调用Mapper类中的map方法转换成我们的自己想要的kv结果 上阶段中每解析出来的一个<k,v>,调用一次map方法。每次调用map方法会输出零个或多个键值对。
  4. 按照一定的规则对第三阶段输出的键值对进行分区。默认是只有1个reducetask,只要用户不设置永远默认1个,用户也可以通过代码job.setNumReduceTasks(N)进行设置 。map输出的结果默认按照HashPartitoner哈希取模来分配分区编号,也就是map输出key的hashcode和reducetask个数取模的余数就是分区编号,虽然不能保证平均分配,但key一样的会分到一个区。
  5. 将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等,缓冲区数据大于0.8阈值触发溢写操作,将数据写入本地磁盘,溢写操作单独的线程进行处理的,如果单条数据过大超过80M则不经过缓冲区直接写入磁盘,在将数据写入磁盘之前需要对每个分区数据按key进行一次排序的操作(快速排序)。
  6. 把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件,合并小文件的时候同样进行排序(归并排序),最终产生一个有序的大文件,如果设置了combinclass(需要算法满足结合律),先在map端对数据进行一个压缩,再进行传输,map任务结束,reduce任务开始。
  7. ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。根据我们的hash取模规则相同的key会拉取到同一个Reduce节点,但是一个Reduce节点可以有多个key。
  8. 在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作,同时进行排序(归并排序),先基于内容做合并排序 , 当达到阈值溢写磁盘与spill溢写类似。
  9. 执行用户提供的reduce计算,键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到HDFS文件中。一个reduce输出一个文件。

Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle

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

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

相关文章

EDGE浏览器每次关闭时再次打开保存的密码就消失如何解决

文章目录 EDGE浏览器每次重启的时候保存的密码都消失如何解决&#xff1f; 打开EDGE浏览器点击三个点 点击设置 点击隐私、搜索和服务 找到选择每次关闭浏览器时要清除的内容 将开启的关闭即可

akamai3.0 wizzair 网站 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

中间件xxl-job安装

拉取镜像 docker pull xuxueli/xxl-job-admin:2.4.2 创建xxl-job-admin容器 docker create --name xxl-job-admin -p 9099:8080 -e PARAMS"--spring.datasource.urljdbc:mysql://192.168.96.57:3306/xxl_job2Unicodetrue&characterEncodingUTF-8 --spring.dataso…

软考-信息安全-网络安全体系与网络安全模型

4.1 网络安全体系概述 网络安全保障是一项复杂的系统工程&#xff0c;是安全策略&#xff0c;多种技术&#xff0c;管理方法和人员安全素质的综合。 4.1.1 网络安全体系概念 现代的网络安全问题变化莫测&#xff0c;要保障网络系统的安全&#xff0c;应当把相应的安全策略&a…

低代码开源项目Joget的研究——Joget8社区版安装部署

大纲 环境准备安装必要软件配置Java配置JAVA_HOME配置Java软链安装三方库 获取源码配置MySql数据库创建用户创建数据库导入初始数据 配置数据库连接配置sessionFactory&#xff08;非必须&#xff0c;如果后续保存再配置&#xff09;编译下载tomcat启动下载aspectjweaver移动jw…

flask后端开发(2):URL与视图

目录 URL定义request获取请求参数 gitcode地址&#xff1a; https://gitcode.com/qq_43920838/flask_project.git URL定义 from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello World!app.route(/profile) def profile():return 我是个人…

springboot配置oracle+达梦数据库多数据源配置并动态切换

项目场景&#xff1a; 在工作中很多情况需要跨数据库进行数据操作,自己总结的经验希望对各位有所帮助 问题描述 总结了几个问题 1.识别不到mapper 2.识别不到xml 3.找不到数据源 原因分析&#xff1a; 1.配置文件编写导致识别mapper 2.配置类编写建的格式有问题 3.命名…

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

LabVIEW应用在工业车间

LabVIEW作为一种图形化编程语言&#xff0c;以其强大的数据采集和硬件集成功能广泛应用于工业自动化领域。在工业车间中&#xff0c;LabVIEW不仅能够实现快速开发&#xff0c;还能通过灵活的硬件接口和直观的用户界面提升生产效率和设备管理水平。尽管其高成本和初期学习门槛可…

jenkins集成工具(一)部署php项目

目录 什么是CI 、CD Jenkins集成工具 一、Jenkins介绍 二、jenkins的安装和部署 环境部署 安装jenkins 安装gitlab 配置镜像源进行安装 修改密码 安装git工具 上传测试代码 Jenkins部署php项目wordpress 发布php代码 安装插件 测试代码发布 实现发布成功发送邮件…

【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData

当需要获知组件是否被销毁时&#xff0c;ECS是没有回调告知的&#xff0c;因此可以将组件继承于ISystemStateComponentData接口&#xff0c;这样即使组件的实体被销毁了&#xff0c;该组件本身是不会消失的&#xff0c;所以可以通过在组件实体销毁后&#xff0c;去设置状态组件…

双柱渐变图背景图

option {backgroundColor: #1b2735,tooltip: {//提示框组件trigger: axis,//触发类型 柱状图axisPointer:{type:shadow} //触发效果 移动上去 背景效果}, xAxis: [//x轴{type: category,//坐标轴类型 离散data: [1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月],//数据axisTick:f…

两种不同的LuaBehaviour生命周期绑定

在学习xLua时&#xff0c;发现xLua和LoxodonFramework的LuaBehaviour稍微有些不同&#xff0c;其中一个点是在调用DoString方法时的区别 1. xLua的版本中 直接使用Lua脚本环境进行绑定&#xff0c;这时候的Lua脚本调用生命周期函数是这样的 直接在Lua脚本中写函数就行 2. Lo…

XDP (eXpress Data Path):在操作系统内核中实现快速、可编程包处理

大家觉得有意义和帮助记得及时关注和点赞!!! 1 引言 1.1 现有方案&#xff08;kernel bypass&#xff09;存在的问题1.2 新方案&#xff1a;给内核网络栈添加可编程能力1.3 新方案&#xff08;XDP&#xff09;的优点1.4 本文组织结构2 相关工作 2.1 用户态轮询 vs. XDP2.2 内核…

XGPT用户帮助手册

文章目录 20242024.12.27 摘要 本文介绍如何使用XGPT软件, XGPT融合了当前最先进的人工智能技术&#xff0c;并专为国内用户优化。 2024 2024.12.27 XGPT v1正式发布, 特色功能: 具备图像文本多模态处理功能包含GPT等最先进模型国内可访问 B站视频介绍 图1 XGPT v1 快照

USB 状态机及状态转换

文章目录 USB 状态机及状态转换连接状态供电状态默认状态地址状态配置状态挂起状态USB 状态机及状态转换 枚举完成之前,USB 设备要经过一系列的状态变化,才能最终完成枚举。这些状态是 连接状态 - attached供电状态 - powered默认状态 - default地址状态 - address配置状态 -…

Simulink的Goto和From标签如何限定作用域

网上有很多关于Goto和From的标签文章&#xff0c;但是很少有人将Goto和From标签如何使用限定作用域的问题 Simulink 中 Goto 和 From 标签作用域设置及使用 在 Simulink 中&#xff0c;Goto 和 From 标签用于传递信号以简化模型的连线结构。通过限定它们的作用域&#xff0c;…

No.29 笔记 | CTF 学习干货

大家好呀&#xff01;我刚参加了美国线上CTF比赛&#xff0c;收获超多&#xff0c;特别感谢老师教我的干货知识。今天就和大家分享我的学习笔记。CTF像刺激冒险&#xff0c;有挑战有惊喜。 学习中我懂了很多知识技能&#xff0c;像密码学、Web安全、Misc题型等&#xff0c;它们…

Etcd注册中心基本实现

Etcd入门 什么是Etcd GitHub&#xff1a;https://github.com/etcd-io/etcd Etcd数据结构与特性 键值对格式&#xff0c;类似文件层次结构。 Etcd如何保证数据一致性&#xff1f; 表面来看&#xff0c;Etcd支持事务操作&#xff0c;能够保证数据一致性。 底层来看&#xff0…

【游戏设计原理】31 - 头脑风暴的方法

在游戏设计中&#xff0c;头脑风暴的方法可以贯穿整个创作流程&#xff0c;帮助设计师从最初的概念生成到具体机制的打磨。以下是如何在不同阶段应用头脑风暴方法的详细步骤&#xff1a; 1. 自由思考法的应用 阶段&#xff1a;创意萌发与初期概念设计 目标&#xff1a;找到游…