文章目录
Spark内存计算框架
- spark 组成:
- spark core:核心模块
- spark sql:支持SQL
- spark streaming:支持流计算
- spark graphx:支持图计算
- spark mllib:支持机器学习
Spark Core
Spark 是什么?

- Spark是一个快速(基于内存),通用、可扩展的计算引擎,采用Scala语言编写。
- 2009年诞生于UC Berkeley(加州大学伯克利分校,CAL的AMP实验室),2010年开源,2013年6月进入Apach孵化器。
- 同年由美国伯克利大学 AMP 实验室的 Spark 大数据处理系统多位创始人联合创立Databricks(属于 Spark 的商业化公司-业界称之为数砖-数据展现-砌墙-侧面应正其不是基石,只是数据计算)。
- 2014年成为 Apache 顶级项目,自2009年以来,已有1200多家开发商为Spark出力!
- Spark 支持 Java、Scala、Python、R、SQL 语言,并提供了几十种(目前80+种)高性能的算法,这些如果让我们自己来做,几乎不可能。
- Spark 得到众多公司支持,如:阿里、腾讯、京东、携程、百度、优酷、土豆、IBM、Cloudera、Hortonworks 等。
- Spark 是在 Hadoop 基础上的改进,是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用的并行计算框架,Spark 基于 map reduce 算法实现的分布式计算,拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出和结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 map reduce 的算法。
- Spark 是基于内存计算框架,计算速度非常之快,但是它仅仅只是涉及到计算,并没有涉及到数据的存储,后期需要使用 spark 对接外部的数据源,比如 hdfs。
这里有个疑问?内存不够怎么办呢?
Does my data need to fit in memory to use Spark? 我的数据需要放入内存才能使用Spark吗?
No. Spark’s operators spill data to disk if it does not in memory, allowing it to run well on any sized data. Likewise, cached datasets that do not fit in memory are either spilled to disk or recomputed on the fly when needed, as determined by the RDD’s storage level.
不会。如果不合适存储在内存,那么Spark的操作员会将数据溢写到磁盘上,这样就可以不管数据大小如何而良好运行。同样,不适合内存的缓存数据集要么溢出到磁盘,要么在需要时实时重新计算,这由RDD的存储级别决定。
四大特性
1. 速度快

- 运行速度提高100倍(针对hadoop2.x比较,而hadoop3.x号称比spark又快10倍)
- Apache Spark 使用最先进的 DAG 调度程序,查询优化程序和物理执行引擎,实现批量和流式数据的高性能。
- spark 比 mapreduce 快的 2 个主要原因:
- 基于内存:mapreduce 任务后期再计算的时候,每一个 job 的输出结果会落地到磁盘,后续有其他的job 需要依赖于前面 job 的输出结果,这个时候就需要进行大量的磁盘 io 操作,性能就比较低。spark 任务后期再计算的时候,job 的输出结果可以保存在内存中,后续有其他的 job 需要依赖于前面 job 的输出结果,这个时候就直接从内存中获取得到,避免了磁盘 io 操作,性能比较高。对于spark程序和mapreduce程序都会产生shuffle阶段,在shuffle阶段中它们产生的数据都会落地到磁盘。
- 进程与线程:mapreduce任务以进程的方式运行在 yarn 集群中,比如程序中有100个MapTask,一个 task 就需要一个进程,这些task要运行就需要开启100个进程。spark 任务以线程的方式运行在进程中,比如程序中有100个 MapTask,后期一个 task 就对应一个线程,这里就不在是进程,这些 task 需要运行,这里可以极端一点:只需要开启1个进程,在这个进程中启动100个线程就可以了。进程中可以启动很多个线程,而开启一个进程与开启一个线程需要的时间和调度代价是不一样。 开启一个进程需要的时间远远大于开启一个线程。
2. 易用性

- 可以快速去编写spark程序通过 java/scala/python/R/SQL 等不同语言。
3. 通用性

- spark 框架不在是一个简单的框架,可以把 spark 理解成一个生态系统,它内部是包含了很多模块,基于不同的应用场景可以选择对应的模块去使用:
- spark sql:通过sql去开发spark程序做一些离线分析
- spark streaming:主要是用来解决公司有实时计算的这种场景
- spark graphx:支持图计算
- spark mllib:它封装了一些机器学习的算法库
4. 兼容性

- Spark运行在 Hadoop、ApacheMesos、Kubernetes、单机版或云中。它可以访问不同的数据源:
-
standAlone:它是 spark 自带的独立运行模式,整个任务的资源分配由 spark 集群的老大 Master 负责
-
yarn:可以把 spark 程序提交到 yarn 中运行,整个任务的资源分配由 yarn 中的老大 ResourceManager 负责
-
mesos:它也是 apache 开源的一个类似于 yarn 的资源调度平台
-
cassandra:是一套开源分布式 NoSQL 数据库系统
-
kubernetes:用于管理云平台中多个主机上的容器化的应用
-
hbase:是一个分布式的、面向列的开源数据库
-
内置组件
- 机器学习(MLlib),图计算(GraphicX),实时处理(SparkStreaming),SQL解析(SparkSql)

