基于内存的,用于大规模数据处理(离线计算、实时计算、快速查询(交互式查询))的统一分析引擎。
快: Spark计算速度是MapReduce计算速度的10-100倍
易用:(算法多)MR支持1种计算模型,Spsark支持更多的计算模型。
通用: Spark 能够进行离线计算、交互式查询(快速查询)、实时计算、机器学习、图计算等
兼容性: Spark支持大数据中的Yarn调度,支持mesos。可以处理hadoop计算的数据。
弹性分布式数据集(数据存储在内存),一个不可变、可分区、里面的元素可并行计算的集合
对多次使用的rdd进行缓存,缓存到内存,当后续频繁使用时直接在内存中读取缓存的数据,不需要重新计算。 (Persist、Cache)
将RDD结果写入硬盘(容错机制),当RDD丢失数据时,或依赖的RDD丢失数据时,可以使用持久化到硬盘的数据恢复。(MEMORY_ONLY(默认)、MEMORY_AND_DISK、DISK_ONLY)
SparkContext.setCheckpointDir(“目录”) //HDFS的目录 RDD.checkpoint()
位置:Persist 和 Cache将数据保存在内存;Checkpoint将数据保存在HDFS。
生命周期:Persist 和 Cache 程序结束后会被清除或手动调用unpersist方法;Checkpoint永久存储不会被删除。
RDD依赖关系(血统Lineage):Persist和Cache,不会丢掉RDD间的依赖链/依赖关系;Checkpoint会斩断依赖链。
窄依赖: 父RDD的一个分区只会被子RDD的一个分区依赖
宽依赖: 父RDD的一个分区会被子RDD的多个分区依赖(涉及到shuffle)
DAG: 指的是数据转换执行的过程,有方向,无闭环(其实就是RDD执行的流程)
开始: 通过SparkContext创建的RDD
结束: 触发Action,一旦触发Action就形成了一个完整的DAG
说明:
一个Spark应用中可以有一到多个DAG,取决于触发了多少次Action
一个DAG中会有不同的阶段/stage,划分阶段/stage的依据就是宽依赖
一个阶段/stage中可以有多个Task,一个分区对应一个Task
1.Spark应用被提交–>SparkContext向资源管理器注册并申请资源 (??) -->启动Executor
2.RDD–>构建DAG–>DAGScheduler划分Stage形成TaskSet–>TaskScheduler提交Task–>Worker上的Executor执行Task
累加器accumulators: 累加器支持在所有不同节点之间进行累加计算
在每个机器上缓存一份、不可变的、只读的、相同的变量,该节点每个任务都能访问。起到节省资源的作用,和优化的所用。
用于处理结构化数据的Spark模块。
DataFrame和DataSet
DataFrame是以RDD为基础的带有Schema元信息的分布式数据集。
含有类型信息的DataFrame就是DataSet
(DataSaet=DataFrame+类型= Schema+RDD*n+类型)
第1种: 指定列名添加Schema
第2种: 通过StructType指定Schema
第3种: 编写样例类,利用反射机制推断Schema
创建SparkSession
创建SparkContext
读取数据并加工
设置表结构
types.StructType(
// 字段类型 (字段名,字段类型,是否为空)
List(StructField("id",IntegerType,true)
)
)
创建DS DF
val ttDF: DataFrame = spark.createDataFrame(RowRDD,structTable)
注册成表并查询
关闭SparkContext 、SparkSession
准备样例类
创建Sparkession
创建SparkContext
读取数据并加工
val PersonRDD: RDD[Person] = ttRDD.map(z=>Person(z(0).toInt,z(1),z(2).toInt))
RDD转DF
val personDF: DataFrame = PersonRDD.toDF()
注册成表并查询
关闭SparkContext 、SparkSession
spark.udf.register("toUpperAdd123",(str:String)=>{
//根据业务逻辑对数据进行处理
//str.toUpperCase()+ " 123"
//str.length*10
str.length*10/2/2.toDouble
})
既显示聚集前/排序前的原始的数据,又显示聚集后/排序后的名次的数据。
select name, class, score, count(name) over() name_count from scores
select name, class, score, count(name) over(PARTITION BY class) name_count from scores
select name, class, score, row_number() over(order by score) rank from scores
select name, class, score, row_number() over(partition by class order by score) rank from scores
select name, class, score, rank() over(order by score) rank from scores
select name, class, score, rank() over(partition by class order by score) rank from scores
select name, class, score, dense_rank() over(order by score) rank from scores
select name, class, score, ntile(6) over(order by score) rank from scores
Spark Streaming是一个基于Spark Core之上的实时计算框架
代表持续性的输入的数据流和经过各种Spark算子操作后的输出的结果数据流。
本质上就是按照时间间隔划分成一批一批的连续的RDD
DStream=RDD1(t1)+ RDD2(t2)+ RDD3(t3)+ RDD4(t4)+….
DataSet = DataFrame+类型 = RDD+结构+类型
DataFrame = RDD+结构
Structured Streaming是一个基于Spark SQL引擎的可扩展、容错的流处理引擎
是一个不断增长的动态表格,新数据被持续不断地添加到表格的末尾
对动态数据源进行实时查询,就是对当前的表格内容执行一次 SQL 查询。
将数据源映射为类似于关系数据库中的表,(SparkSQL中的DF/DS)
然后将经过计算得到的结果映射为另一张表.