大数据项目实战必备技可以之Spark

  • 时间:2018-06-22 22:48 作者:大数据信息站 来源:大数据信息站 阅读:418
  • 扫一扫,手机访问
摘要:导读: spark是基于内存计算的大数据并行计算框架,对于spark,Apache spark官方给出的定义:spark 是一个快速和通使用的大数据引擎,能浅显的了解成一个分布式的大数据解决框架,它基于Rdd(弹性分布式数据集),立足于内存计算,由于是基于内存计算,所以提高了在大数据环境下数据解决的

导读: spark是基于内存计算的大数据并行计算框架,对于spark,Apache spark官方给出的定义:spark 是一个快速和通使用的大数据引擎,能浅显的了解成一个分布式的大数据解决框架,它基于Rdd(弹性分布式数据集),立足于内存计算,由于是基于内存计算,所以提高了在大数据环境下数据解决的实时性,同时保证了高容错和高可伸缩性,允许使用户将spark部署在大量廉价的硬件之上,形成集群,因为spark在性可以和扩展性上有快速,易使用,通使用等特点,使它正在加速成为一体化,多元化的大数据通使用计算平台和库。

Spark 原理简述

Spark 是用 scala 实现的基于内存计算的大数据开源集群计算环境.提供了 java,scala, python,R 等语言的调使用接口.


大数据项目实战必备技可以之Spark


Hadoop 和 Spark 的关系

Google 在 2003 年和 2004 年先后发表了 Google 文件系统 GFS 和 MapReduce 编程模型两篇文章,. 基于这两篇开源文档,06 年 Nutch 项目子项目之一的 Hadoop 实现了两个强有力的开源产品:HDFS 和 MapReduce. Hadoop 成为了典型的大数据批量解决架构,由 HDFS 负责静态数据的存储,并通过 MapReduce 将计算逻辑分配到各数据节点进行数据计算和价值发现.之后以 HDFS 和 MapReduce 为基础建立了很多项目,形成了 Hadoop 生态圈.

而 Spark 则是UC Berkeley AMP lab (加州大学伯克利分校AMP试验室)所开源的类Hadoop MapReduce的通使用并行框架, 专门使用于大数据量下的迭代式计算.是为了跟 Hadoop 配合而开发出来的,不是为了取代 Hadoop, Spark 运算比 Hadoop 的 MapReduce 框架快的起因是由于 Hadoop 在一次 MapReduce 运算之后,会将数据的运算结果从内存写入到磁盘中,第二次 Mapredue 运算时在从磁盘中读取数据,所以其瓶颈在2次运算间的多余 IO 耗费. Spark 则是将数据一直缓存在内存中,直到计算得到最后的结果,再将结果写入到磁盘,所以屡次运算的情况下, Spark 是比较快的. 其优化了迭代式工作负载[^demo_zongshu].

具体区别如下:

大数据项目实战必备技可以之Spark

伯克利大学将 Spark 的整个生态系统成为 伯克利数据分析栈(BDAS),在核心框架 Spark 的基础上,主要提供四个范畴的计算框架:

大数据项目实战必备技可以之Spark

- Spark SQL: 提供了类 SQL 的查询,返回 Spark-DataFrame 的数据结构(相似 Hive)

- Spark Streaming: 流式计算,主要使用于解决线上实时时序数据(相似 storm)

- MLlib: 提供机器学习的各种模型和调优

- GraphX: 提供基于图的算法,如 PageRank

Spark 的主要特点还包括:

- (1)提供 Cache 机制来支持需要反复迭代计算或者者屡次数据共享,减少数据读取的 IO 开销;

- (2)提供了一套支持 DAG 图的分布式并行计算的编程框架,减少屡次计算之间中间结果写到 Hdfs 的开销;

- (3)用多线程池模型减少 Task 启动开稍, shuffle 过程中避免不必要的 sort 操作并减少磁盘 IO 操作。(Hadoop 的 Map 和 reduce 之间的 shuffle 需要 sort)


Spark 系统架构

首先明确相关术语[^demo_shuyu]:

