## 引言
![](https://img.kancloud.cn/7b/bc/7bbce50b58b4d122bcb7b10d0f564a22_1415x1141.png)
## 1. Spark基础
### 1.1 Spark 为何物
**Spark 是(flink出现之前)当今大数据领域最活跃、最热门、最高效的大数据通用计算平台之一**。
Hadoop 之父 Doug Cutting 指出:Use of MapReduce engine for Big Data projects will decline, replaced by Apache Spark (大数据项目的 MapReduce 引擎的使用将下降,由 Apache Spark 取代)。
### 1.2 Spark VS Hadoop
尽管 `Spark` 相对于 `Hadoop` 而言具有较大优势,但 `Spark` 并不能完全替代 `Hadoop`,`Spark` 主要用于替代`Hadoop`中的 `MapReduce` 计算模型。存储依然可以使用 `HDFS`,但是中间结果可以存放在内存中;调度可以使用 `Spark` 内置的,也可以使用更成熟的调度系统 `YARN` 等。
| | *Hadoop* | *Spark* |
| --- | --- | --- |
| **类型** | 分布式基础平台, 包含计算, 存储, 调度 | 分布式计算工具 |
| **场景** | 大规模数据集上的批处理 | 迭代计算, 交互式计算, 流计算 |
| **价格** | 对机器要求低, 便宜 | 对**内存**有要求, 相对较贵 |
| **编程范式** | Map+Reduce, API 较为底层, 算法适应性差 | RDD 组成 DAG 有向无环图, API 较为顶层, 方便使用 |
| **数据存储结构** | MapReduce **中间计算结果存在 HDFS 磁盘上, 延迟大** | RDD 中间**运算结果存在内存中 , 延迟小** |
| **运行方式** | Task 以进程方式维护, 任务启动慢 | Task 以线程方式维护, 任务启动快 |
实际上,`Spark` 已经很好地融入了 `Hadoop` 生态圈,并成为其中的重要一员,它可以借助于 `YARN` 实现资源调度管理,借助于 `HDFS` 实现分布式存储。
此外,`Hadoop` 可以使用廉价的、异构的机器来做分布式存储与计算,但是,`Spark` 对硬件的要求稍高一些,对内存与 `CPU` 有一定的要求。
### 1.3 Spark 优势及特点
#### 1.3.1 优秀的数据模型和丰富计算抽象
首先看看`MapReduce`,它提供了对数据访问和计算的抽象,但是对于数据的复用就是简单的将中间数据写到一个稳定的**文件系统**中 (例如 `HDFS`),所以会产生数据的复制备份,磁盘的`I/O`以及数据的序列化,所以在遇到需要在多个计算之间复用中间结果的操作时效率就会非常的低。而这类操作是非常常见的,例如迭代式计算,交互式数据挖掘,图计算等。
因此 `AMPLab` 提出了一个新的模型,叫做 **RDD**。
* **RDD** 是一个可以容错且并行的数据结构(其实可以理解成分布式的集合,操作起来和操作本地集合一样简单),它可以让用户显式的将中间结果数据集保存在 **内存** 中,并且通过控制数据集的分区来达到数据存放处理最优化。同时 `RDD` 也提供了丰富的 `API (map、reduce、filter、foreach、redeceByKey...)`来操作数据集。
**后来 `RDD` 被 `AMPLab` 在一个叫做 `Spark` 的框架中提供并开源。**
#### 1.3.2 完善的生态圈 - fullstack
![](https://img.kancloud.cn/7a/80/7a8040300f1a88e6c0fa60eaca062fb9_904x380.png)
`Spark`有完善的生态圈,如下:
* **Spark Core**(重点):实现了 Spark 的基本功能,包含 RDD、任务调度、内存管理、错误恢复、与存储系统交互等模块。
* **Spark SQL**(重点):Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL 操作数据。
* **Spark Streaming**(重点):Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API。
* **Spark MLlib**:提供常见的机器学习 (ML) 功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
* **GraphX(图计算)**:Spark 中用于图计算的 API,性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。
* **集群管理器**:Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。
* **Structured Streaming**:处理结构化流, 统一了离线和实时的 API。
#### 1.3.3 spark 的特点
* **快**:与 Hadoop 的 MapReduce 相比,Spark 基于内存的运算要快 100 倍以上,基于硬盘的运算也要快 10 倍以上。Spark 实现了高效的DAG 执行引擎,可以通过基于内存来高效处理数据流。
* **易用**:Spark 支持 Java、Python、R 和 Scala 的 API,还支持超过 80 种高级算法,使用户可以快速构建不同的应用。而且 Spark 支持交互式的 Python 和 Scala 的 shell,可以非常方便地在这些 shell 中使用 Spark 集群来验证解决问题的方法。
* **通用**:Spark 提供了统一的解决方案。Spark 可以用于批处理、交互式查询 (Spark SQL)、实时流处理 (Spark Streaming)、机器学习(Spark MLlib) 和图计算(GraphX),这些不同类型的处理都可以在同一个应用中无缝使用。
* **兼容性**:Spark 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器,并且可以处理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部署 Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。
### 1.4 Spark 运行模式
**① local 本地模式 (单机)**
* 学习测试使用
* 分为 local 单线程和 local-cluster 多线程。
**② standalone 独立集群模式**
* 学习测试使用
* 典型的 Mater/slave 模式。
**③ standalone-HA 高可用模式**
* 生产环境使用
* 基于 standalone 模式,使用 zk 搭建高可用,避免 Master 是有单点故障的。
**④ on yarn 集群模式(90%以上的场景都是应用这种模式)**
* 生产环境使用
* 运行在 yarn 集群之上,由 yarn 负责资源管理,Spark 负责任务调度和计算。
* 好处:计算资源按需伸缩,集群利用率高,共享底层存储,避免数据跨集群迁移。
**⑤ on mesos 集群模式**
* 国内使用较少
* 运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算。
**⑥ on cloud 集群模式**
* 中小公司未来会更多的使用云服务
* 比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon 的 S3。
- Introduction
- 快速上手
- Spark Shell
- 独立应用程序
- 开始翻滚吧!
- RDD编程基础
- 基础介绍
- 外部数据集
- RDD 操作
- 转换Transformations
- map与flatMap解析
- 动作Actions
- RDD持久化
- RDD容错机制
- 传递函数到 Spark
- 使用键值对
- RDD依赖关系与DAG
- 共享变量
- Spark Streaming
- 一个快速的例子
- 基本概念
- 关联
- 初始化StreamingContext
- 离散流
- 输入DStreams
- DStream中的转换
- DStream的输出操作
- 缓存或持久化
- Checkpointing
- 部署应用程序
- 监控应用程序
- 性能调优
- 减少批数据的执行时间
- 设置正确的批容量
- 内存调优
- 容错语义
- Spark SQL
- 概述
- SparkSQLvsHiveSQL
- 数据源
- RDDs
- parquet文件
- JSON数据集
- Hive表
- 数据源例子
- join操作
- 聚合操作
- 性能调优
- 其他
- Spark SQL数据类型
- 其它SQL接口
- 编写语言集成(Language-Integrated)的相关查询
- GraphX编程指南
- 开始
- 属性图
- 图操作符
- Pregel API
- 图构造者
- 部署
- 顶点和边RDDs
- 图算法
- 例子
- 更多文档
- 提交应用程序
- 独立运行Spark
- 在yarn上运行Spark
- Spark配置
- RDD 持久化