1. Spark概述
1.1Spark是什么
Spark是内存计算系统,2009年它出品于UCBerkeley AMPLab伯克利下属实验室,它最早是一片博士论文,论述如何提高map和reduce的效率。后来就针对这篇论文写出了相应的实现。2013年6月捐赠了给Apache,2014年2月成为Apache的顶级项目。
最大节点的集群来自腾讯,8000个节点,单个job最大分别是阿里巴巴和Databricks,处理到1PB的数据。宣传其MapReduce方式比Hadoop方式快,快10到100倍。
1.2产生背景
- MapReduce框架局限性
- 仅支持Map和Reduce两种操作
- 处理效率低效
- Map中间结果写磁盘,Reduce写HDFS,多个MR间通过HDFS交换数据;
- 任务调度和启动开销大;
- 无法充分利用内存
- Map端和Reduce端均需要排序
- 不适合迭代计算(机器学习、图计算),交互式处理(数据挖掘)
- MapReduce编程不够灵活
- 尝试scala函数式编程语言
- 现有框架多样化,不统一
- 批处理:MapReduce、Hive、Pig
- 流式计算:Storm
- 交互式计算:Impala
1.3有什么特点
- 高效(比MapReduce快10~100倍)
- 内存计算引擎,提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销
- DAG引擎,减少多次计算之间中间结果写到HDFS的开销
- 使用多线程池模型开减少task启动开销,shuffle过程中避免不必要的sort操作以及减少磁盘IO操作
- 易用
- 提供了丰富的API ,支持Java,Scala,Python和R四种语言
- 与Hadoop集成
- 读写HDFS/Hbase
- 与YARN集成
2. Spark核心
2.1核心概念
Resilient Distributed DataSet,弹性分布式数据集,是一个分布式内存的一个抽象概念,RDD是spark的灵魂。RDD提供了一个可以让用户显示地将数据存储到磁盘和内存中,并能控制数据的分区,RDD内部有许多分区,每个分区有大量的数据。有以下特点:
- 分布在集群中的只读对象集合(由多个Partition构成)
- 可以存储在磁盘或内存中
- 通过并行transformation操作构造
- 失效后自动重建
2.1RDD的创建方式
- 调用SparkContext的parallelizing 方法,在Driver中一个已经存在的集合上创建
- 读取一个外部数据集
2.2RDD的基本操作
- Transformation
转换操作是接收RDD并返回RDD - Action
行动操作是接收RDD返回非RDD的一个结果或一个值
2.3RDD的操作流程
- 创建SparkContext对象
- 创建RDD
Spark读取外部数据源或从父RDD中创建,形成RDD - RDD进行一系列的transformation或action的操作
RDD采用了惰性调用,即在RDD的执行过程中,真正的计算发生在RDD的“行动”操作,对于“转换”Spark只是记录下“转换”操作应用的一些基础数据集以及RDD生成的轨迹,即相互之间的依赖关系,而不会触发真正的计算。
3.Spark生态
Spark Core:实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简 称 RDD)的 API 定义。RDD 表示分布在多个计算节点上可以并行操作的元素集合,是 Spark 主要的编程抽象。
Spark SQL:是 Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比 如 Hive 表、Parquet 以及 JSON 等。
Spark Streaming:是 Spark 提供的对实时数据进行流式计算的组件,其核心思路是将流式计算分解成一系列短小的批处理作业。
Mllib:提供 了很多种机器学习算法,包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。MLlib 还提供了一些更底层的机器学习原语,包括一个通用的梯 度下降优化算法。所有这些方法都被设计为可以在集群上轻松伸缩的架构。
GraphX:是用来操作图(比如社交网络的朋友关系图)的程序库,可以进行并行的图计算。 与 Spark Streaming 和 Spark SQL 类似,GraphX 也扩展了 Spark 的 RDD API,能用来创建 一个顶点和边都包含任意属性的有向图。
4. Spark运行模式
从上图中可以看到spark可以本地运行,也可以独立运行,还可以运行在管理工具上
- 本地运行
单机运行,通常用于测试 - 独立运行
独立运行在一个集群中 - 管理工具
运行在资源管理系统上,比如YARN,或者mesos