大数据|Spark介绍

news2024/11/22 21:51:33

前文回顾:Hive和数据仓库

目录

📚为什么会有Spark

📚Spark的基本架构和组件

🐇主要体系结构和组件

🐇Spark集群的基本结构

🐇Spark系统的基本结构

🐇Spark应用程序的基本结构

🐇Spark程序运行机制⭐️

📚Spark的程序执行过程

🐇Spark运行框架主节点

🐇Spark运行框架的从节点

🐇Spark程序执行过程⭐️

📚Spark编程模型

🐇Spark的基本编程方法与示例⭐️

🥕RDD的创建

🥕RDD的操作

🐇RDD的容错实现

🐇RDD之间的依赖关系

🐇RDD持久化

🐇RDD内部设计

📚Spark和集群管理工具的结合

📚Spark环境中其它功能组件简介

🐇Spark SQL

🐇Spark Streaming

🐇GraphX

🐇MLlib


📚为什么会有Spark

MapReduce计算模式的缺陷

  • 最初设计用于高吞吐量批处理数据,不擅长低延迟
  • 需要将数据存储到HDFS,迭代计算中的数据共享效率太低
  • 系统设计没有充分利用内存,很难实现高性能。
  • MapReduce不表达复杂的计算问题,如图形计算、迭代计算。

931b6cb3c42d48c48185304633cbb87b.jpg

Spark基于内存计算思想提高计算性能

  • Spark提出了一种基于内存的弹性分布式数据集(RDD),通过对RDD的一系列操作完成计算任务,可以大大提高性能。
  • 同时一组RDD形成可执行的有向无环图DAG,构成灵活的计算流图。
  • 覆盖多种计算模式。

43a7a3cc8bd44262b23ece7667bf680e.jpg

e0a36d0b56de4fc78ff631fb376ecc0f.jpg

📚Spark的基本架构和组件

🐇主要体系结构和组件

7508fdef6ba94f5488ed54d8fb2e3c57.jpg

🐇Spark集群的基本结构

f09137a04ef74eceb59ac9cdda915e76.png

  • Master node:集群部署时的概念,是整个集群的控制器,负责整个集群的正常运行,管理Worker node。
  • Worker node:计算节点,接受主节点命令与进行状态汇报。
  • Executors:每个Worker上有一个Executor,负责完成Task程序的部署。
  • Spark集群部署后,需要从主从节点启动Master进程和Worker进程,对整个集群进行控制。

Worker node的结构:

🐇Spark系统的基本结构

Spark Driver的组成

🐇Spark应用程序的基本结构

  • Application:基于Spark的用户程序,包含一个Driver Program和多个executor(Worker中)
  • Job:包含多个Task的并行计算,由Spark action催生。
  • Stage:Job拆分成多组Task,每组任务被称为Stage,也可称为TaskSet。
  • Task:基本程序执行单元,在一个executor上执行。

🐇Spark程序运行机制⭐️

  • Client 提交应用,Master节点启动Driver
  • Driver向Cluster Manager申请资源,并构建Application的运行环境,即启动SparkContext
  • SparkContext向ClusterManager申请Executor资源,启动CoarseGrainedExecutorBackend。
  • Executor向SparkContext申请Task,SparkContext将代码发放给Executor。
  • Standalone模式下,ClusterManager即为Master。YARN下,ClusterManager为资源管理器。
  • Driver Program可以在Master上运行,此时Driver就在Master节点上。为了防止Driver和Executor间通信过慢,一般原则上要使它们分布在同一个局域网中。

📚Spark的程序执行过程

