【大数据】MapReduce的“内存增强版”——Spark

news/2024/9/18 22:35:15/ 标签: 大数据, mapreduce, spark

大数据】MapReduce的“内存增强版”——Spark

  • 文章脉络
  • Spark架构
  • Spark-core
    • SparkConf 和 SparkContext
    • RDD
    • Spark集群
  • Spark-sql

大数据时代,数据处理和分析成为企业竞争的重要手段。Hadoop作为大数据处理的基石,其核心组件MapReduce在众多场景中发挥了巨大作用。但是随着业务数据变多业务变复杂,MapReduce在处理速度、迭代计算等方面逐渐暴露出局限性。

为此,Spark应运而生,被誉为MapReduce的“内存增强版”。Spark比较核心的几个组件是core、sql、streaming,其中streaming使用不多,因此本文着重介绍Spark-core和Spark-sql。


文章脉络

在这里插入图片描述

图1 Spark知识点

  Spark是一个基于内存计算的大数据计算框架,由加州大学伯克利分校的AMPLab实验室开发。它继承了Hadoop的分布式计算思想,并在MapReduce的基础上进行了优化和改进。

  Spark有以下核心优势:

  1、高速计算:Spark将中间结果存储在内存中,大大减少了磁盘IO操作,提高了计算速度。

  2、易用性:Spark提供了丰富的API,支持多种编程语言,如Java、Scala、Python等,简化了编程模型。

  3、通用性:Spark整合了多种大数据处理框架,如SQL、Streaming、MLlib(机器学习)等,实现了多场景的一站式解决方案。

【注意】Streaming、MLlib在我的日常工作中并不会用到。流式计算一般用Flink(真·流式计算)来做,而不用Streaming(假·流式计算);机器学习或者深度学习则是有Python这边各种各样的库(sklearn、tf、torch)可以做。

  4、兼容性:Spark可以与Hadoop生态系统无缝集成,充分利用Hadoop的资源管理和存储优势。


  Q:为什么Spark比MapReduce快?

  A:MapReduce在处理数据时,需要将中间结果写入磁盘,导致频繁的磁盘IO操作,从而影响整体执行速度。Spark使用了内存计算,可以在处理过程中将数据尽可能多地保存在内存中,这大大减少了磁盘I/O操作,而磁盘I/O是MapReduce性能的一个主要瓶颈。


  Q:既然基于内存计算更快,那为什么MapReduce不基于内存做?

  A:MapReduce最初被开发的时候(2004年左右),内存的价格相对较高,容量也远不如今天,设计一个基于磁盘的系统更加经济实用。并且在MR设计之初,人们对磁盘I/O和内存性能的权衡有不同的理解。尽管磁盘I/O较慢,但通过批处理和顺序读写操作,MR能够高效地利用磁盘带宽。

Spark架构

在这里插入图片描述

图2 Spark架构图

  图2清晰地展示了Spark与许多大数据产品之间的关系。

【注意】Spark并不仅作为MapReduce的平替而使用,在资源调度环节可以不采用YARN,在存储上也可以不采用HDFS,它其实可以把Hadoop这一套给替换掉。

  在API支持上,Spark像MapReduce一样支持了非常多的语言。

  在资源调度上,Spark不仅可以使用YARN,可以使用Mesos以及自身的独立模式(Standalone Mode)。这三种资源管理器各有特点,可以根据实际应用场景和需求进行选择:

  YARN(Yet Another Resource Negotiator):是Hadoop生态系统中的资源管理器,Spark on YARN模式下,Spark应用程序可以运行在YARN集群上,与其他Hadoop应用程序共享资源。

  Mesos:是一个通用的集群资源管理器,它可以将不同类型的任务(如Spark、Hadoop、Marathon等)运行在同一个集群上,实现资源的细粒度管理和分配。

  独立模式(Standalone Mode):Spark自带的资源管理器,它简化了Spark集群的部署和管理,适用于不需要与其他大数据框架共享资源的小型或独立Spark集群。

  在存储环节,Spark除了支持HDFS,还支持很多种存储系统,比如Amazon S3、HBase甚至关系型数据库。

  在SQL层面,Spark的支持性也超高,不但支持标准的SQL语法,还支持多种数据源(HDFS、Hive表、JSON、Parquet、ORC、JDBC等),而且还兼容Hive。

