【大数据分析】Spark的高性能基本原理

简介

(1)Apache Spark是一个开源分布式计算框架,它提供并行处理通用数据的方法,用于对不同大小和结构的数据进行不同的数据处理任务。
(2)Spark本身并不用于数据存储,它在 JVMs上执行,并只会持续一个Spark应用程序运行时的时间。
(3)Spark支持在一台机器上本地运行(称为本地模式)。
(4)Spark可以与分布式存储系统(例如,HDFS、Cassandra或S3)一起使用。
(5)集群管理器协调整个集群的Spark应用程序的分布。Spark目前支持三种集群管理器:StandaloneApache MesosHadoop YARN
在这里插入图片描述

Spark组件

(1)Spark Core。Spark生态中的主要数据处理框架。Spark是围绕一个称为分布式弹性数据集(RDDs,Resilient Distributed Datasets)的数据抽象所构建。RDD具有“延迟执行”,“静态”,“分布式”等特征,并包含大量Transformation用于操作分布式数据集,例如map,join,reduce以及一些I/O操作读取写入数据操作。
(2)SparkSQL。SparkSQL是Spark性能的一个非常重要的组件,整合了 SQL 查询和 Spark 编程。
(3)Spark ML和Spark MLlib。两个都是Spark的机器学习库。
(4)Spark Streaming使用基于Spark Core对小批量数据进行流媒体分析。

分布式弹性数据集(RDDs,Resilient Distributed Datasets)

RDDs的主要特征:
(1)不可变的(immutable)。RDDs的这个特性就像Java变量加了final关键字一样。所以当用transformation对RDDs进行操作时,都是会新声明一个变量来“接收”。
(2)分布式的(distributed)。组成rdd的对象被称为分区(partitions),可以在指定系统的不同节点上进行计算。
(3)延迟执行(lazy evaluation)。

延迟执行(Lazy Evaluation)

Spark程序在执行时,除非遇到Action,否则程序不会真正针对partitions里的数据进行处理。Spark先根据程序评估一系列的步骤(这一系列的步骤可以成为执行计划), 然后才开始处理数据。

注意:并不是所有的transformation都是延迟执行的。例如:sortByKey,这个方法需要先评估RDD中数据的范围,所以它既是Transformation,也是Action。

延迟执行的好处

延迟执行可以避免数据进行多次传递,例如,假设要在同一个RDD上调用一个map和filter,那么Spark可以将它们发送给每一个executor,此时Spark就可以在每一个partition里执行map和filter,这只需要访问这些记录一次,而不是发送两组指令和访问每个partition两次。此外相比Hadoop的mapreduce,Spark的延迟执行范式更有利于实现。

def simpleWordCount(rdd: RDD[String]): RDD[(String, Int)] = {
 val words = rdd.flatMap(_.split(" "))
 val wordPairs = words.map((_, 1))
 val wordCounts = wordPairs.reduceByKey(_ + _)
 wordCounts
 }

内存数据的持久化和内存管理

Spark针对算法流程过程中数据的存储,提供了三种方式。非序列化的Java对象序列化数据硬盘Java对象结构清晰,使用起来比较方便,但是它对内存的利用相对比较低效;将数据序列化需要消耗一些时间,但是序列化之后的数据有利于保存在硬盘上,通常是存在文件中,并且序列化更有利于实现远程通信,在网络上传送对象的字节序列,将对象从一个地方传递到另一个地方;当内存不够用时,Spark就会将超出的部分存在硬盘中。

RDD的不可变性

RDD是静态并且不可变的,在一个RDD上的调用和转换会产生一个新的RDD,而不会改变原有RDD。创建RDDs的三种方式:
(1)通过一个现有的RDD 转换(transform)出一个新的RDD。
(2)通过SparkContext创建。
(3)通过DataFrame和DataSet(这些可以用SparkSession)。

RDDs的五大属性:
(1)partitions():返回RDD中的分区对象的数组。每个分区的索引值可以通过处于分区内的数据调用getPartition来获取;
(2)iterator(p,parentIters):基于给定的父RDD,查找对应子分区所有对象;
(3)dependencies():返回依赖对象的序列,这个方法可以让我们知道RDD之间的依赖关系。
(4)partitoner():返回RDD里分区的类型,scala的option类型。
(5)preferredLocations§:找到数据分区的所在节点地址。

宽/窄依赖

窄依赖是指,子RDD的每个分区对父RDD的分区都有简单,有限的依赖关系。换言之,每个父分区最多有一个子分区依赖,并且父分区的数据在被转换到子分区时,只需要针对自己分区内的数据进行转换。不需要预先考虑别的分区。

窄依赖
在这里插入图片描述
宽依赖
在这里插入图片描述