🐇Spark运行框架主节点

  • Application:由用户编写的Spark应用程序,其中包括driver program和executor。
  • Driver Program:执行用户代码的main()函数,并创建SparkContext。
  • Cluster manager:集群当中的资源调度服务选取。例:standalone manager, Mesos, YARN
  • Job:由某个RDD的Action算子生成或者提交的一个或者多个一系列的调度阶段,称之为一个或者多个Job,类似于MapReduce中Job的概念
  • SparkContext:SparkContext由用户程序启动,是Spark运行的核心模块,它对一个Spark程序进行了必要的初始化过程,其中包括了:
    • 创建SparkConf类的实例:这个类中包含了用户自定义的参数信息和Spark配置文件中的一些信息等等 (用户名、程序名、Spark版本等)    
    • 创建SparkEnv类的实例:这个类中包含了Spark执行时所需要的许多环境对象,例如底层任务通讯的Akka actor System、block manager、serializer等
    • 创建调度类的实例:Spark中的调度分为TaskScheduler和DAGScheduler两种,而它们的创建都在SparkContext的初始化过程中

🐇Spark运行框架的从节点

  • Executor:executor负责在子节点上执行Spark任务,每个application都有自身的Executor。
  • Stage:每一个Job被分成一系列的任务的集合,这些集合被称之为Stage,用于Spark阶段的调度。例:在MapReduce作业中,Spark将划分为Map的Stage和Reduce的Stage进行调度
  • Task:被分发到一个Executor上的最小处理单元。

🐇Spark程序执行过程⭐️

  1. 用户编写的Spark程序提交到相应的Spark运行框架中。
  2. Spark创建SparkContext作为本次程序的运行环境。
  3. SparkContext连接相应的集群配置(Mesos/YARN),来确定程序的资源配置使用情况。
  4. 连接集群资源成功后,Spark获取当前集群上存在Executor的节点,即当前集群中Spark部署的子节点中处于活动并且可用状态的节点(Spark准备运行你的程序并且确定数据存储)。
  5. Spark分发程序代码到各个节点。
  6. 最终,SparkContext发送tasks到各个运行节点来执行。

Spark的技术特点

  • RDD:Spark提出的弹性分布式数据集,是Spark最核心的分布式数据抽象,Spark的很多特性都和RDD密不可分。
  • Transformation&Action:Spark通过RDD的两种不同类型的运算实现了惰性计算,即在RDD的Transformation运算时,Spark并没有进行作业的提交;而在RDD的Action操作时才会触发SparkContext提交作业。
  • Lineage:为了保证RDD中数据的鲁棒性,Spark系统通过世系关系(lineage)来记录一个RDD是如何通过其他一个或者多个父类RDD转变过来的,当这个RDD的数据丢失时,Spark可以通过它父类的RDD重新计算。
  • Spark调度:Spark采用了事件驱动的Scala库类Akka来完成任务的启动,通过复用线程池的方式来取代MapReduce进程或者线程启动和切换的开销。
  • API:Spark使用scala语言进行开发,并且默认Scala作为其编程语言。因此,编写Spark程序比MapReduce程序要简洁得多。同时,Spark系统也支持Java、Python语言进行开发。
  • Spark生态:Spark SQL、Spark Streaming、GraphX等等为Spark的应用提供了丰富的场景和模型,适合应用于不同的计算模式和计算任务
  • Spark部署:Spark拥有Standalone、Mesos、YARN等多种部署方式,可以部署在多种底层平台上。

综上所述,Spark是一种基于内存的迭代式分布式计算框架,适合于完成多种计算模式的大数据处理任务。

📚Spark编程模型

Spark为了解决以往分布式计算框架存在的一些问题(重复计算、资源共享、系统组合),提出了一个分布式数据集的抽象数据模型:RDD(Resilient Distributed Datasets)弹性分布式数据集。

  • 简单来说,RDD是MapReduce模型的一种简单的扩展和延伸。
  • RDD是一种分布式的内存抽象,允许在大型集群上执行基于内存的计算(In-Memory Computing),同时还保持了MapReduce等数据流模型的容错特性。
  • RDD只读、可分区,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用。

🐇Spark的基本编程方法与示例⭐️

