当前位置: 首页 > news >正文

Hadoop3教程(七):MapReduce概述

文章目录

  • (68) MR的概述&优缺点
  • (69)MR的核心思想
    • MapReduce进程
  • (70)官方WC源码&序列化类型
  • (71)MR的编程规范
    • Mapper
    • Reducer
    • Driver
  • (72)WordCount案例需求分析
  • 参考文献

(68) MR的概述&优缺点

MapReduce是一个分布式运算程序的编程框架,简单的说,就是一个 分布式计算框架,是Hadoop的核心所在。

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

优点:

  • 易于编程。用户只关心业务逻辑就可以;
  • 良好的扩展性。可动态增加服务器节点,以解决计算资源不足的问题;
  • 高容错性。如果有一台节点崩溃,不会影响整个集群的计算。其他可用节点会接过崩溃节点的任务,继续计算。
  • 适合海量数据的计算。这里的海量,一般是指TB以上级别的。

缺点:

  • 不擅长实时计算。无法达到mysql这种毫秒级查询,无法快速响应;
  • 不擅长流式计算。指数据一条条过来,实时的流式计算。一般是spark streaming和flink适合做这个。MR的特性决定了其数据源必须是静态的。
  • 不擅长DAG有向无环图。像是迭代计算,即DAG中,任务一的输出会作为任务二的输入,任务二的输出则会作为任务三的输入,以此类推,是一个链式的结构。MR不擅长处理这种,当然,只是不擅长,不是不支持。相比来讲,spark更适合用来处理这种任务。( 因为spark的中间结果是基于内存的,而MR是基于磁盘,重复IO性能太低下

(69)MR的核心思想

经典案例:统计一段话中每个单词出现的总次数,其中a~p的结果放在一个文件,q~z的结果放在一个文件里。

MR的计算分为两个阶段:Map阶段和Reduce阶段。

接下来我们以经典案例,来讲解MR的主要工作流程,如图:

在这里插入图片描述

1) Map阶段,是任务分配阶段,一般是按照块大小,每个MapTask负责处理一块数据。这个块一般是128M。

这个阶段的MapTask并发实例,完全并发运行,互不相干。

在我们刚说的这个案例里,MapTask中都做了些什么呢?

  • 一行一行读数据,进行处理;
  • 按照空格分割行内单词;
  • 把切出来的单词,组成KV键值对(单词,1)
  • 将所有的KV键值对,按照单词首字母,分成两个分区(ap分区和qz分区),导出至磁盘保存。

2) Reduce阶段,就是任务汇总统计阶段。

这一阶段的ReduceTask并发实例也是互不相干,但是它们依赖于Map阶段所有MapTask并发实例的输出。

在这个案例里,因为结果需要有2个文件,所以这里会有2个ReduceTask,一个负责汇总出ap,一个负责汇总出qz,并分别输出至文件。

在一个MR计算过程中,只能包含一个Map阶段和一个Reduce阶段。如果用户的业务逻辑过于复杂,那么可以创建多个MR计算程序,串行计算。这就相当于链式的有向无环图计算了。

一些问题细节:

  • MapTask内部是如何工作的?
  • ReduceTask内部是如何工作的?
  • MapTask内部是如何排序、控制分区的?
  • MapTask和ReduceTask之间是如何衔接的?

这些问题都将在后面一一解答。

MapReduce进程

一个完整的MR程序在分布式运行的时候,会产生三种类型的进程:

  • MrAppMaster:是ApplicationMaster的子进程,负责整个Mr程序的过程调度及状态协调;
  • MapTask:负责Map阶段的数据处理流程;
  • ReduceTask:负责Reduce阶段的数据处理流程

MapTask和ReduceTask似乎都是yarnchild,这里仅供参考一下。

(70)官方WC源码&序列化类型

WordCount(即WC),这是Hadoop里一个很经典的MR案例,教程后面很多地方在讲解底层原理的时候都会以WC为例做讲解。

官方WordCount的源码在哪儿呢?

大概在Hadoop安装目录的share/hadoop/mapreduce/hadoop-mapreduce-example-xxx.jar,这里面存储了Hadoop的一些代码案例。

jar包反编译工具:jd-gui。

WC的源码里,核心是三个类:

  • 主类,负责调度/驱动
  • TokenizerMapper类,继承了Mapper
  • IntSumReducer类,继承了Reducer

分工很明确。

另外,这里简单介绍下hadoop中常用的数据序列化类型,后面讲序列化的时候会用到:

Java类型Hadoop Writable类型
BooleanBooleanWritable
ByteByteWritable
IntIntWritable
FloatFloatWritable
LongLongWritable
DoubleDoubleWritable
StringText
MapMapWritable
ArrayArrayWritable
NullNullWritable

(71)MR的编程规范

用户在编写一个完整的MR程序时,需要实现3个部分,即Mapper、Reducer和Driver。

Mapper

