导语
spark 已经成为广告、报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到大家的青睐,我自己最近半年在接触spark以及spark streaming之后,对spark技术的使用有一些自己的经验积累以及心得体会,在此分享给大家。
本文依次从:
spark生态,原理,基本概念,
spark streaming原理及实践,
还有spark调优
以及环境搭建
等方面进行介绍,希望对大家有所帮助。
Spark 生态及运行原理
Spark 特点
-
运行速度快 => Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。官方提供的数据表明,如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍。
-
适用场景广泛 => 大数据分析统计,实时数据处理,图计算及机器学习
-
易用性 => 编写简单,支持80种以上的高级算子,支持多种语言,数据源丰富,可部署在多种集群中
-
容错性高。Spark引进了弹性分布式数据集RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程)对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错,而CheckPoint有两种方式:CheckPoint Data,和Logging The Updates,用户可以控制采用哪种方式来实现容错。
Spark的适用场景
目前大数据处理场景有以下几个类型:
-
复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;
-
基于历史数据的交互式查询(Interactive Query),通常的时间在数十秒到数十分钟之间
-
基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间
Spark成功案例
目前大数据在互联网公司主要应用在广告、报表、推荐系统等业务上。
> 在广告业务方面需要大数据做应用分析、效果分析、定向优化等,
> 在推荐系统方面则需要大数据优化相关排名、个性化推荐以及热点点击分析等。
这些应用场景的普遍特点是计算量大、效率要求高。
腾讯 / yahoo / 淘宝 / 优酷土豆
spark运行架构
spark基础运行架构如下所示:
spark结合yarn集群背后的运行流程如下所示:
spark 运行流程:
Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。
-
Master作为整个集群的控制器,负责整个集群的正常运行;
-
Worker相当于计算节点,接收主节点命令与进行状态汇报;
-
Executor负责任务的执行;
-
Client作为用户的客户端负责提交应用;
-
Driver负责控制一个应用的执行。
Spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个Spark应用的执行过程中,Driver和Worker是两个重要角色。Driver 程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。
-
Excecutor /Task 每个程序自有,不同程序互相隔离,task多线程并行
-
集群对Spark透明,Spark只要能获取相关节点和进程
-
Driver 与Executor保持通信,协作处理
三种集群模式:
1.Standalone 独立集群
2.Mesos, apache mesos
3.Yarn, hadoop yarn
基本概念:
-
Application =>Spark的应用程序,包含一个Driver program和若干Executor
-
SparkContext => Spark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor
-
Driver Program => 运行Application的main()函数并且创建SparkContext
-
Executor => 是为Application运行在Worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executor来处理任务
-
Cluster Manager =>在集群上获取资源的外部服务 (例如:Standalone、Mesos、Yarn)
-
Worker Node => 集群中任何可以运行Application代码的节点,运行一个或多个Executor进程
-
Task => 运行在Executor上的工作单元
-
Job => SparkContext提交的具体Action操作,常和Action对应
-
Stage => 每个Job会被拆分很多组task,每组任务被称为Stage,也称TaskSet
-
RDD => 是Resilient distributed datasets的简称,中文为弹性分布式数据集;是Spark最核心的模块和类
-
DAGScheduler => 根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
-
TaskScheduler => 将Taskset提交给Worker node集群运行并返回结果
-
Transformations => 是Spark API的一种类型,Transformation返回值还是一个RDD,所有的Transformation采用的都是懒策略,如果只是将Transformation提交是不会执行计算的
-
Action => 是Spark API的一种类型,Action返回值不是一个RDD,而是一个scala集合;计算只有在Action被提交的时候计算才被触发。
Spark核心概念之RDD
Spark核心概念之Transformations / Actions
Transformation返回值还是一个RDD。它使用了链式调用的设计模式,对一个RDD进行计算后,变换成另外一个RDD,然后这个RDD又可以进行另外一次转换。这个过程是分布式的。 Action返回值不是一个RDD。它要么是一个Scala的普通集合,要么是一个值,要么是空,最终或返回到Driver程序,或把RDD写入到文件系统中。
Action是返回值返回给driver或者存储到文件,是RDD到result的变换,Transformation是RDD到RDD的变换。
只有action执行时,rdd才会被计算生成,这是rdd懒惰执行的根本所在。
Spark核心概念之Jobs / Stage
Job => 包含多个task的并行计算,一个action触发一个job
stage => 一个job会被拆为多组task,每组任务称为一个stage,以shuffle进行划分
Spark核心概念之Shuffle
以reduceByKey为例解释shuffle过程。
在没有task的文件分片合并下的shuffle过程如下:(spark.shuffle.consolidateFiles=false
)
fetch 来的数据存放到哪里?
刚 fetch 来的 FileSegment 存放在 softBuffer 缓冲区,经过处理后的数据放在内存 + 磁盘上。这里我们主要讨论处理后的数据,可以灵活设置这些数据是“只用内存”还是“内存+磁盘”。如果spark.shuffle.spill = false就只用内存。由于不要求数据有序,shuffle write 的任务很简单:将数据 partition 好,并持久化。之所以要持久化,一方面是要减少内存存储空间压力,另一方面也是为了 fault-tolerance。
shuffle之所以需要把中间结果放到磁盘文件中,是因为虽然上一批task结束了,下一批task还需要使用内存。如果全部放在内存中,内存会不够。另外一方面为了容错,防止任务挂掉。
存在问题如下:
-
产生的 FileSegment 过多。每个 ShuffleMapTask 产生 R(reducer 个数)个 FileSegment,M 个 ShuffleMapTask 就会产生 M * R 个文件。一般 Spark job 的 M 和 R 都很大,因此磁盘上会存在大量的数据文件。
-
缓冲区占用内存空间大。每个 ShuffleMapTask 需要开 R 个 bucket,M 个 ShuffleMapTask 就会产生 MR 个 bucket。虽然一个 ShuffleMapTask 结束后,对应的缓冲区可以被回收,但一个 worker node 上同时存在的 bucket 个数可以达到 cores R 个(一般 worker 同时可以运行 cores 个 ShuffleMapTask),占用的内存空间也就达到了cores× R × 32 KB。对于 8 核 1000 个 reducer 来说,占用内存就是 256MB。
为了解决上述问题,我们可以使用文件合并的功能。
在进行task的文件分片合并下的shuffle过程如下:(spark.shuffle.consolidateFiles=true
)
可以明显看出,在一个 core 上连续执行的 ShuffleMapTasks 可以共用一个输出文件 ShuffleFile。先执行完的 ShuffleMapTask 形成 ShuffleBlock i,后执行的 ShuffleMapTask 可以将输出数据直接追加到 ShuffleBlock i 后面,形成 ShuffleBlock i',每个 ShuffleBlock 被称为 FileSegment。下一个 stage 的 reducer 只需要 fetch 整个 ShuffleFile 就行了。这样,每个 worker 持有的文件数降为 cores× R。FileConsolidation 功能可以通过spark.shuffle.consolidateFiles=true
来开启。
Spark核心概念之Cache
val rdd1 = ... // 读取hdfs数据,加载成RDD
rdd1.cache
val rdd2 = rdd1.map(...)
val rdd3 = rdd1.filter(...)
rdd2.take(10).foreach(println)
rdd3.take(10).foreach(println)
rdd1.unpersist
cache和unpersisit两个操作比较特殊,他们既不是action也不是transformation。cache会将标记需要缓存的rdd,真正缓存是在第一次被相关action调用后才缓存;unpersisit是抹掉该标记,并且立刻释放内存。只有action执行时,rdd1才会开始创建并进行后续的rdd变换计算。
cache其实也是调用的persist持久化函数,只是选择的持久化级别为MEMORY_ONLY
。
persist支持的RDD持久化级别如下:
需要注意的问题:
Cache或shuffle场景序列化时, spark序列化不支持protobuf message,需要java 可以serializable的对象。一旦在序列化用到不支持java serializable的对象就会出现上述错误。
Spark只要写磁盘,就会用到序列化。除了shuffle阶段和persist会序列化,其他时候RDD处理都在内存中,不会用到序列化。
https://www.cnblogs.com/liuliliuli2017/p/6809094.html
相关推荐
### Spark Streaming原理与实践 #### 一、为什么需要流处理? 传统的批处理框架如MapReduce在处理实时数据流时存在一些局限性,主要是因为每次处理一批数据就需要启动一个新任务,而任务的启动过程(包括输入切分...
1. **Apache Spark Streaming**:Spark Streaming是Apache Spark的一个组件,用于处理实时数据流。它将实时数据流分解为小批处理任务,然后利用Spark的并行计算能力进行处理,提供了高吞吐量和低延迟的数据处理能力...
7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.SparkMLlib(下)--SparkMLlib实战.pdf 9.SparkGraphX...
### Spark Streaming原理与实战 #### 一、Spark Streaming概述 **Spark Streaming** 是Apache Spark生态中的一个重要组件,它主要用于处理实时数据流。相比于传统的批处理技术,Spark Streaming提供了对实时数据流...
### Spark Streaming工作原理 #### 四、工作流程 1. **实时数据接收**:Spark Streaming接收实时输入数据流。 2. **数据分批**:将数据流分割成一系列微小的批次数据。 3. **数据处理**:利用Spark Engine处理这些...
在"大数据技术原理及应用课实验7:Spark初级编程实践"中,我们主要关注Spark的两个核心知识点:数据读取和Spark应用程序的开发流程。 首先,Spark提供了一种简单的方式去访问不同的数据源,包括本地文件系统和...
Spark-assembly-1.5.2-hadoop2.6.0.jar是一个fat jar,包含了Spark的所有依赖,包括Spark自身的核心库、Hadoop客户端库以及其他相关的第三方库。这样做的目的是为了简化Spark应用程序的部署,避免因依赖冲突而引发...
1. Spark Streaming是Spark核心API的扩展组件,设计用于高吞吐量、容错的实时流数据处理。 2. 它采用微批处理模型,将数据流切分成一系列小批次,每个批次作为Spark的批处理任务处理。 3. 支持多种数据源的接入,...
以下将详细介绍Spark Streaming和Storm的核心原理,并进行对比分析。 首先来了解Spark Streaming,它是由Spark提供的一种实时数据处理框架。Spark Streaming利用了Spark强大的批处理能力,并将流式计算转换成一系列...
总的来说,《Spark Streaming Systems》是理解Spark Streaming原理和实践的宝贵资源,无论你是初学者还是有经验的开发者,都能从中获得对实时数据处理深入的理解,并学会如何利用Spark Streaming构建高性能的流处理...
### Spark Streaming 原理详解 #### 1. Spark Streaming 简介 ...通过对 Spark Streaming 的核心概念、架构设计、编程模型以及性能优化策略的深入理解,可以帮助开发者更好地构建高效、可靠的实时数据处理系统。
Spark Streaming 的工作原理基于微批处理(Micro-batching),它将实时数据流分解为一系列小批次的数据块,这些数据块被称为 Discrete Stream,或简称 DStream。DStream 是一系列连续的 Resilient Distributed ...
Spark Streaming将数据流分割成一系列小批量的数据块进行处理,这种机制使得Spark Streaming既能够处理实时数据流,又能利用Spark的核心API进行复杂的数据处理。 #### 2. Kafka简介 Apache Kafka是一种分布式的发布...
Spark Streaming 与 Kafka 集成原理 Spark Streaming 与 Kafka 集成原理是指 Spark Streaming 框架与 Kafka 消息队列系统的集成,旨在实现高效、实时的数据处理和分析。该集成原理主要包括两种方案:Receiver-based...
### 开发者最佳实践日——Spark生态系统与内部机制 #### 一、Spark概述与内部机制 **1.1 Spark简介** Apache Spark 是一种快速且通用的大规模数据处理引擎。它以其高速度、易用性、通用性和对Hadoop的集成支持而...
这本书全面覆盖了Apache Spark的核心概念、技术和最佳实践,为读者提供了一个深入了解Spark的窗口。 Spark作为一个快速、通用且可扩展的大数据处理框架,其主要特点在于内存计算,能够大大提高数据处理的效率。2017...
1. Spark Core:这是Spark的基本功能组件,它提供了定义弹性分布式数据集(RDD)的API、操作以及在RDD上执行的动作。RDD是Spark的基础,它是一种可以并行操作的分布式数据集合,支持容错、内存计算和位置感知分区。...
《Spark技术内幕:深入解析Spark内核架构设计与实现原理》是张安站所著的一本深度剖析Spark核心架构和实现细节的专业书籍。Spark作为大数据处理领域的热门框架,以其高效、易用和可扩展性备受青睐。这本书旨在帮助...