Spark编程接口

  • Spark用Scala语言实现了RDD的API
  • Scala是一种基于JVM的静态类型、函数式、面向对象的语言。Scala具有简洁(特别适合交互式使用)、有效(因为是静态类型)等优点
  • Spark支持三种语言的API:Scala、Python、Java
//在一个存储于HDFS的Log文件中,计算出现ERROR的行数
//定义一个main函数
def main(args: Array[String]) 
{
    //定义一个sparkConf,提供Spark运行的各种参数,如程序名称、用户名称等
    val conf = new SparkConf().setAppName("Spark Pi") 

    //创建Spark的运行环境,并将Spark运行的参数传入Spark的运行环境中  
    val sc = new SparkContext(conf)   

    //调用Spark的读文件函数,从HDFS中读取Log文件,输出一个RDD类型的实例:fileRDD。
    //具体类型:RDD[String]
    val fileRDD=sc.textFile(“hdfs:///root/Log”)
  
    //调用RDD的filter函数,过滤fileRDD中的每一行,如果该行中含有ERROR,保留;
    //否则,删除。生成另一个RDD类型的实例:filterRDD。
    //具体类型:RDD[String]
    //line=>line.contains(“ERROR”)表示对每一个line应用contains()函数
    val filterRDD=fileRDD.filter(line=>line.contains(“ERROR”)) 
    
    //统计filterRDD中总共有多少行,result为Int类型 
	val result =  filterRDD.count()  
    
    //关闭Spark
    sc.stop() 
}

🥕RDD的创建

从形式上看,RDD是一个分区的只读记录的集合。因此,RDD只能通过两种方式创建:

  • 通过从存储器中读取,例如上述代码:val file=sc.textFile(“hdfs:///root/Log”),从HDFS中读取。例如:val rdd = sc.parallelize(1 to 100, 2)  ,生成一个1到100的数组,并行化成RDD。
  • 其他RDD的数据上的确定性操作来创建(即Transformation)。例如:val filterRDD = file.filter(line=>line.contains(“ERROR”))  //通过file的filter操作生成一个新的filterRDD。

🥕RDD的操作

RDD支持两种类型的操作:

  • 转换(transformation):这是一种惰性操作,即使用这种方法时,只是定义了一个新的RDD,而并不马上计算新的RDD内部的值。        
    • 例:val filterRDD=fileRDD.filter(line=>line.contains(“ERROR”))。上述这个操作对于Spark来说仅仅记录从file这个RDD通过filter操作变换到filterRDD这个RDD的变换,并不计算filterRDD的结果。
  • 动作(action):立即计算这个RDD的值,并返回结果给程序,或者将结果写入到外存储中。
    • 例:val result =  filterRDD.count(),上述操作计算最终的result结果是多少,包括前边transformation时的变换。

Spark 支持的一些常用 transformation操作

Spark支持的一些常用action操作

 图片来源:帅成一匹马

🐇RDD的容错实现

在RDD中,存在两种容错的方式:

  • Lineage(世系系统、依赖系统):RDD提供一种基于粗粒度变换的接口,这使得RDD可以通过记录RDD之间的变换,而不需要存储实际的数据,就可以完成数据的恢复,使得Spark具有高效的容错性。
  • CheckPoint(检查点):对于很长的lineage的RDD来说,通过lineage来恢复耗时较长。因此,在对包含宽依赖的长世系的RDD设置检查点操作非常有必要。

🐇RDD之间的依赖关系

在Spark中存在两种类型的依赖:

  • 窄依赖:父RDD中的一个Partition最多被子RDD中的一个Partition所依赖。
  • 宽依赖:父RDD中的一个Partition被子RDD中的多个Partition所依赖。

🐇RDD持久化

Spark提供了三种对持久化RDD的存储策略:

  • 未序列化的Java对象,存于内存中:性能表现最优,可以直接访问在JAVA虚拟机内存里的RDD对象。
  • 序列化的数据,存于内存中
    • 取消JVM中的RDD对象,将对象的状态信息转换为可存储形式,减小RDD的存储开销,但使用时需要反序列化恢复
    • 在内存空间有限的情况下,这种方式可以让用户更有效的使用内存,但是这么做的代价是降低了性能。
  • 磁盘存储:适用于RDD太大难以在内存中存储的情形,但每次重新计算该RDD都会带来巨大的额外开销。

完整的存储级别介绍:

🐇RDD内部设计

每个RDD都包含:

  • 一组RDD分区(partition),即数据集的原子组成部分。
  • 对父RDD的一组依赖,这些依赖描述了RDD的Lineage。
  • 一个函数,即在父RDD上执行何种计算。
  • 元数据,描述分区模式和数据存放的位置。

📚Spark和集群管理工具的结合

不同计算引擎各有所长,真实应用中往往需要同时使用不同的计算框架。不同框架和应用会争抢资源,互相影响,使得管理难度和成本增加。

统一资源管理平台和集装箱思想

  • 统一的资源管理平台(YARN、Mesos、Docker)将资源独立管理。通过资源管理可在同一个集群平台上部署不同的计算框架和应用,从而实现多租户资源共享。
  • 集装箱思想:将应用和依赖“装箱”,一次配置,随处部署。
  • 资源管理:所有接入的框架要先向它申请资源,申请成功之后,再由平台自身的调度器决定资源交由哪个任务使用。
  • 资源共享:通过资源管理可在同一集群平台上部署不同的计算框架和应用,实现多租户资源共享
  • 资源隔离:不同的框架中的不同任务往往需要的资源(内存,CPU,网络IO等)不同,它们运行在同一个集群中,会相互干扰。所以需要实现资源隔离以免任务之间由资源争用导致效率下降
  • 提高资源利用效率:当将各种框架部署到同一个大的集群中,进行统一管理和调度后,由于各种作业交错且作业提交频率大幅度升高,则为资源利用率的提升增加了机会
  • 扩展和容错:统一资源管理平台不能影响到上层框架的可扩展性和容错,同时自身也应具备良好的可扩展性和容错性。

YARN:YARN是Hadoop2.0时代的编程架构,被称为新一代MapReduce。其核心思想是将原MapReduce框架中的 JobTracker 和 TaskTracker 重新设计,变成了:ResourceManager(中心的服务)、ApplicationMaster(负责一个 Job 生命周期内的所有工作)、NodeManager(负责 Container 状态的维护)。

Mesos:Mesos是Apache旗下著名的分布式资源管理框架,被称为分布式系统的内核。Mesos包含两个组件,Master和Slave。

Docker:搬运工,搬运的是集装箱(Container),集装箱里面装的是任意类型的App。Docker把App装在Container内,通过Linux Container技术的包装将App变成一种标准化的、可移植的、自管理的组件。


Spark 编程示例——实验三:PageRank算法实现


📚Spark环境中其它功能组件简介

🐇Spark SQL

Spark SQL 是一个用来处理结构化数据分布式SQL查询引擎,具有以下几个特点:

  • 与Spark程序无缝对接。使用集成的API,Spark SQL允许使用RDD模型来查询结构化数据,这使得在复杂程序里运行SQL查询变得容易。
  • 统一数据访问接口。Spark SQL提供统一的接口来访问各种结构化数据,包括Hive、Parquet和Json文件。
  • 与Hive高度兼容。对已经存在的Hive数据、Hive查询语句和UDFs等,Spark SQL都可以完美兼容,方便了应用迁移。
  • 使用标准链接。Spark SQL可以使用工业标准JDBC和ODBC进行链接,减小了开发人员的学习成本。

🐇Spark Streaming

  • Spark Streaming 的工作机制是对数据流进行分片,使用Spark计算引擎处理分片数据,并返回相应分片的计算结果。
  • Spark Streaming 提供的基本流式数据抽象叫discretized stream,或称DStream。DStream由一系列连续的RDD表示(每个数据流分片被表示为一个RDD),对DStream的操作被转换成对相应RDD序列的操作。

🐇GraphX

  • GraphX是Spark系统中对图进行表示和并行处理的组件,它把图抽象为:给每个顶点和边附着了属性的有向多重图。
  • GraphX提供了一系列基本图操作(比如subgraph、joinVertices、aggregateMessages等)和优化了的Pregel API变种,并且各种图算法还在不断丰富中。

  • GraphX使用高效的点分割存储模式。

🐇MLlib

  • MLlib是Spark的分布式机器学习算法库,包含了很多常用机器学习算法和工具类

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis:主从复制_通过此功能实现对内存上的数据更好的保护

什么是主从复制? 简单的意义上来讲就是一个主人带着几个奴隶,奴隶的全部都是主人给他的,刚开始的时候奴隶是一无所有,是主人将自己的一部分给到奴隶了。因此奴隶翻身了,变得有钱了,也就是有一定价值了&…

SYSU程设c++(第十三周)虚函数、覆盖与隐藏

虚函数 形式:是一个类的成员函数,前面有关键字 virtual 作用:在公有继承的派生类中会对虚函数进行重定义。 当使用基类的指针(或引用)调用派生类的对象的虚函数时,将调用该对象的虚函数的重定义版本 性质&a…

STM32单片机厨房环境油烟温湿度调节系统加湿加热排风

实践制作DIY- GC0131-厨房环境油烟温湿度调节系统 一、功能说明: 基于STM32单片机设计-厨房环境油烟温湿度调节系统 二、功能介绍: 硬件组成:STM32F103C系列最小系统DHT11温度湿度传感器1个5V直流风扇 5V风扇 USB加湿器1个5V直流风扇排烟1…

RestNet详解及在pytorh下基于CIFAR10数据集的实现

1 RestNet介绍 RestNet是2015年由微软团队提出的,在当时获得分类任务,目标检测,图像分割第一名。该论文的四位作者何恺明、张祥雨、任少卿和孙剑如今在人工智能领域里都是响当当的名字,当时他们都是微软亚研的一员。实验结果显示&…

STM32单片机蓝牙APP自动伸缩遮阳棚雨伞雨滴角度温度光强控制

实践制作DIY- GC0130-蓝牙APP自动伸缩遮阳棚 一、功能说明: 基于STM32单片机设计-蓝牙APP自动伸缩遮阳棚 二、功能介绍: 基于STM32F103C系列,LCD1602显示器,光敏电阻采集光强,雨滴传感器,ULN2003控制步进…

MySQL:5.6同步到5.7 GTID报错

问题描述和处理 同步到的版本为5.7.35,按理说在5.7种还是一个比较新的版本了,报错大概如下: 2023-05-14T05:09:47.427031Z 12 [Note] Multi-threaded slave statistics for channel : seconds elapsed 163; events assigned 67585; worke…

GD32 系列FLASH锁死解决.

1.背景描述 使用keil开发工具JLINK调试过程中偶尔出现找不到目标版,或存在目标版但keil调试烧录出现如下界面: 2.问题查询步骤 2.1检查jlink连接线是否异常; 2.2确定boot0和boot1设置是否正确; 2.3确定是否是flash读写保护 2.3.1…

K8s进阶2——二进制搭建K8s高可用集群

文章目录 一、单master资源清单二、系统初始化三、部署etcd集群3.1 生成etcd证书3.2 部署流程3.2.1 准备二进制安装文件3.2.2 创建工作目录3.2.3 创建etcd配置文件3.2.4 设置成systemd服务3.2.5 添加etcd-2和etcd-3节点3.2.6 所有节点启动etcd并设置开机启动 四、安装容器引擎&…

webpack基础

1. 当面试官问Webpack的时候他想知道什么 前言 在前端工程化日趋复杂的今天,模块打包工具在我们的开发中起到了越来越重要的作用,其中webpack就是最热门的打包工具之一。 说到webpack,可能很多小伙伴会觉得既熟悉又陌生,熟悉是…

java汽车4S店管理系统myeclipse定制开发oracle数据库网页模式java编程jdbc

一、源码特点 java汽车4S店管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助 oracle数据库,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 java汽车4S店管理系统myeclipse定制开发orac 二、功能介绍 此次系统…

漏扫工具-xray 1.9.10(文末附下载)

一、工具介绍 一款功能强大的安全评估工具 二、使用说明 1.使用基础爬虫爬取并对爬虫爬取的链接进行漏洞扫描 xray webscan --basic-crawler http://example.com --html-output vuln.html 2.使用 HTTP 代理进行被动扫描 xray webscan --listen 127.0.0.1:7777 --html-outp…

Fiddler如何抓取微信小程序的包

1.简介 有些小伙伴或者是童鞋们说小程序抓不到包,该怎么办了???其实苹果手机如果按照宏哥前边的抓取APP包的设置方式设置好了,应该可以轻松就抓到包了。那么安卓手机小程序就比较困难,不是那么友好了。所以…

FMC子卡设计资料原理图450-基于ADRV9009的双收双发射频FMC子卡 数字信号处理卡 射频收发卡 基站应用 便携测试设备

FMCJ450-基于ADRV9009的双收双发射频FMC子卡 一、板卡概述 ADRV9009是一款高集成度射频(RF)、捷变收发器,提供双通道发射器和接收器、集成式频率合成器以及数字信号处理功能。这款IC具备多样化的高性能和低功耗组合,FMC子卡为2路输入,…

MySQL高级_第08章_索引的创建与设计原则

MySQL高级_第08章_索引的创建与设计原则 1. 索引的声明与使用 1.1 索引的分类 MySQL 的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 从 功能逻辑 上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索…

新手如何重装Win10系统 新手重装Win10系统的方法

电脑系统是电脑运行的核心,如果出现问题就需要重装系统。对于新手来说,重装电脑系统可能会显得比较困难和陌生。本文将介绍新手如何重装电脑系统Win10,让电脑新手也能轻松搞定。 新手重装Win10系统的方法 一、准备工作 1、下载极客狗电脑重…

canvas、svg的基本使用【数据可视化】

什么是数据可视化? 基本概念:是关于数据视觉表现形式的科学技术研究 这个概念向我们传达了两个信息: (1)数据可视化是一门学科 (2)数据可视化与数据和视觉有关 数据可视化简单理解,…

veth网卡的多队列及RPS

背景: 3.10内核下容器使用的veth网卡,默认开启的是一个队列,导致在某些单线程多TCP链接的应用场景下,出现某个CPU软中断高的情况。之前处理的方案一直是开启这个veth网卡的RPS,让其在多流场景下可以去分散到其它CPU上…

DSSM - 双塔经典模型(微软)

《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》论文由微软发表于 CIKM-2013。DSSM被广泛用于工业界的 召回/粗排 阶段。 模型结构 模型结构一目了然,非常简单,双塔结构:user侧一个塔,ite…

ChatGPT的兴起的时代,国内chatgpt产品大盘点

在人工智能技术的不断发展和应用下,自然语言处理技术成为了研究的热点之一。而其中最受关注的就是“聊天机器人”技术,而GPT(Generative Pre-trained Transformer)模型则是目前最流行的聊天机器人生成模型之一。 随着 ChatGPT 技…

蓝牙RSSI/BLE AOA/UWB室内定位技术哪个好?

蓝牙AOA定位技术的出现,弥补了蓝牙RSSI值定位精度不高的缺陷。从理论上来说,可以对目前的蓝牙RSSI定位方案进行一定程度的替代。当然了,在高精度定位应用领域中,UWB定位已经在批量的成熟商用了。蓝牙AOA也具有很高的定位精度&…