Spark-core

SparkConf 和 SparkContext

  在Apache Spark中,SparkConf 和 SparkContext 是创建和配置Spark应用程序的两个核心组件。

  SparkConf 是一个配置Spark应用程序的类。它允许用户设置各种Spark参数,这些参数可以控制应用程序的运行时行为。

【注意】SparkConf可以设置应用名称、设置运行模式等等。

  SparkContext是Spark的入口点,负责与Spark集群通信,创建RDD,以及向集群提交作业。

【注意】SparkContext可以初始化Spark应用程序的运行环境、创建和操作RDD、提交作业以执行计算、提供访问集群状态的方法。

  这两个类,基本相当于Spring里面的配置类、上下文的感觉,没太多学习成本。

RDD

  Spark采用弹性分布式数据集(RDD)作为基本计算单元。RDD是一种分布式的、容错的、并行的数据结构,可以将数据存储在内存或磁盘中。

【注意】真正写代码的时候,并不能感知到“分布式”、“弹性”这些概念。只能接触到RDD这个类,把数据放到RDD类里面,它就是弹性分布式数据集了~

  RDD有两类重要的方法,称为:

  1、转换操作(Transformations)
  2、行动操作(Actions)

【注意】转换操作(Transformations)是懒加载的,也就是说,如果你只写了转换操作的代码,即使运行代码也并不会真正执行,必须有行动操作才可以触发先前的转换操作。有点像TensorFlow里面预先定义计算图的感觉。

  - 转换操作(Transformations)
   - map(func):对每个元素应用一个函数。
   - filter(func):返回满足函数条件的元素。
   - flatMap(func):将每个元素映射到0个或多个元素,并扁平化结果。
   - reduceByKey(func, [numPartitions]):在键值对的RDD上,按键进行聚合。

  - 行动操作(Actions)
   - count():返回RDD中的元素数量。
   - collect():将RDD的所有元素以数组的形式返回驱动程序。
   - saveAsTextFile(path):将RDD的内容保存到文本文件中。
   - foreach(func):对RDD中的每个元素应用一个函数。

【注意】目前我只在Java工程里面写过Spark,或者写SQL来执行Spark任务。以Java举例,假设你写了filter筛选表里大于0的数据,然后print,直接运行输出为空。必须在后面跟上行动操作,比如count,才会真正执行。

Spark集群

在这里插入图片描述

图3 Spark集群结构图

  如图3,Apache Spark集群由多个组件组成,每个组件负责不同的功能。

  Spark Driver
   驱动程序是Spark应用程序的入口,负责将用户编写的应用程序转换成实际的作业执行过程。驱动会在Spark应用程序中创建SparkContext,将应用程序分解成多个任务,并将这些任务分配给集群中的执行器(Executors)。

  Cluster Manager
  集群管理器负责为Spark应用程序分配资源。

  Executor
  执行器是运行在工作节点上的进程,负责运行任务、保存数据以及向驱动程序汇报任务的进度。每个执行器都有一定数量的核心,可以并行执行多个任务。执行器还负责存储计算过程中产生的数据,以减少对磁盘的读写操作。

  Worker Node
  工作节点是集群中的物理或虚拟机器,每个工作节点都会被分配一定数量的执行器,执行器负责运行任务并存储数据。

  DAG Scheduler
  DAG调度器负责将Spark应用程序中的高层RDD转换操作转换成物理执行计划。将RDD的依赖关系转换成一个有向无环图(DAG),并将DAG划分为多个阶段(stages)。

