当前位置: 首页 > 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…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

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

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

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...