- 应使用程序(Application): 基于Spark的使用户程序,包含了一个Driver Program 和集群中多个的Executor;

- 驱动(Driver): 运行Application的main()函数并且创立SparkContext;

- 执行单元(Executor): 是为某Application运行在Worker Node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者者磁盘上,每个Application都有各自独立的Executors;

- 集群管理程序(Cluster Manager): 在集群上获取资源的外部服务(例如:Local、Standalone、Mesos或者Yarn等集群管理系统);

- 操作(Operation): 作使用于RDD的各种操作分为Transformation和Action.

整个 Spark 集群中,分为 Master 节点与 worker 节点,,其中 Master 节点上常驻 Master 守护进程和 Driver 进程, Master 负责将串行任务变成可并行执行的任务集Tasks, 同时还负责出错问题解决等,而 Worker 节点上常驻 Worker 守护进程, Master 节点与 Worker 节点分工不同, Master 负载管理一律的 Worker 节点,而 Worker 节点负责执行任务.

Driver 的功可以是创立 SparkContext, 负责执行使用户写的 Application 的 main 函数进程,Application 就是使用户写的程序.

Spark 支持不同的运行模式,包括Local, Standalone,Mesoses,Yarn 模式.不同的模式可可以会将 Driver 调度到不同的节点上执行.集群管理模式里, local 一般使用于本地调试.

每个 Worker 上存在一个或者多个 Executor 进程,该对象拥有一个线程池,每个线程负责一个 Task 任务的执行.根据 Executor 上 CPU-core 的数量,其每个时间能并行多个 跟 core 一样数量的 Task[^demopingtai].Task 任务即为具体执行的 Spark 程序的任务.

大数据项目实战必备技可以之Spark

spark 运行原理

底层详细细节详情:

我们用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程。根据你用的部署模式(deploy-mode)不同,Driver进程可可以在本地启动,也可可以在集群中某个工作节点上启动。而Driver进程要做的第一件事情,就是向集群管理器(能是Spark Standalone集群,也能是其余的资源管理集群,美团?大众点评用的是YARN作为资源管理集群)申请运行Spark作业需要用的资源,这里的资源指的就是Executor进程。YARN集群管理器会根据我们为Spark作业设置的资源参数,在各个工作节点上,启动肯定数量的Executor进程,每个Executor进程都占有肯定数量的内存和CPU core。

在申请到了作业执行所需的资源之后,Driver进程就会开始调度和执行我们编写的作业代码了。Driver进程会将我们编写的Spark作业代码分拆为多个stage,每个stage执行一部分代码片段,并为每个stage创立一批Task,而后将这些Task分配到各个Executor进程中执行。Task是最小的计算单元,负责执行一模一样的计算逻辑(也就是我们自己编写的某个代码片段),只是每个Task解决的数据不同而已。一个stage的所有Task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,而后Driver就会调度运行下一个stage。下一个stage的Task的输入数据就是上一个stage输出的中间结果。如此循环往复,直到将我们自己编写的代码逻辑一律执行完,并且计算完所有的数据,得到我们想要的结果为止。

Spark是根据shuffle类算子来进行stage的划分。假如我们的代码中执行了某个shuffle类算子(比方reduceByKey、join等),那么就会在该算子处,划分出一个stage界限来。能大致了解为,shuffle算子执行之前的代码会被划分为一个stage,shuffle算子执行以及之后的代码会被划分为下一个stage。因而一个stage刚开始执行的时候,它的每个Task可可以都会从上一个stage的Task所在的节点,去通过网络传输拉取需要自己解决的所有key,而后对拉取到的所有相同的key用我们自己编写的算子函数执行聚合操作(比方reduceByKey()算子接收的函数)。这个过程就是shuffle。

当我们在代码中执行了cache/persist等持久化操作时,根据我们选择的持久化级别的不同,每个Task计算出来的数据也会保存到Executor进程的内存或者者所在节点的磁盘文件中。

因而Executor的内存主要分为三块:第一块是让Task执行我们自己编写的代码时用,默认是占Executor总内存的20%;第二块是让Task通过shuffle过程拉取了上一个stage的Task的输出后,进行聚合等操作时用,默认也是占Executor总内存的20%;第三块是让RDD持久化时用,默认占Executor总内存的60%。

