基于内存的,用于大规模数据处理(离线计算、实时计算、快速查询(交互式查询))的统一分析引擎。
1.local本地模式(单机)–开发测试使用
2.standalone独立集群模式–开发测试使用
3.standalone-HA高可用模式–生产环境使用
4.on yarn集群模式–生产环境使用
5.on cloud集群模式–中小公司未来会更多的使用云服务
1、创建一个 Sparkconf对象,设置app名称
2、创建一个SparkContext,设置日志级别
3、读取数据,对数据进行计算
4、保存数据
弹性分布式数据集(数据存储在内存),一个不可变、可分区、里面的元素可并行计算的集合
1、数据集的基本组成单位是一组分片(Partition)或一个分区(Partition)列表
每个分片都会被一个计算任务处理,分片数决定并行度。
2、一个函数会被作用在每一个分区。
3、一个RDD会依赖于其他多个RDD,RDD的每次转换都会生成一个新的RDD
1.Transformation转换操作:返回一个新的RDD
2.Action动作操作:返回值不是RDD
惰性计算,遇到Transformation不计算,遇到Action在真正计算。
1、对多次使用的rdd进行缓存,缓存到内存,当后续频繁使用时直接在内存中读取缓存的数据,不需要重新计算。 (Persist、Cache)
2、将RDD结果写入硬盘(容错机制),当RDD丢失数据时,或依赖的RDD丢失数据时,可以使用持久化到硬盘的数据恢复。(MEMORY_ONLY(默认)、MEMORY_AND_DISK、DISK_ONLY)
SparkContext.setCheckpointDir(“目录”) //HDFS的目录
RDD.checkpoint()
窄依赖:父RDD的一个分区只会被子RDD的一个分区依赖
宽依赖:父RDD的一个分区会被子RDD的多个分区依赖(涉及到shuffle)
DAG:指的是数据转换执行的过程,有方向,无闭环(其实就是RDD执行的流程)
开始:通过SparkContext创建的RDD
结束:触发Action,一旦触发Action就形成了一个完整的DAG
1.Application:指的是用户编写的Spark应用程序/代码,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。
2.Driver:Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等
3.Cluster Manager:指的是在集群上获取资源的外部服务,Standalone模式下由Master负责,Yarn模式下ResourceManager负责;
4.Executor:是运行在工作节点Worker上的进程,负责运行任务,并为应用程序存储数据,是执行分区计算任务的进程;
5.RDD:Resilient Distributed Dataset弹性分布式数据集,是分布式内存的一个抽象概念;
6.DAG:Directed Acyclic Graph有向无环图,反映RDD之间的依赖关系和执行流程;
7.Job:作业,按照DAG执行就是一个作业;Job==DAG
8.Stage:阶段,是作业的基本调度单位,同一个Stage中的Task可以并行执行,多个Task组成TaskSet任务集
9.Task:任务,运行在Executor上的工作单元,一个Task计算一个分区,包括pipline上的一系列操作
1.Spark应用被提交–>SparkContext向资源管理器注册并申请资源 (??) -->启动Executor
2.RDD–>构建DAG–>DAGScheduler划分Stage形成TaskSet–>TaskScheduler提交Task–>Worker上的Executor执行Task
累加器accumulators:累加器支持在所有不同节点之间进行累加计算
在每个机器上缓存一份、不可变的、只读的、相同的变量,该节点每个任务都能访问。起到节省资源的作用,和优化的所用。
用于处理结构化数据的Spark模块。
DataFrame和DataSet
Hive是将sql转化成MapReduce进行计算(降低学习成本、提高开发效率)
SparkSQL是将sql转化成rdd集进行计算(降低学习成本、提高开发效率)
DataFrame是以RDD为基础的带有Schema元信息的分布式数据集。
含有类型信息的DataFrame就是DataSet
(DataSaet=DataFrame+类型= Schema+RDD*n+类型)
1、类似方法调用,领域特定语言(DSL)。
personDF.select( " i d " , "id", "id",“name”, " a g e " + 1 ) . f i l t e r ( "age"+1).filter( "age"+1).filter(“age”>25).show
2、SQL语句
spark.sql(“select * from personDFT where age >25”).show
第1种:指定列名添加Schema
第2种:通过StructType指定Schema
第3种:编写样例类,利用反射机制推断Schema
1 创建sparksession
2 创建sc
3 读取数据并加工
4 设置表结构 ttRDD.toDF(“id”,“name”,“age”)
5 注册成表并查询
6 关闭sc sparksession
1 创建sparksession
2 创建sc
3 读取数据并加工
4 设置表结构
types.StructType(
// 字段类型 (字段名,字段类型,是否为空)
List(StructField("id",IntegerType,true)
)
)
5 创建DS DF
val ttDF: DataFrame = spark.createDataFrame(RowRDD,structTable)
6 注册成表并查询
7 关闭sc sparksession
准备样例类
1 创建sparksession
2 创建sc
3 读取数据并加工
val PersonRDD: RDD[Person] = ttRDD.map(z=>Person(z(0).toInt,z(1),z(2).toInt))
4 RDD转DF
val personDF: DataFrame = PersonRDD.toDF()
5 注册成表并查询
6 关闭sc sparksession
转换成RDD .rdd
转换成DF .toDF()
转换成DS
RDD->DS .toDS()
DF->DS .as[Person]
spark.udf.register("toUpperAdd123",(str:String)=>{
//根据业务逻辑对数据进行处理
//str.toUpperCase()+ " 123"
//str.length*10
str.length*10/2/2.toDouble
})
既显示聚集前/排序前的原始的数据,又显示聚集后/排序后的名次 的数据。
1、聚和开窗函数
聚合函数(列) OVER(选项),这里的选项可以是PARTITION BY 子句
2、排序聚和函数
排序函数(列) OVER(选项),这里的选项可以是ORDER BY 子句,也可以是 OVER(PARTITION BY 子句 ORDER BY 子句)
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+结构
1 创建sparkConf
2 创建一个sparkcontext
3 创建streamingcontext
4 接收数据并根据业务逻辑进行计算
5 开启计算任务
6 等待关闭
Structured Streaming是一个基于Spark SQL引擎的可扩展、容错的流处理引擎
是一个不断增长的动态表格,新数据被持续不断地添加到表格的末尾
对动态数据源进行实时查询,就是对当前的表格内容执行一次 SQL 查询。
将数据源映射为类似于关系数据库中的表,(SparkSQL中的DF/DS)
然后将经过计算得到的结果映射为另一张表.