目录:

1、Spark概述

1.1、Spark是什么?

1.2、Spark基本原理

1.3、Spark软件栈

1.4、Spark与Hadoop

1.5、运行流程及特点

1.6、常用术语

1.7、Spark的适用场景


1、Spark概述

Spark官网关于Spark2.2.0需要以下条件:
maven3.3.9+
Java8+
Spark2.2.0

1.1、Spark是什么?

Spark是一个用来实现快速而通用的集群计算平台。

Spark的一个主要特点就是能够在内存中进行计算,因此更快。

Spark适用于各种各样的原先需要多种不同的分布式场景,包括批处理、迭代计算、交互式查询、流处理。通过在一个统一的框架下支持这些不同的计算,Spark使我们可以简单而低耗地把各种处理流程整合在一起。

官方网站:http://spark.apache.org/官方文档:http://spark.apache.org/docs/latest/index.html源码地址:https://github.com/apache/spark

1.2、Spark基本原理

Spark运行框架如下图所示,首先有集群资源管理服务(Cluster Manager)和运行作业任务的结点(Worker Node),然后就是每个应用的任务控制结点Driver和每个机器节点上有具体任务的执行进程(Executor)。

首先Driver程序启动多个Worker,Worker从文件系统加载数据并产生RDD(即数据放到RDD中,RDD是一个数据结构),并按照不同分区Cache到内存中。

sparkMLlib 推荐系统 spark软件_Hadoop

1.3、Spark软件栈

Spark项目包含多个紧密集成的组件。Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的集群。

Spark的各个组件:

        

sparkMLlib 推荐系统 spark软件_sparkMLlib 推荐系统_02

1.3.1 Spark Core

Spark Core 实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简称 RDD)的 API 定义。RDD 表示分布在多个计算节点上可以并行操作的元素集合,是Spark 主要的编程抽象。Spark Core 提供了创建和操作这些集合的多个 API

1.3.2 Spark SQL

Spark SQL是Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用SQL或者Apache Hive版本的SQL语言(HQL)来查询数据。Spark支持多种数据源,比如 Hive 表、Parquet 以及 JSON 等。

1.3.3 Spark Streaming

SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kafka、Flume、Twitter、Zero和TCP 套接字)进行类似Map、Reduce和Join等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。Spark Streaming 提供了用来操作数据流的API,并且和RDD API高度对应,这样大大降低了学习和开发的门槛和成本。

1.3.4 MLlib

Spark中还包含一个提供常见的机器学习(ML)功能的程序库,叫做MLlib。MLlib提供了很多种机器学习算法,包括分类、回归、聚类、协同过滤等。还提供了模型评估、数据导入等额外的支持功能。MLib还提供了一些更底层的机器学习原语。包括一个通用的梯度下降优化算法。所有这些方法都被设计为可以在集群上轻松伸缩的架构。             

1.3.5 GraphX

GraphX时用来操作图(比如社交网络的朋友关系图)的程序库。可以用来进行并行的图计算。与 Spark Streaming 和 Spark SQL 类似,GraphX 也扩展了 Spark 的 RDD API,能用来创建一个顶点和边都包含任意属性的有向图。GraphX 还支持针对图的各种操作(比如进行图分割的 subgraph 和操作所有顶点的 mapVertices ),以及一些常用图算法(比如 PageRank和三角计数)。

1.3.6 集群管理器

就底层而言,Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。Spark 支持在各种集群管理器(cluster manager)上运行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自带的一个简易调度器,叫作独立调度器。

1.4、Spark与Hadoop

  1. Hadoop有两个核心模块,分布式存储模块HDFS和分布式计算模块MapReduce。
  2. spark本身并没有提供分布式文件系统,因此spark的分析大多依赖于Hadoop的分布式文件系统HDFS。
  3. Hadoop的Mapreduce与spark都可以进行数据计算,而相比于Mapreduce,spark的速度更快并且提供的功能更加丰富。

关系图如下:

sparkMLlib 推荐系统 spark软件_Hadoop_03

 

1.5、运行流程及特点

