Spark简介
- 2009年诞生于美国加州大学伯克利分校AMP实验室。2010年开源,2013年成长为Apache软件基金会旗下大数据领域最活跃的开源项目之一,现在已经成为Apache软件基金会旗下的顶级开源项目。
- ApacheSpark是一种基于内存的快速、通用、可扩展的大数据计算引擎。
- Spark是一站式解决方案,集批处理、实时流处理、交互式查询、图计算与机器学习于一体。
Spark应用场景
- 批处理可用于ETL(抽取、转换、加载)。
- 机器学习可用于自动判断淘宝的买家评论是好评还是差评。
- 交互式分析可用于查询Hive数据仓库。
- 流处理可用于页面点击流分析,推荐系统,舆情分析等实时业务。
Spark的特点
Spark vs MapReduce
RDD的依赖关系
Spark核心概念RDD
- RDD(ResilientDistributedDatasets)即弹性分布式数据集,是一个只读的,可分区的分布式数据集。
- RDD默认存储在内存,当内存不足时,溢写到磁盘。
- RDD数据以分区的形式在集群中存储。
- RDD具有血统机制(Lineage),发生数据丢失时,可快速进行数据恢复。
宽窄依赖的区别-算子
- 窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用。如map、filter、union。
- 宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition。如groupByKey、reduceByKey、sortByKey。
宽窄依赖的区别-容错性
- 假如某个节点出故障了:
- 窄依赖:只要重算和子RDD分区对应的父RDD分区即可;
- 宽依赖:极端情况下,所有的父RDD分区都要进行重新计算。
- 如下图所示,b1分区丢失,则需要重新计算a1、a2和a3。
宽窄依赖的区别-传输
- 宽依赖往往对应着Shuffle操作,需要在运行过程中将同一个父RDD的分区传入到不同的子RDD分区中,中间可能涉及多个节点之间的数据传输。
- 窄依赖的每个父RDD的分区只会传入到一个子RDD分区中,通常可以在一个节点内完成转换。
RDD的Stage划分
RDD操作类型
Spark中的操作大致可以分为创建操作、转换操作、控制操作和行为操作。
- 创建操作(CreationOperation):用于RDD创建工作。RDD创建只有两种方法,一种是来自于内存集合和外部存储系统,另一种是通过转换操作生成的RDD。
- 转换操作(Transformation Operation):将RDD通过一定的操作转变成新的RDD,RDD的转换操作是情性操作,它只是定义了一个新的RDD,并没有立即执行。
- 控制操作(ControlOperation):进行RDD持久化,可以让RDD按不同的存储策略保存在磁盘或者内存中,比如cache接口默认将RDD缓存在内存中。
- 行动操作(ActionOperation):能够触发Spark运行的操作。Spark中行动操作分为两类,一类操作输出计算结果,另一类将RDD保存到外部文件系统或者数据库中。
创建操作
- 目前有两种类型的基础RDD:
- 并行集合:接收一个已经存在的集合,然后进行并行计算。
- 外部存储:在一个文件的每条记录上运行函数。只要文件系统是HDFS,或者Hadoop支持的任意存储系统即可。
- 这两种类型的RDD都可以通过相同的方式进行操作,从而获得子RDD等一系列拓展,形成血统关系图。
控制操作
- Spark可以将RDD持久化到内存或磁盘文件系统中,把RDD持久化到内存中可以极大地提高选代计算以及各计算模型之间的数据共享,一般情况下执行节点60%内存用于缓存数据,剩下的40%用于运行任务。Spark中使用persist和cache操作进行持久化,其中cache是persist()的特例。
转换操作-Transformation算子
行动操作-Action算子
DataFrame概念
- 与RDD类似,DataFrame也是一个不可变弹性分布式数据集。除了数据以外,还记录数据的结构信息,即schema。类似二维表格。
- DataFrame的查询计划可以通过SparkCatalystOptimiser进行优化,即使Spark经验并不丰富,用DataFrame写得程序也可以尽量被转化为高效的形式予以执行。
DataSet概念
- DataFrame是Dataset的特例,DataFrame=Dataset[Row],所以可以通过as方法将DataFrame转换为Dataset。Row是一个通用的类型,所有的表结构信息都用Row来表示。
- DataSet是强类型的,可以有Dataset[Car],Dataset[Person]等。
DataFrame、DataSet、RDD表现形式的区别
典型案例-WordCount
WordCount
Spark体系架构
Spark SQL概述
- SparkSQL是Spark中用于结构化数据处理的模块。在Spark应用中,可以无缝的使用sQL语句亦或是DataFrameAPI对结构化数据进行查询。
Spark SQL vs Hive
- 区别:
- Spark SQL的执行引l擎为Spark Core,Hive默认执行引擎为MapReduce。
- Spark SQL的执行速度是Hive的10-100倍。
- Spark SQL不支持buckets,Hive支持。
- 联系:
- Spark SQL依赖Hive的元数据。
- SparkSQL兼容绝大部分Hive的语法和函数。
- Spark SQL可以使用Hive的自定义函数。
Structured Streaming概述
- StructuredStreaming是构建在SparkSQL引I擎上的流式数据处理引|擎。可以像使用静态RDD数据那样编写流式计算过程。当流数据连续不断的产生时,SparkSQL将会增量的、持续不断的处理这些数据,并将结果更新到结果集中。
Structured Streaming计算模型示例
Spark Streaming概述
- SparkStreaming的基本原理是将实时输入数据流以时间片(秒级)为单位进行拆分,然后经Spark引|擎以类似批处理的方式处理每个时间片数据。
窗口间隔和滑动间隔
Spark Streaming vs Storm
思考
- Spark的特点有哪些?
- Spark相对于MR的优势是什么?
- Spark宽依赖窄依赖的区别是什么?
- Spark的应用场景有哪些?