离线批处理之Spark
Spark简介
Spark是基于内存的分布式批处理系统,它把任务拆分,然后分配到多个的CPU上进行处理,处理数据时产生的中间产物(计算结果)存放在内存中,减少了对磁盘的I/O操作,大大的提升了数据的处理速度,在数据处理和数据挖掘方面比较占优势。
Spark应用场景
- 数据处理(Data Processing):可以用来快速处理数据,兼具容错性和可扩展性。
- 迭代计算(Iterative Computation):支持迭代计算,有效应对复杂的数据处理逻辑。
- 数据挖掘(Data Mining):在海量数据基础上进行复杂的挖掘分析,可支持多种数据挖掘和机器学习算法。
- 流式处理(Streaming Processing):支持秒级延迟的流处理,可支持多种外部数据源。
- 查询分析(Query Analysis):支持SQL的查询分析,同时提供领域特定语言(DSL)以方便操作结构化数据,并支持多种外部数据源。
Spark对比MapReduce
- 性能上提升了100倍。
- Spark的中间数据放在内存中,对于迭代运算的效率更高;进行批处理时更高效,同时有着更低的延迟。
- Spark提供更多的数据集操作类型,编程模型比MapReduce更灵活,开发效率更高。
- 更高的容错能力(血统机制)。
RDD
RDD是分布式弹性数据集,可以理解一个存储数据的数据结构。Spark会把所要操作的数据,加载到RDD上,即RDD所有操作都是基于RDD来进行的。RDD是只读和可分区。要想对RDD进行操作,只能重新生成一个新的RDD。
- 从HDFS输入创建,或从与Hadoop兼容的其他存储系统中输入创建。
- 从父的RDD转换的到新的RDD。
- 从数据集合转换而来,通过编码实现。
RDD的存储:
- 用户可以选择不同的存储级别缓存RDD以便重用。
- 当前RDD默认是存储于内存,但当内存不足时,RDD会溢出到磁盘中。
Shuffle
Shuffle 是划分 DAG 中 stage 的标识,同时影响 Spark 执行速度的关键步骤
- RDD 的 Transformation 函数中,分为窄依赖(narrow dependency)和宽依赖(wide dependency)的操作.
- 窄依赖跟宽依赖的区别是是否发生Shuffle(洗牌) 操作。
窄依赖
窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用。 表现为: 一个父RDD的每一个分区对应于一个子RDD分区。
宽依赖
宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用。 表现为: 父RDD的每个分区都被多个子RDD分区使用
Transformation
Transformation是RDD的算子类型,它的返回值还是一个RDD。
Transformation操作属于懒操作(算子),不会真正触发RDD的处理计算。
变换方法的共同点:
- 不会马上触发计算。
- 每当调用一次变换方法,都会产生一个新的RDD。
例如:map(func),flatMap(func)
Action
Action是RDD的算子,它的返回值不是一个RDD。Action操作是返回结果或者将结果写入存储的操作。Action是Spark应用启动执行的触发动作,得到RDD的相关计算结果或将RDD保存到文件系统中。
SparkConf
SparkConf是用来对Spark进行任务参数配置的对象。 是通过键值对的形式,设置Spark任务执行时所需要的参数。 Spark读取任务参数的优先级是: 代码配置>动态参数>配置文件。
SparkContext
SparkContext是Spark的入口,相当于应用程序的main函数。
SparkContext表示与Spark集群的连接,可用于在该集群上创建RDD,记录计算结果和环境配置等信息。
SparkSession
Spark2.0中引入了SparkSession的概念,为用户提供了一个统一的切入点来使用Spark的各项功能。
封装了SparkConf和SparkContext对象,方便用户使用Spark的各种API。
SparkSQL简介
SparkSQL是Spark用来处理结构化数据的一个模块,可以在Spark应用中直接使用SQL语句对数据进行操作。
SQL语句通过SparkSQL模块解析为RDD执行计划,交给SparkCore执行。
通过SparkSession提交SQL语句。任务像普通Spark应用一样,提交到集群中分布式运行。
JDBC:
- 应用加载JDBC驱动,然后统一提交到集群的JDBCServer执行。
- JDBCServer是单点服务,会成为任务执行的瓶颈,不能处理海量数据和高并发任务。
DataSet:
- DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象
- DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sort、filter、shuffle等操作。
- Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计
SparkSQL使用场景
适合: 结构化数据处理。 对数据处理的实时性要求不高的场景 需要处理PB级的大容量数据。
不适合: 实时数据查询。