1:运行速度快
Spark 拥有 DAG 执行引擎,支持在内存中对数据进行迭代计算。如果数据由磁盘读取,速度是Hadoop的10倍以上,如果内存中读取,速度可以高达 100 多倍。

2:易用性好
Spark 不仅支持 Scala 编写应用程序,而且支持 Java 和 Python 等语言进行编写,特别是 Scala 是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。

3:通用性
Spark 提供了大量的库,包括SQL、DataFrames、MLlib、GraphX、Spark Streaming。 开发者可以在同一个应用程序中无缝组合使用这些库。

4:支持多种资源管理器
Spark 支持 Hadoop YARN,Apache Mesos,及其自带的独立集群管理器

 

spark运行流程图如下:

sparkMLlib 推荐系统 spark软件_数据_04

  1. 构建Spark Application的运行环境,启动SparkContextSparkContext。
  2. 向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend。
  3. Executor向SparkContext申请Task。
  4. SparkContext将应用程序分发给Executor。
  5. SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行。
  6. Task在Executor上运行,运行完释放所有资源。

 

Spark运行特点:

  1. 每个Application获取专属的executor进程,该进程在Application期间一直驻留,并以多线程方式运行Task。这种Application隔离机制是有优势的,无论是从调度角度看(每个Driver调度他自己的任务),还是从运行角度看(来自不同Application的Task运行在不同JVM中),当然这样意味着Spark Application不能跨应用程序共享数据,除非将数据写入外部存储系统。
  2. Spark与资源管理器无关,只要能够获取executor进程,并能保持相互通信就可以了。
  3. 提交SparkContext的Client应该靠近Worker节点(运行Executor的节点),最好是在同一个Rack里,因为Spark Application运行过程中SparkContext和Executor之间有大量的信息交换。
  4. Task采用了数据本地性和推测执行的优化机制。

1.6、常用术语

  1. Application: Appliction都是指用户编写的Spark应用程序,其中包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码
  2. Driver:  Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver
  3. Executor: 某个Application运行在worker节点上的一个进程, 该进程负责运行某些Task, 并且负责将数据存到内存或磁盘上,每个Application都有各自独立的一批Executor, 在Spark on Yarn模式下,其进程名称为CoarseGrainedExecutorBackend。一个CoarseGrainedExecutor Backend有且仅有一个Executor对象, 负责将Task包装成taskRunner,并从线程池中抽取一个空闲线程运行Task, 这个每一个oarseGrainedExecutor Backend能并行运行Task的数量取决与分配给它的cpu个数。
  4. Cluter Manager指的是在集群上获取资源的外部服务。目前有三种类型
  5. Standalon : spark原生的资源管理,由Master负责资源的分配Apache
  6. Mesos:与hadoop MR兼容性良好的一种资源调度框架Hadoop
  7. Yarn: 主要是指Yarn中的ResourceManager
  8. Worker:集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slave文件配置的Worker节点,在Spark on Yarn模式下就是NoteManager节点。
  9. Task: 被送到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责。
  10. Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job。
  11. Stage: 每个Job会被拆分成多组Task, 作为一个TaskSet,其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方。
  12. DAGScheduler:根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法,如下图

sparkMLlib 推荐系统 spark软件_Spark_05

  1. TASKSedulter: 将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的. TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。下图展示了TaskScheduler的作用。

sparkMLlib 推荐系统 spark软件_sparkMLlib 推荐系统_06

  1. 在不同运行模式中任务调度器具体为:
  2. Spark on Standalone模式为TaskScheduler
  3. YARN-Client模式为YarnClientClusterScheduler
  4. YARN-Cluster模式为YarnClusterScheduler
  5. 将这些术语串起来的运行层次图如下:

sparkMLlib 推荐系统 spark软件_Spark_07

Job=多个stage,Stage=多个同种task, Task分为ShuffleMapTask和ResultTask,Dependency分为ShuffleDependency和NarrowDependency。

1.7、Spark的适用场景

1、复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时(这个类似hadoop的 MapReduce计算)
2、数据量不是特别大,但是要求实时统计分析需求 (实时计算)
3、Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小。