Task的执行速度是跟每个Executor进程的CPU core数量有直接关系的。一个CPU core同一时间只可以执行一个线程。而每个Executor进程上分配到的多个Task,都是以每个Task一条线程的方式,多线程并发运行的。假如CPU core数量比较充足,而且分配到的Task数量比较正当,那么通常来说,能比较快速和高效地执行完这些Task线程。

以上就是Spark作业的基本运行原理的说明.

在实际编程中,我们不需关心以上调度细节.只要用 Spark 提供的指定语言的编程接口调使用相应的 API 就可.

在 Spark API 中, 一个 应使用(Application) 对应一个 SparkContext 的实例。一个 应使用 能使用于单个 Job,或者者分开的多个 Job 的 session,或者者响应请求的长时间生存的服务器。与 MapReduce 不同的是,一个 应使用 的进程(我们称之为 Executor),会一直在集群上运行,即便当时没有 Job 在上面运行。

而调使用一个Spark内部的 Action 会产生一个 Spark job 来完成它。 为了确定这些job实际的内容,Spark 检查 RDD 的DAG再计算出执行 plan 。这个 plan 以最远端的 RDD 为起点(最远端指的是对外没有依赖的 RDD 或者者 数据已经缓存下来的 RDD),产生结果 RDD 的 Action 为结束 。并根据能否发生 shuffle 划分 DAG 的 stage.

// parameterval appName = "RetailLocAdjust"val master = "local" // 选择模式val conf = new SparkConf().setMaster(master).setAppName(appName)// 启动一个 SparkContext Applicationval sc = new SparkContext(conf)val rdd = sc.textFile("path/...")

要启动 Spark 运行程序主要有两种方式:一种是用 spark-submit 将脚本文件提交,一种是打开 Spark 跟某种特定语言的解释器,如:

- spark-shell: 启动了 Spark 的 scala 解释器.

- pyspark: 启动了 Spark 的 python 解释器.

- sparkR: 启动了 Spark 的 R 解释器.

(以上解释器位于spark 的 bin 目录下)

下面整理了少量比较适合新手入门Spark的技术书籍,对Spark技术感兴趣想要学习的同学能做个参考。

1.大数据技术丛书:Spark快速数据解决

大数据项目实战必备技可以之Spark

Spark快速数据解决

内容通俗易懂,极其适合入门。从实使用角度系统讲解Spark的数据解决工具及用方法,手把手教你充分利使用Spark提供的各种功可以,快速编写高效分布式程序。

2.Spark大数据解决:技术、应使用与性可以优化

大数据项目实战必备技可以之Spark

Spark大数据解决:技术、应使用与性可以优化

作者结合自己在微软和IBM的实践经验和对Spark源代码的研究撰写而成。首先从技术层面讲解了Spark的体系结构、工作机制、安装与部署、开发环境调试、计算模型、Benchmark、BDAS等内容;而后从应使用角度讲解了少量简单的、有代表性的案例;最后对Spark的性可以优化进行了讨论。

3.大数据Spark企业级实战

大数据项目实战必备技可以之Spark

大数据Spark企业级实战

完全从企业解决大数据业务场景的角度出发,完全基于实战代码来组织内容,从零起步,不许任何基础,完全无痛地掌握Spark大数据解决实战技术。

4.Spark大数据解决技术

大数据项目实战必备技可以之Spark

Spark大数据解决技术

首部全面详情Spark及Spark生态圈相关技术的技术书籍俯览未来大局,不失精细剖析,呈现一个现代大数据框架的架构原理和实现细节透彻讲解Spark原理和架构,以及部署模式、调度框架、存储管理及应使用监控等重要板块Spark生态圈深度检阅:SQL解决Shark和Spark SQL、流式解决Spark Streaming、图计算Graphx及内存文件系统Tachyon。

今天就给大家分享到这里,希望对大家有所帮助,希望大家多多关注哦,有需要帮忙的也能私信我,力所可以及,在所不辞!

  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部