Mapper阶段:

  • 用户自定义的Mapper,要继承对应的系统Mapper类;
  • Mapper的输入数据需要是KV键值对的形式;
  • Mapper中的业务逻辑,需要写在Mapper类里声明的map()方法里;
  • Mapper的输出数据,也需要是KV对的形式;
  • map()方法对每一个KV对,都调用一次;(每个KV都会跑一遍属于自己的map()方法)

Reducer

Reducer阶段:

  • 用户自定义的Reducer,要继承对应的系统Reducer类;
  • Reducer的输入类型跟Mapper的输出类型是要保持一致的。这个很好理解,串行的毕竟;
  • Reducer的业务逻辑,需要写在Reducer类里声明的reduce()方法里;
  • 在ReduceTask进程中,reduce()对==每一组相同K==的KV对,都调用一次;(所以这里容易发生数据倾斜)

注意,最后一条,Mapper跟Reducer是不一样的。Reducer是每一组相同K的KV对,进一个reduce()。

这个其实很好理解,Reducer阶段就是做汇总的,它是一个数据量减少的过程,其实就是一个把n条具有相同特征的数据,合并成一条数据的过程。

以WC举例,第一句话里字母a出现了3次,第二句话里字母a出现了4次,即mapper会分别输出两个键值对,即(a,3)和(a,4),Reducer则会将这两个键值对输入同一个reduce()进行加和,并最终输出(a,7)。

Driver

Driver阶段:

相当于yarn集群的客户端,用于提交整个程序到YARN集群,具体提交的是什么呢?其实是封装了MR程序相关运行参数的一个job对象。所以驱动类里其实就是定义一些运行参数之类的。

(72)WordCount案例需求分析

一个标准的WordCount需求:统计给定的文本文件中,每一个单词出现的次数。

我们需要针对这个需求,编写对应的Mapper、Reducer和Driver。

这里就不展示代码了,只是展示一下各个类的主要功能。

Mapper负责:

  • 将MapTask传过来的文本内容先转换成string;
  • 根据空格将这一行切分成单词;
  • 将切出来的单词,包装成键值对<单词,1>的形式;

Reducer负责:

  • 将相同K的value值加在一起;
  • 输出该K的总次数;

Driver阶段:

  • 获取配置信息,获取job对象实例;
  • 指定本程序的jar包所在的本地路径;
  • 关联Mapper和Reducer业务类;
  • 指定Mapper的输出类型(K和V是什么类型);
  • 指定最终输出的类型。(整个MR程序结束后的输出,而不是Reducer阶段的输出)
  • 指定job的输入文件的所在目录;
  • 指定job的输出结果的所在目录(输出目录不能提前存在?);
  • 提交作业;

参考文献

  1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】

相关文章:

Hadoop3教程(七):MapReduce概述

文章目录 &#xff08;68&#xff09; MR的概述&优缺点&#xff08;69&#xff09;MR的核心思想MapReduce进程 &#xff08;70&#xff09;官方WC源码&序列化类型&#xff08;71&#xff09;MR的编程规范MapperReducerDriver &#xff08;72&#xff09;WordCount案例需…...

【Doris实战】Apache-doris-2.0.2部署帮助手册

Apache-doris-2.0.2部署帮助手册 校验时间&#xff1a;2023年10月11日 文章目录 Apache-doris-2.0.2部署帮助手册安装前准备安装包安装要求Linux 操作系统版本需求软件需求句柄需求关闭 Swap网络需求 部署规划用户规划目录规划免密需求 安装步骤配置JDK配置Doris文件 启动与停止…...

如何处理接口调用的频率限制

背景 接口提供方有调用频率限制的场景下&#xff0c;如何合理设计接口请求? 方案 采用Redis队列&#xff0c;利用 lpush 和 rpop 命令来实现 首先&#xff0c;将订单依次lpush写入Redis队列。定时任务通过 rpop 获取队列订单进行接口调用。 额外说明&#xff1a; 若想查看…...

Ubuntu 22.04上安装Anaconda,及 conda 的基础使用

1. 安装软件依赖包&#xff1a; apt install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6 2. 下载Anaconda安装包 使用 wget下载您从Anaconda网站复制的链接。您将把它输出到一个名为anaconda.sh的文…...

算法练习13——跳跃游戏II

LeetCode 45 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回…...

算法|每日一题|只出现一次的数字|位运算

136.只出现一次的数字 力扣每日一题&#xff1a;136.只出现一次的数字 之前整理过本题及其扩展&#xff0c;详细说明了思路和做法&#xff0c;链接如下&#xff1a; 只出现一次的数字I&#xff0c;II&#xff0c;III 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出…...

Smartforms 打印出现的问题

上半年ECC做了升级 程序代码从ECC迁移到S4 有用户反馈 打印不能用了 经过调试发现在打印程序中 竟然返回2&#xff0c;但是 smartforms ZRPT_CO_YFLL_DY又是存在的 。 然后去激活 并与 ECC对比发现问题 S4的页大小竟然这么小 找到对应的页格式 对比ECC和S4 果然是这个…...