Spark-sql

  Spark SQL除了支持标准SQL、兼容Hive之外,其在API层面还抽象出了一个DataFrame类。

  在Spark SQL中,DataFrame是一个分布式数据集合,它被组织成命名列的形式,类似于关系数据库中的表或Python的pandas DataFrame。DataFrame API提供了丰富的数据操作功能,而且支持Scala、Java、Python和R语言。

  也就是说,DataFrame底层是由RDD实现的,但它提供了更丰富的优化和抽象。DataFrame的API比RDD更高级,因此在大多数情况下,DataFrame的性能会更好,且代码更简洁。

【注意】起码在编码层面,写RDD还是没DF优雅的。


  Q:Pandas的DF与Spark的DF之间有什么区别和联系?

  A:对于大规模数据集,Spark DataFrame可以利用集群的计算资源进行分布式计算,性能通常优于pandas。对于小型到中型数据集,pandas DataFrame的性能通常很好,因为它是在单个机器上运行的,没有网络通信的开销。

  Spark和pandas DataFrame可以相互转换,可以在Spark中处理大规模数据集,然后在需要时将数据子集转换为pandas DataFrame进行更细致的分析。

【注意】总结:一个是分布式场景下的数据集合,一个是单机情况下的数据集合,但是它们可以互转,API也很相似。


http://www.ppmy.cn/news/1525576.html

相关文章

基于微信小程序+Java+SSM+Vue+MySQL的宿舍管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSSMVueMySQL的宿舍管理系统【附源码文档…

Python中的单例模式:从入门到精通

引言 单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁创建和销毁的对象,比如日志对象、线程池、缓存等场景,可以有效减少资源消耗,提高系统性能。…

1-4微信小程序基础

模板配置 🌮🌮目标 1.能够使用WXML模板语法渲染页面结构2.能够使用WXSS样式渲染标签样式3.能够使用app.json对小程序进行全局配置4.能够使用page.json对小程序页面进行个性化配置5.如何发起网络数据请求 数据绑定的基本原则 在data中定义数据在WXML中…

springboot后端开发-常见注解及其用途

文章目录 1. 组件注解2. 依赖注入注解3. 配置类注解4. 测试注解5. 控制器注解6. 安全和认证注解7. 切面相关注解8. API文档相关注解(需引入swagger)9. 其他注解 在Spring Boot框架中,有许多常用的注解用来简化开发过程中的依赖注入、组件扫描、配置、安全控制等方面…

部署Vue项目到Nginx上,来练一下手吧

部署Vue项目到Nginx上主要涉及几个步骤:构建Vue项目、配置Nginx服务器以及启动Nginx服务。以下是一个基本的流程: 1. 构建Vue项目 首先,你需要在本地或开发环境中构建你的Vue项目。这通常通过运行Vue CLI提供的构建命令来完成。 打开你的V…

Open-Sora代码详细解读(2):时空3D VAE

Diffusion Models视频生成 前言:目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深…

解锁数字信任之门:SSL证书的安全之旅

在当今这个数字化时代,互联网已成为我们生活、工作、学习不可或缺的一部分。然而,随着网络活动的日益频繁,信息安全问题也日益凸显。如何确保在线数据传输的安全性、完整性和私密性,成为了每一个网络用户和企业必须面对的重要课题…

掌握ChatGPT:高效利用AI助手

2023 年 3 月 15 日,ChatGPT-4 的诞生标志着人类进入了一个全新的 人机协作时代。这个时代就像一个混沌初开的新世界,而 ChatGPT 则是这个新世界里诞生的一个新物种。 这个新物种的心智如同一个四五岁的小孩,在与它频繁互动中,人…

基于 TDMQ for Apache Pulsar 的跨地域复制实践

