一、Spark简介
Spark
诞生于加州大学伯克利分校AMP实验室,是一个基于内存的分布式计算框架
发展历程:
- 2009年诞生于加州大学伯克利分校
AMP
实验室 - 2010年正式开源
- 2013年6月正式成为
Apache
孵化项目 - 2014年2月成为
Apache
顶级项目 - 2014年5月正式发布
Spark 1.0
版本 - 2014年10月
Spark
打破MapReduce
保持的排序记录 - 2015年发布了1.3、1.4、1.5版本
- 2016年发布了1.6、2.x版本
为什么使用Spark
1、MapReduce编程模型的局限性
(1)繁杂:
- 只有Map和Reduce两个操作,复杂的逻辑需要大量的样板代码
(2)处理效率低:
- Map中间结果写磁盘,Reduce写HDFS,多个Map通过HDFS交换数据
- 任务调度与启动开销大
(3)不适合迭代处理、交互式处理和流式处理
2、Spark是类Hadoop MapReduce的通用并行框架
- Job中间输出结果可以保存在内存,不再需要读写HDFS
- 比MapReduce平均快10倍以上
Spark优势
1、速度快
- 基于内存数据处理,比MR快100个数量级以上(逻辑回归算法测试)
- 基于硬盘数据处理,比MR快10个数量级以上
2、易用性
- 支持Java、Scala、Python、R语言
- 交互式shell方便开发测试
3、通用性
- 一栈式解决方案:批处理、交互式查询、实时流处理、图计算及机器学习
4、随处运行
- YARN、Mesos、EC2、Kubernetes、Standalone、Local
Spark技术栈
1、Spark Core
核心组件,分布式计算引擎
2、Spark SQL
高性能的基于Hadoop的SQL解决方案
3、Spark Streaming
可以实现高吞吐量、具备容错机制的准实时流处理系统
4、Spark GraphX
分布式图处理框架
5、Spark MLlib
构建在Spark上的分布式机器学习库
二、Spark架构设计
1、运行架构
- 在驱动程序中,通过
SparkContext
主导应用的执行 SparkContext
可以连接不同类型的Cluster Manager
,连接后,获得集群节点上的Executor- 一个
Worker
节点默认一个Executor
,可通过SPARK_WORKER_INSTANCES
调整 - 每个应用获取自己的
Executor
- 每个
Task
处理一个RDD
分区
2、Spark架构核心组件
术语 | 说 明 |
---|---|
Application | 建立在Spark上的用户程序,包括Driver代码和运行在集群各节点Executor中的代码 |
Driver program | 驱动程序。Application中的main函数并创建SparkContext |
Cluster Manager | 在集群(Standalone、Mesos、YARN)上获取资源的外部服务 |
Worker Node | 集群中任何可以运行Application代码的节点 |
Executor | 某个Application运行在worker节点上的一个进程 |
Task | 被送到某个Executor上的工作单元 |
Job | 包含多个Task组成的并行计算,往往由Spark Action触发生成,一个Application中往往会产生多个Job |
Stage | 每个Job会被拆分成多组Task,作为一个TaskSet,其名称为Stage |
3、Spark API
SparkContext
- 连接 Driver 与 Spark Cluster
- Spark 的主入口
- 每个JVM仅能有一个活跃的 SparkContext
- SparkContext.getOrCreate
import org.apache.spark.{SparkConf, SparkContext} //导包
val conf=new SparkConf().setMaster("local[*]").setAppName("HelloSpark")
val sc=SparkContext.getOrCreate(conf)
val sc = new SparkContext(conf) //同上
SparkSession
- Spark 2.0+应用程序的主入口:包含了SparkContext、SQLContext、HiveContext以及StreamingContext
- SparkSession.getOrCreate
import org.apache.spark.sql.SparkSession //导包
val spark = SparkSession.builder.master("local[2]").appName("appName").getOrCreate()