【考研408真题】2022年408数据结构41题---判断当前顺序存储结构树是否是二叉搜索树

文章目录 思路408考研各数据结构C/C代码&#xff08;Continually updating&#xff09; 思路 很明显&#xff0c;这是一个顺序存储结构的树的构成方法。其中树的根节点位置从索引0开始&#xff0c;对于该结构&#xff0c;存在有&#xff1a;如果当前根节点的下标为n&#xff0c…...

深度学习DAY3:激活函数

激活函数映射——引入非线性性质 h &#xff08;Σ(W * X)b&#xff09; yσ&#xff08;h&#xff09; 将h的值通过激活函数σ映射到一个特定的输出范围内的一个值&#xff0c;通常是[0, 1]或[-1, 1] 1 Sigmoid激活函数 逻辑回归LR模型的激活函数 Sigmoid函数&#xff0…...

puppeteer

目录 介绍启动方法功能一、爬虫优势如何实现爬虫小demo 功能二、执行脚本百度搜索脚本demo 功能三、获取cookie&#xff08;这个只能是模拟浏览器当前进入网页的cookie不是平时用的下载的的浏览器的cookie&#xff09;功能四、监控网页&#xff0c;进行性能分析 介绍 puppetee…...

javascript二维数组(21)执行异步HTTP(Ajax)请求的方法($.get、$.post、$getJSON、$ajax)

执行异步HTTP&#xff08;Ajax&#xff09;请求的方法 . g e t 、 .get、 .get、.post、 g e t J S O N 、 getJSON、 getJSON、ajax都是jQuery提供的用于执行异步HTTP&#xff08;Ajax&#xff09;请求的方法。每个方法都有其特定的用途和区别。 . g e t &#xff1a;这个方法…...

TypeScript React(下)

目录 TypeScript & React TS开发环境的搭建 tsconfig.json webpack.config.js babel.config.js .eslintrc.js TypeScript & React TS开发环境的搭建 软件版本&#xff1a;TypeScript:3.9.5;React:16.13.1 Node&#xff1a;8.17.0环境搭建&#xff1a;正确搭建一…...

『Linux小程序』进度条

文章目录 缓冲区问题回车与换行的区别进度条小程序 缓冲区问题 假设有一段代码为: #include<iostream> #include<unistd.h> int main() …...

【手写数字识别】GPU训练版本

SVM Adaboost Bagging 完整代码 I import torch import torch.nn.functional as F from torch.utils.data import DataLoader, TensorDataset from torchvision import transforms, datasets import matplotlib.pyplot as plt# 超参数 batch_size 64 num_epochs 10# 数据…...

c#-特殊的集合

位数组 可观察的集合 private ObservableCollection<string> strList new ObservableCollection<string>();// Start is called before the first frame updatevoid Start(){strList.CollectionChanged Change;strList.Add("ssss");strList.Add("…...

Android 使用 eChart 设置标线

echart使用标线 Android部分&#xff1a; import android.webkit.WebView; import com.jianqu.plasmasterilizer.R; import com.jianqu.plasmasterilizer.utils.DisplayUtils; import com.jianqu.plasmasterilizer.utils.TimerUtil; import java.util.ArrayList; import java.…...

红队专题-Cobalt strike 4.x - Beacon重构

红队专题 招募六边形战士队员重构后 Beacon 适配的功能windows平台linux和mac平台C2profile 重构思路跨平台功能免杀代码部分sysinfo包packet包config.go命令的执行shell、run、executepowershell powerpick命令powershell-importexecute-assembly 堆内存加密字符集 招募六边形…...

一文掌握 Go 文件的写入操作

前言 通过案例展示如何读取文件里的内容。本文接着上篇文章的内容&#xff0c;介绍文件的写入操作。 File.Write、File.WriteString、File.WriteAt File.Write(b []byte) (n int, err error) 直接操作磁盘往文件里写入数据&#xff0c;写入单位为字节。 b 参数&#xff1a;…...

小程序入门及案例展示

目录 一、小程序简介 1.1 为什么要使用小程序 1.2 小程序可以干什么 二、前期准备 2.1 申请账号 2.2 开发工具下载与安装 三、电商案例演示 四、入门案例 4.1 项目结构解析 4.2 基础操作及语法 4.3 模拟器 4.4 案例演示 4.4.1 新建页面 4.4.2 头部样式设置 4.4.…...

linux 安装python django pip 遇到的问题

Python解决SSL不可用问题 解决方案&#xff1a; 首先要明白python版本需要和openssl的版本需要相对匹配的&#xff0c;在Python3.7之后的版本&#xff0c;依赖的openssl&#xff0c;必须要是1.1或者1.0.2之后的版本&#xff0c;或者安装了2.6.4之后的libressl&#xff0c;linux…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...