大数据理论与实践5 分布式计算框架MapReduce和Spark

article/2025/10/20 3:47:47

MapReduce和Spark

  • MapReduce
    • 简介
    • 原理示例
      • 基本概念
      • 作业运行模式
  • Spark
    • 简介
    • 概念
    • 编程模型
      • RDD
        • RDD操作(Operator)
        • RDD依赖(Dependency)
    • 作业运行模式
  • 课后温习
  • 参考

MapReduce

简介

MapReduce是一个面向离线批处理的分布式计算框架。
离线:对时间不敏感,慢慢算
批处理:数据攒一批,处理一批(相对于流处理)
分布式编程模型:MapReduce程序被分为Map(映射)阶段和Reduce(化简)阶段
特点

  • 计算跟着数据走
  • 良好的扩展性:计算能力随着节点数增加,近似线性增长
  • 高容错
  • 状态监控
  • 适合海量数据的离线批处理
  • 降低了分布式编程的门槛

使用场景:对时间不敏感,非流式数据(不适用OLAP、流计算、DAG计算)

原理示例

WordCount示例
在这里插入图片描述
实际上shuffle是虚拟的,一边做一半。

基本概念

作业Job与任务Task
作业是客户端请求执行的一个工作单元(包括输入数据、MapReduce程序、配置信息);任务是将作业分解后得到的细分工作单元(分为Map任务和Reduce任务)
Split(切片)
输入数据被划分成等长的小数据块,称为输入切片(Input Split),简称切片。spilt是一个逻辑概念,仅包含元数据信息,如数据的起始位置、长度、所在节点等。有多少个切片就会有几个任务启动,切片大小默认等于HDFS的block大小(因为MapReduce取数最大的情况下是从block里面取),它的划分方式由程序设定,与Block无严格对应关系(切片是个逻辑概念)。
Split越小,Map任务越多,并发度越高,但开销也越大;Split越大,任务越少,并发度降低。
Map阶段(映射)
由若干Map任务组成,任务数量由Split数量决定。
输入:Split切片(key-value)
输出:中间计算结果(key-value)
Reduce阶段(化简
由若干Reduce任务组成,任务数量由程序指定
输入:Map阶段输出的中间结果(key-value)
输出:最终结果(key-value)
Shuffle阶段(混洗)
Shuffle是Map和Reduce之间的强依赖关系(Shuffle依赖)导致的,即每个Reduce的输入依赖于所有Map的输出
Map和Reduce阶段的中间环节(虚拟阶段),分为Map端Shuffle和Reduce端Shuffle。
包括Partition(分区)、Sort(排序)、Spill(溢写)、Merge(合并)和Fetch(抓取)等工作。
在这里插入图片描述
如上图,Reduce任务数量决定了Partition数量,Partition编号 = Reduce任务编号。
分区Partition
利用“哈希取模”对Map输出数据分区,即Partition编号 = key hashcode % reduce task num(%为取模)。
在这里插入图片描述
由于Shuffle阶段很耗资源,避免和减少Shuffle是MapReduce程序调优的关键。

作业运行模式

在MapReduce2.x中的YARN模式下,运行模式如下:
在这里插入图片描述

Spark

简介

Spark解决了MapReduce的局限性,它的出现改变了大数据的生态。
MapReduce缺陷在于:语义较少(仅支持Map、Reduce两种语义操作),模型较为粗糙(划分为两个阶段);无法避免Shuffle所以效率较低;不适合迭代计算、在线分析、实时流处理等场景。另外,计算框架多、选型难导致学习成本很高。

概念

高性能的分布式通用计算引擎,包括:
在这里插入图片描述

  • Spark Core:核心计算框架
  • Spark SQL:结构化数据查询
  • Spark Streaming:实时流处理
  • Spark MLib:机器学习
  • Spark GraphX:图计算

Spark具有有高吞吐、低延时、通用易扩展、高容错等特点,采用Scala语言开发,提供多种运行模式(可本地可单机可集群)。
特点

  1. 计算高效:语义操作多样,模型设计精细;利用RDD内存计算和Cache缓存机制,支持迭代计算和数据共享,减少数据读取的IO开销;利用DAG引擎,减少中间计算结果写入HDFS的开销;利用多线程池模型,减少任务启动开销。
  2. 通用易用:适用于批处理、流处理、在线分析、机器学习等场景;提供了丰富的开发API,支持Scala、Java、Python、R等。
  3. 运行模式多样:Local模式、Standalone模式、YARN/Mesos模式。

相比MapReduce效率提升在一个数量级以上。

编程模型

RDD

数据模型:弹性分布式数据集(Resilient Distributed Datesets,RDD)。Spark就是通过基于RDD进行计算。
RDD相当于一张表,由分布在集群中的多个Partition组成。
Partition分布在集群的不同节点中,主要在内存中,只读。如果数据出现错误或问题了会自动重构(体现了弹性)。
和MapReduce的split相比,区别主要在弹性分布和驻留内存。

RDD操作(Operator)

  1. Transformation(转换)
    在这里插入图片描述
    将Scala集合或Hadoop输入数据构造成一个新RDD(从无到有);通过已有的RDD产生新RDD(从有到新)。
    Transformation特点是惰性执行,只记录转换关系,不触发计算。例如:map、filter、flatmap、union、distinct、sortbykey都是Transformation操作。
  2. Action操作
    通过RDD计算得到结果或者落盘;真正触发计算,例如:first、count、collect、foreach、saveAsTextFile都是Action操作。

RDD依赖(Dependency)

分为窄依赖和宽依赖。
窄依赖(Narrow Dependency)
在这里插入图片描述
每个父RDD分区只能为一个子RDD分区供数,子分区所依赖的父分区集合之间没有交集;子RDD分区数据丢失或损坏,从其依赖的父RDD分区重新计算即可,无需Shuffle。例如:map、filter、union都是窄依赖的关系。
宽依赖(Wide/Shuffle Dependency)
在这里插入图片描述
每个父RDD分区为所有子RDD分区供数;子RDD区数据丢失或损坏,从所有父RDD分区重新计算,必须Shuffle;相对于窄依赖,宽依赖付出的代价要高很多,尽量避免使用(资源消耗太高)。例如:groupByKey、reduceByKey、sortByKey都是宽依赖。

作业运行模式

抽象模式
在这里插入图片描述
Master-Slave架构。把Driver注册到ApplicationMaster中(大数据各种框架是热插拔),告诉YARN是什么。
在这里插入图片描述
Driver:

  • 每个Spark作业启动一个Driver(作业管家),每个Driver创建一个SparkContext(负责加载配置信息,初始化运行环境,创建DAGScheduler和TaskScheduler)
    DAGScheduler:根据任务的依赖关系建立DAG(Directed Acyclic Graph, 有向无环图),根据依赖关系是否为宽依赖,即是否存在Shuffle,将DAG划分为不同的阶段(Stage),最终将各阶段Task组成的TaskSet提交给TaskScheduler。
    TaskScheduler:负责任务调度;重新提交失败的Task;为执行速度慢的Task启动备用Task。其中的Executor负责执行Driver分发的任务,一个节点可以启动多个Executor,每个Executor通过多线程运行多个任务(真正在后台跑的是Executor)。Task是Spark运行的基本单位,负责处理若干RDD分区的计算逻辑,在DAG阶段划分为窄依赖的可以一起执行。
  • 负责Spark作业解析(生成逻辑和物理计划,以及DAG)、任务调度

作业运行模式主要分为三种:

  • Local模式
    单机运行,通常用于测试
  • Standalone模式
    在这里插入图片描述
    Spark集群可以独立运行,不依赖于第三方资源管理系统,如YARN、Mesos。采用Master/Slave架构:Master统一管理集群资源,Worker负责本地计算,Driver一对一管理作业;ZooKeeper负责Master HA,避免单点故障。
    适用于集群规模和数据量都不大的情况。
  • YARN模式
    YARN-Client模式:适用于交互和调试;YARN-Cluster模式:适用于生产环境。
    在这里插入图片描述
    在这里插入图片描述

课后温习

简述MR Split与HDFS Block的关系。
为什么MapReduce要求输入输出必须是key-value键值对?
简述Shuffle的工作原理。
从编程模型的视角,MapReduce有哪些优缺点?
简述“哈希取模”在MapReduce中的作用。

参考

课程内容来自:南京大学+星环科技课程,大数据大数据理论与实践课程


http://chatgpt.dhexx.cn/article/JjQMPeES.shtml

相关文章

MapReduce(分布式计算框架)了解

Hadoop组成 Hadoop HDFS:一个高可靠、高吞吐量的分布式文件系统,对海量数据的存储。 Hadoop MapReduce:一个分布式的资源调度和离线并行计算框架。 Hadoop Yarn:基于HDFS,用于作业调度和集群资源管理的框架。 本篇将学习分布式并…

深入浅出:HADOOP分布式计算框架

hadoop分布式计算框架详解 1.1 分布式计算框架 1.1.1 编程模型 1. inputformat 在MapReduce 程序的开发过程中,往往需要用到FileInputFormat与TextInputFormat, 我们会发现TextInputFormat 这个类继承自FileInputFormat , FileInputFormat 这…

Hadoop学习之MapReduce分布式计算框架

目录 一、本地模式 1.新建一个本地maven项目 2.修改prom依赖(maven) 3.新建一个包mapreduce,在该包中新建三个包 4.写mapper组件 5.写Reducer组件 6.写Driver组件 7.运行结果 二、集群模式词频统计 1.准备用于单词计数的文件夹和文…

MapReduce(分布式计算框架)

什么是MapReduce MapReduce是分布式计算框架,它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务,适用于大规模数据处理场景,每个job包含Map和Reduce两部分 MapReduce的设计思想 分而治之:简化并行计算的编程模型 …

140.深度学习分布式计算框架-3

140.1 Horovod Horovod是 Uber 开源的又一个深度学习工具,它的发展吸取了 Facebook「一小时训练 ImageNet 论文」与百度 Ring Allreduce 的优点,可为用户实现分布式训练提供帮助。Horovod 支持通过用于高性能并行计算的低层次接口 – 消息传递接口 (MPI…

【MapReduce】分布式计算框架MapReduce

分布式计算框架MapReduce 什么是MapReduce? MapReduce起源是2004年10月Google发表了MapReduce论文,之后由Mike Cafarella在Nutch(爬虫项目)中实现了MapReduce的功能。它的设计初衷是解决搜索引擎中大规模网页数据的并行处理问题,之后成为Apache Hadoop的核心子项目。 它…

【Hadoop】MapReduce——分布式计算框架

文章目录 一、MapReduce设计理念二、MpaReduce计算流程1 原始数据File2 数据块Block3 切片Split4 MapTask5 环形数据缓冲区KvBuffer6 分区Partation7 排序Sort8 溢写Spill9 合并Merge10 组合器Combiner11 拉取Fetch12 合并 merge13 归并Reduce14 写出Output15 MapReduce过程图解…

python-17-并行计算和分布式计算框架dask

dask入门教程 并行计算库Dask官方教程(中文翻译) dask和numpy的计算对比 1 并行计算和分布式计算 1.1 并行计算parallel computing 并行计算:这是一台计算机的概念,即一台计算机中多个处理器被组织起来,大任务下达的…

大数据技术入门:MapReduce(分布式计算框架)

大家好,我是百思不得小赵。 创作时间:2022 年 7 月 7 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入CSDN的第1222天。觉得有帮助麻烦&#x1…

05-分布式计算框架

目录 一,MapReduce 1,简介 2,原理 2.1 基本概念 2.2 程序执行过程 2.3 作业运行模式 二,Spark 1,简介 1.1 背景 1.2 概念 1.3 特点 2,原理 2.1 编程模型 2.2 运行模式 2.3 运行过程 2.4 DA…

大数据之Hadoop分布式计算框架MapReduce

这里写目录标题 一、MapReduce概述二、MapReduce编程模型简述三、MapReduce词频统计案例mvn clean package 四、词频统计案例进阶之Combiner五、词频统计案例进阶之Partitioner六、案例二介绍 一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架,用于编写批处…

分布式系列之分布式计算框架Flink深度解析

Flink作为主流的分布式计算框架,满足批流一体、高吞吐低时延、大规模复杂计算、高可靠的容错和多平台部署能力。本文简要介绍了Flink中的数据流处理流程以及基本部署架构和概念,以加深对分布式计算平台的了解。 1、Flink概述 Apache Flink是一个框架和分…

分布式计算框架——MapReduce

一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。 MapReduce 作业通过将输入的数据集拆分为独立的块,这些块由 map 以并行的方式处理&#xff0c…

【学习笔记1】分布式计算技术及框架

一.定义及描述 分布式计算(Distributed Computing),又称分散式计算,指通过分布式系统进行计算的方式。分布式系统中的每一个运算单元存在于不同的计算机/处理器上,通过调度算法进行信息传递、协作以实现一件大而繁的目标。 简单来说&#x…

C#之简易计算器的制作

在一些问题中有时会用到计算器,今天我们可以用C#做一个简易的计算器 用到的开发工具为Visual Studio 2019(我用的是2019,其他版本的也可以) 1.首先新建一个项目文件. 2.在Form1.cs文件(Winform框架基础文件)中添加所用到的控件. 3.添加TextBox和ComboBox以及Button控件 4.对But…

JS原生——编写简易计算器

一个非常适合新手练习的小案例!!! 使用JS的ES5语法HTMLCSS及企业级代码规范,方便后续良好的代码习惯养成!!! 先来看一下样式吧!!!(后附代码&…

Java 实现简易计算器

前言: 出此文章是因为楼主之前在面试中遇到一个笔试题,当时一时半会没想出来,所以后续研究出来了,发出来希望对大家能有所帮助~ 题目:设计一个计算器,可以接收用户输入两个数字与 - * / 的符号&#xff0c…

Matlab设计简易计算器

效果如如下: 整个工程还是挺简单的,之前一直都是用matlab做信号处理,由于要做课程设计,就学了一下matlab的GUI。下面总结几个关键的地方。 (1)控件拉到自己喜欢的位置,并将控件的Text和Tag改好…

简易计算器(有界面)

(没有括号和优先级,简易计算器)界面: package javaprogram;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import j…

Andriod设计简易计算器

1.设计任务及要求 (1)设计一款基于Android系统下的计算器,实现加减乘除算法,以及清零、撤销操作。界面设计应该就尽量简洁而美观,具有良好的交互性,程序应具有较好的稳健性; &a…