导语 自2024年9月6日起,TDMQ Pulsar 版专业集群支持消息、元数据两级跨地域复制功能,消息级复制解决用户全球地域的数据统一归档问题,元数据级复制提供解决用户核心业务跨地域容灾的场景。 用户在跨地域场景遇到的疑问和挑战 在跨地域相关…

中国电商三十年,阿里的时代结束了吗?

9月12日,淘宝正式开放微信支付。 这既是阿里三年整改期结束以来的第一个大动作,更是中国电商格局迎来重塑的标志性事件。淘宝与微信互联,一方面代表着阿里与腾讯从“水火不容”走向互联互通,另一方面也正式宣告了中国电商从阿里京…

Ton的编译过程(上)

系列文章目录 FunC编写初始准备 文章目录 系列文章目录预先准备第一个FunC合约深入compileFunc的内部compileFunc初探艾丽卡的疑惑package.json 初览index.js 预先准备 首先请大家跟着艾丽卡一步一步的完成FunC编写初始准备 这里面环境的搭建。 接下来,请做好下面…

不用禁用 iptables 来解决 UFW 和 Docker 的安全问题

UFW 是 Ubuntu 上很流行的一个 iptables 前端,可以非常方便的管理防火墙的规则。但是当安装了 Docker,UFW 无法管理 Docker 发布出来的端口了。 解决 UFW 和 Docker 的问题 目前新的解决方案只需要修改一个 UFW 配置文件即可,Docker 的所有…

堆叠沙漏网络(stacked hourglass network)学习

定义 Stacked Hourglass Networks是2016年密歇根大学提出的经典网络架构。是曾经最具代表性的姿态识别SOTA之一。 hourglass network hourglass network 本身其实可以理解成是一个encoder-decoder的结构,encoder最大程度的提取图像在每一个scale的特征以及空间信…

漫谈设计模式 [21]:备忘录模式

引导性开场 菜鸟:老鸟,我最近在一个项目中遇到了一个问题。我需要实现一个功能,能够让用户在修改数据后撤销或恢复到之前的状态。你有什么好的建议吗? 老鸟:这听起来像是一个很经典的问题。你有没有听说过设计模式中…

个性化、持续性阅读 学生英语词汇量自然超越标准

2024年秋季新学年,根据2022版《义务教育英语课程标准》全新修订的英语新版教材开始投入使用,标志着我国英语教育迈入了一个以应用为导向、注重综合素养培养的新阶段。 新版教材的变革不仅仅是一次词汇量的简单增加,更是一场从应试到应用的深…

Windows Python 指令补全方法

网络上搜集的补全代码 # python startup file import sys import readline import rlcompleter import atexit import os# tab completion readline.parse_and_bind(tab: complete) # history file histfile os.path.join(os.environ[HOMEPATH], .pythonhistory) try:readline…

数学分析原理答案——第三章 习题18

【第三章 习题18】 把习题16中的递推公式换成 x n 1 p − 1 p x n α p x n − p 1 x_{n 1} \frac{p - 1}{p}x_{n} \frac{\alpha}{p}x_{n}^{- p 1} xn1​pp−1​xn​pα​xn−p1​ 这里 p p p是固定的正整数,描述该序列的性质 【解】 若 x 1 > x p x…

Linux命令分享 三 (ubuntu 16.04)

1、‘>’ >>输出重定向 用法:命令 参数 > 文件 ls > a.txt ‘>’ 将一个命令的结果不输出到屏幕上,输出到文件中,如果文件不存在就创建文件,如果存在就覆盖文件。 ls >> a.txt ‘>>’ 如果文件不存…

注册安全分析报告:熊猫频道

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

JS设计模式之装饰者模式:优雅的给对象增添“魔法”

引言 在前端开发中,我们经常会遇到需要在不修改已有代码的基础上给对象添加新的行为或功能的情况。而传统的继承方式并不适合这种需求,因为继承会导致类的数量急剧增加,且每一个子类都会固定地实现一种特定的功能扩展。 装饰者模式则提供了…