1. 集群资源管理
- Spark 设计为可以高效的在一个计算节点到数千个计算节点之间伸缩计算,为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群资源管理器上运行,目前支持的3种如下:(上图中下三个)
- Hadoop YARN(国内几乎都用)
- 可以把 spark 程序提交到 yarn 中运行,整个任务的资源分配由 yarn 中的老大 ResourceManager 负责
- Apach Mesos(国外使用较多)
- 它也是 apache 开源的一个类似于 yarn 的资源调度平台。
- Standalone(Spark自带的资源调度器,需要在集群中的每台节点上配置 Spark)
- 它是 spark 自带的集群模式,整个任务的资源分配由 spark 集群的老大 Master 负责
- Hadoop YARN(国内几乎都用)
2. Spark Core(核心库)
- 实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。
- 其中还包含了对**弹性分布式数据集(RDD:Resilient Distributed DataSet)**的API定义
3. Spark SQL(SQL解析)
- 是Spark用来操作结构化数据的程序包,通过Spark SQL 我们可以使用SQL或者HQL来查询数据。
- 且支持多种数据源:Hive、Parquet、Json等
4. Spark Streaming(实时处理)
- 是Spark提供的对实时数据进行流式计算的组件
5. Spark MLlib(机器学习)
- 提供常见的机器学习功能和程序库,包括分类、回归、聚类、协同过滤等。还提供了模型评估、数据导入等额外的支持功能。
6. Spark GraphX(图计算)
- 用于图形和图形并行计算的API。
集群架构及核心概念
1. 集群架构
- 执行架构图:

- 执行流程图:

- 应用结构图:

2. 核心概念
- 结合下图,理解这些核心概念

- Master
- Spark Standalone 模式下,Spark 特有的资源调度系统 Leader,掌控整个集群资源信息,类似于 Yarn 框架中的 ResourceManager
- 监听 Worker,检测 Worker 是否正常工作
- Master 对 Worker、Application 等的管理(接收 Worker 的注册并管理所有的 Worker,接收 Client 提交的 Application,调度等待 Application 并向 Worker 提交)
- Worker
- Spark Standalone 模式下,Spark 特有的资源调度 Slave,有多个。每个 Slave 掌握着所在节点的资源信息,类似于 Yarn 框架的 NodeManager
- 通过 RegisterWorker 注册到 Master
- 定时发送心跳给 Master
- 根据 Master 发送的 Application 配置进程环境,并启动 ExecutorBackend(执行 Task 所需的计算任务进程)
- Driver
- Spark 的驱动器,是执行开发程序中的 main 方法的线程
- 负责开发人员编写 SparkContext、RDD,以及进行 RDD 操作的代码执行
- 如果使用 Spark Shell,那么启动时后台自启动了一个 Spark 驱动器,预加载一个叫做 sc 的 SparkContext 对象(该对象是所有 spark 程序的执行入口),如果驱动器终止,那么 Spark 应用也就结束了
- 四大主要职责:
- 将用户程序转化为作业(Job)
- 在 Executor 之间调度任务(Task)
- 跟踪 Executor 的执行情况
- 通过 UI 展示查询运行情况
- Executor
- Spark Executor 是一个工作节点,负责在 Spark 作业中运行任务,任务间相互独立
- Spark 应用启动时,Executor 被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在
- 如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续进行,会将出错节点上的任务调度到其它 Executor 节点上继续运行
- 两个核心功能:
- 负责运行组成 Spark 应用的任务,并将结果返回给驱动器(Driver)
- 它通过自身块管理器(BlockManager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
- RDDs
- Resilient Distributed DataSet:弹性分布式数据集
- 一旦拥有 SparkContext 对象,就可以用它来创建 RDD
- Application应用
- 一个 SparkContext 就是一个 Application(一个 Spark 的应用程序),它是包含了客户端的代码和任务运行的资源信息
- Job作业
- 一个行动算子(Action)就是一个 Job
- Stage阶段
- 一次宽依赖(一次 Shuffle)就是一个 Stage,划分是从后往前划分
- Task任务
- Spark 任务是以 Task 线程的方式运行在 Worker 节点对应的 Executor 进程中
- 一个核心就是一个 Task,体现任务的并行度
Spark 集群
1. 搭建 Spark 集群
实现要搭建好 Zookeeper 和 Hadoop 集群
- 下载安装包:这里选择 spark-2.3.3-bin-hadoop2.7.tgz 安装包
# 在 node01 的 /bigdata/soft 目录下载
wget https://archive.apache.org/dist/spark/spark-2.3.3/spark-2.3.3-bin-hadoop2.7.tgz
- 解压缩到指定安装目录
tar -zxvf spark-2.3.3-bin-hadoop2.7.tgz -C /bigdata/install
- 修改配置文件
spark-env.sh:进入到 spark 安装目录下对应的 conf 目录,先在 node01 进行如下文件的修改
# 修改 spark-env.sh
$ pwd
/bigdata/install/spark-2.3.3-bin-hadoop2.7/conf
$ cp spark-env.sh.template spark-env.sh
$ vim spark-env.sh
# 配置 JAVA 的环境变量
export JAVA_HOME=/usr/apps/jdk1.8.0_241
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=4000 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://node01:8020/spark_log"
# 配置 ZK 相关信息
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181 -Dspark.deploy.zookeeper.dir=/spark"
- 修改配置文件
slaves
$ cp slaves.template slaves
$ vim slaves
# 指定spark集群的worker节点
node01
node02
node03
- 修改配置文件
spark-defaults.conf
$ cp spark-defaults.conf.template spark-defaults.conf
$


2873

被折叠的 条评论
为什么被折叠?



