Spark概述
▍Spark初见
- Spark诞生于美国加州大学伯克利分校
- Spark是基于内存计算的大数据并行、实时计算框架
- Spark最大的特点是基于内存的实时计算
- 2013年Spark加入Apache孵化器后发展迅猛,如今已成为Apache基金会最重要的三大分布式开源项目之一(Hadoop、Spark、Storm)
- 2014年打破Hadoop保持的基准排序记录——Spark用十分之一的计算资源,获得了比Hadoop快3倍的速度
▍Spark特点
- 速度快:使用DAG执行引擎,以支持循环数据流与内存计算
- 支持多种语言:支持使用Scala、Java、Python、R语言进行编程;可以通过Spark Shell进行交互
- 通用技术栈:Spark提供强大而完整的技术栈——SQL、流式计算、机器学习、图算法
- 运行模式多样:可运行于独立的集群模式,可运行与Hadoop,可运行与Amazon EC2等云环境…并可以访问HDFS、Hbase、Hive、Cassandra等多种数据源
▍Spark发展趋势
不难看出,2014年是Spark篡位的一年。
▍Spark与Hadoop的对比
▶ Hadoop的缺点
- MapReduce计算模型延迟过高——只适用于离线批处理场景,无法胜任实时、快速计算
- 中间结果需要写入磁盘,频繁通过HDFS读写磁盘
- 存在拓扑限制,即前驱任务未完成,所有后继任务无法开始——因此难以胜任复杂、多阶段的计算任务
▶ Spark的优点
- Spark的计算模型也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种操作类型——编程模型比MapReduce更加灵活
- Spark提供内存计算,可将中间结果存到内存中,对于迭代运算的效率更高
- Spark基于DAG的任务调度执行机制,这明显优于HadoopMapReduce的迭代执行机制
Spark计算模型也是属于MapReduce的,并未完全脱离 !!!
但Spark在借鉴MapReduce优点的同时,很好地解决了MapReduce的问题 !!!
Spark生态系统
▍传统应用场景
大数据处理主要包括下面3种类型:
- 复杂的批处理:时间跨度在数十分钟(min)到数小时(hour)之间——MapReduce
- 基于历史数据的交互式查询:时间跨度在数十秒(sec)到数分钟(min)之间——Impala
- 基于实时数据的流数据处理:时间跨度在数百毫秒(ms)到数秒(sec)之间——Storm
这难免会带来一些问题:
- 不同场景之间的数据input/output无法做到无缝共享,通常需要进行数据格式的转换
- 不同的软件需要不同的开发/维护团队,这带来了较高的使用成本
- 难以对同一个集群中各个系统进行统一的资源协调/分配
▍Saprk应用场景
以BDAS(Berkeley Data Analytics Stack,伯克利数据分析软件栈)为例:
常用的组件为:
应用场景 | 常用组件 | Spark生态系统组件 |
---|---|---|
复杂的批处理 | MapReduce, Hive | Spark |
基于历史数据的交互式查询 | Impala, Dremel, Drill | Spark SQL |
基于实时数据的流数据处理 | Storm, S4 | Spark Streaming |
基于历史数据的数据挖掘 | Mahout | MLlib |
图结构数据的处理 | Pregel, Hama | GraphX |
Spark SQL
▍从Shark说起
——什么是Shark?
- 即Hive on Spark
- 为了实现与Hive兼容,Shark重用了HiveQL
- 可以近似认为,仅仅是在物理执行计划阶段把MapReduce作业替换成了Spark作业
——Shark的设计导致了什么问题?
- 一是执行计划优化完全依赖于Hive,不方便添加新的优化策略
- 二是因为Spark是线程级并行,而MapReduce是进程级并行,因此Spark在尝试兼容Hive时存在线程安全问题,需要打补丁
▍Spark SQL架构
Spark SQL仅仅依赖HiveQL解析、Hive元数据,从抽象语法树开始,就全部由Spark SQL接管了
▍Spark SQL支持
Spark支持的数据源有RDD、HDFS、Hive、Cassandra,甚至JSON
Spark支持Scala、Java、Python三种语言,支持SQL-92规范
Spark Streaming
▍概述
- Spark Streaming和Spark的本质一样——是一套框架
- Spark Streaming是Spark Core API的一个扩展,可以实现高吞吐量的、具备容错机制的实时流数据处理
- Spark Streaming接收Kafka、Flume、HDFS等各种来源的实时input,然后处理后output到HDFS、DataBase等各种地方
▍原理
- Spark Streaming不是像Strom那样,一条一条数据流的处理数据
- 而是将一条数据流按时间切分,然后以类似bat批处理的方式处理这些“小数据”——和spark思路逻辑相同
理解一下:假如外部数据不断涌入,按照一分钟切片,那么每个“一分钟”的内部的数据是连续的(连续流),这这些“一分钟”之间却是相互独立的(离散流)。
▍组成
- Spark = RDD + RDD DAG
- Spark Streaming = Dstream + Dstream Graph
理解一下:Dstream是它特有的数据类型,其实就是RDDs(一串RDD序列)——即在RDD的基础上,加上了时间维度
▍理解
Spark Streaming的本质就是,将连续的数据离散化、持久化,然后进行批量处理。
—— 持久化?为了容错,即数据流出错了,还有回溯的余地
—— 离散化?就是按时间分片,来形成处理单元,从而得以进行分批处理
Spark的部署和应用方式
▍三种部署方式
- Standalone(类似于MapReduce1.0,slot为资源分配单位)
- Spark on Mesos(Mesos与Spark有血缘关系,是Apache下的开源分布式资源管理框架)
- Spark on Yarn(Yarn是新一代资源管理调度框架)
▍图解(⭐️)
▍从Hadoop+Storm架构转向Spark架构
▍使用Spark架构的优点
- 实现一键式安装和配置
- 实现线程级别的人任务监控和警告
- 降低硬件集群、软件维护、任务监控、应用开发的难度
- 便于做成统一的硬件、计算平台资源池
需要说明的是,Spark Streaming无法实现毫秒级的流计算,因此在一些场景下仍需要采用流计算框架(Storm)——也就是说,Hadoop目前无法被Spark完全取代;况且部分取代也是需要一定的转移成本的。
▍Hadoop和Spark的统一部署
补充:Scala语言
几个关于Scala的知识点汇总:
- Scala是一门多范式(multi-paradigm)的编程语言
- Scala的设计初衷是要集成面向对象编程和函数式编程的各种特性
- Scala运行在Java虚拟机(JVM)上,并兼容现有的Java程序
- Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库!
直接HelloWorld:
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}
// 不难看出,和Java极为相似 >_<!!!
// 一个区分于Java的明显特征是,对于分号(;)无强制要求
将以上代码保存为HelloWorld.scala,然后就和Java一样:
>>> scalac HelloWorld.scala // 将源码编译为字节码
>>> scala HelloWorld // 把字节码放到虚拟机中运行
成功输出 >_<:
>>> Hello, world!
E N D END END