Spark程序运行过程的剖析

在Spark延迟执行的模式下,Spark的应用程序不会执行,直到Spark的驱动程序调用一个Action。对于每一次调用Action,Spark 的Scheduler(调度器)会创建一个可执行图,并创建一个Spark Job。每一个Job由很多个Stage组成。这些Stages是到达最终RDD所需要的步骤。
在这里插入图片描述
上图展示了Spark各个组件与API的对应关系。从上图可以看出,一个Spark应用程序可能会产生多个job,因为一个程序里面可能会调用多个Action,一个Job里面可能会有多个stage,因为会有多个宽依赖的transformation。每个stage下对应多个task,这些task是可并行的计算单元。在从一个RDD到另一个RDD的一个transformation阶段内,一个Partition对应一个Task。
代码示例:

def simpleSparkProgram(rdd : RDD[Double]): Long ={
 //stage1
 rdd.filter(_< 1000.0)
 .map(x => (x, x) )
 //stage2
 .groupByKey()
 .map{ case(value, groups) => (groups.sum, value)}
 //stage 3
 .sortByKey()
 .count()
 }

Spark根据示例代码划分的Spark 组件:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark内部运行原理是,它通过一系列的步骤来处理数据,包括读取数据、转换数据、运行计算任务和存储结果。它使用一个叫做RDD(可分配数据集)的抽象来表示数据,这样可以更容易地处理数据。它还使用一个叫做Spark Core的库来处理数据,这个库可以分发任务到多个节点,并且可以让多个节点协同工作来处理数据。 ### 回答2: Spark是一个快速、通用的大数据处理引擎,它采用了分布式计算的方式来处理大规模数据集。Spark的内部运行原理可以简单概括为以下几个关键点: 1. 弹性分布式数据集(RDD):Spark的核心概念是弹性分布式数据集(RDD),它是一个可分区、可并行处理的数据集合。Spark将数据分成多个RDD,可以在集群的多个节点上自动并行处理。 2. DAG调度:Spark将用户的操作转化为有向无环图(DAG),以表示计算过程中的依赖关系。Spark通过DAG调度,将整个计算流程划分为多个阶段(Stage),以实现任务的并行处理和调度。 3. 分布式数据处理:Spark可以将数据集合分成多个分区,并将每个分区的计算任务分发到不同的节点上并行执行。通过分区级别的并行处理,Spark能够高效地处理大规模数据集,并实现性能上的显著提升。 4. 内存计算:Spark将数据存储在内存中,以避免频繁的磁盘读写操作。通过充分利用内存计算能力,Spark能够在处理数据时提供更高的计算速度和性能。 5. 数据流水线:Spark将数据处理过程划分为多个阶段,并通过内存中的缓存和数据流水线技术,减少中间结果的计算和存储开销。这种方式能够提高计算效率,并减少数据处理的延迟。 总之,Spark的内部运行原理包括了RDD的分布式计算模型、DAG调度、分区级别的并行处理、内存计算和数据流水线等关键技术。通过这些技术的有机结合,Spark能够高效地处理大规模数据集,并提供快速的数据分析和处理能力。 ### 回答3: Spark内部运行原理主要包括以下几个方面。 首先,Spark运行的核心是Resilient Distributed Dataset(RDD),它是一个可容错、可并行处理的数据集合。RDD可以通过数据源创建,或者通过对已有RDD的转换操作得到。RDD的分区决定了数据的并行度,每个分区都存储着数据的一个子集。 其次,Spark运行时采用了分布式的集群架构。集群由一个主节点(即Driver)和多个从节点(即Executors)组成。主节点负责任务的调度和分发,从节点负责具体的任务执行。主节点将任务分成多个Stage,每个Stage包含一系列的任务,并通过DAG表示Stage之间的依赖关系。 然后,Spark通过一种称为Transformations的操作来对RDD进行转换。Transformations分为窄依赖和宽依赖。窄依赖意味着每个父RDD的分区仅有一个子RDD的分区依赖,这可以使得数据传输更快。而宽依赖意味着每个父RDD的分区可能有多个子RDD的分区依赖,这会引入shuffle操作来重新分区,增加了计算和数据传输的开销。 最后,Spark的计算模型是基于弹性分布式数据集的。Spark将计算过程划分为一系列的Stage,并将每个Stage划分为多个Task。Task在Executor上并行执行,每个Task会处理一个或多个RDD的分区。计算结果会被缓存在内存中,可以被后续的计算使用,从而提高了计算效率。 综上所述,Spark内部运行原理主要包括RDD、集群架构、Transformations、计算模型等方面。通过这些机制,Spark实现了高效的分布式计算和数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值