一、RDD介绍
RDD(Resilient Distrobuted Dataset)是spark最基本的数据结构,是分布再集群各个不同节点的不可变的数据集合。
RDD 是spark处理过程中数据的逻辑表示
RDD在spark应用的不同阶段的数据结构表示
Resilient
弹性的,可以通过RDD Lineage图(DAG)进行重新计算,具有很好的容错性
DAG在spark 程序中如何工作:
(1)编译器编译好程序代码
(2)Spark创建由各个RDD组成的操作算子图,形成DAG
(3)当有Action算子触发Spark的计算后,Spark将形成DAG图,提交到Spark的DAG Scheduler上。
(4)DAG Scheduler会将DAG的图划分不同的stage
(5)不同Satge的Task会被提交到Task Scheduler上面进行Task的计算
Distributed
数据分布在不同的节点之上
DataSet
代表了spark应用处理的数据
容错性(当某些task失败后,数据和task可以自动恢复)
RDD将处理的数据进行分区划分
每一个Task都将处理每个分区的数据
RDD可以根据DAG中的依赖关系生成
当某个RDD中的每个分区的数据丢失活着任务失败,该RDD的该分区的数据可以依据DAG的依赖关系重新生成
当集群上的某个节点出现故障后,该集群上的RDD和Task都可以重新根据DAG进行恢复
二、RDD操作算子
操作算子类型:Transformations和Actions
Transformation是RDD的一个操作,可以从现有的RDD中生成新的RDD
Input(RDD)->output(RDD)
Action是RDD的触发操作,当一个Spark程序中出现Action的算子的时候,Spark程序才会被触发。Action的结果一般是形成一个非RDD的结果。
(1)Transformation
是lazy操作算子,不会执行,只有Action算子存在的时候才会执行
1)Narrow Transoformation
所需要计算的新的partition的数据来源都来自父RDD的单一的partition,无需shuffling
2)Wide Transformation
所需要计算新的partition的数据来源都来自父RDD的多个partition,一般需要shuffling
(2)Transformation Example
map():对每一个输入值进行指定的操作,然后为每一条输入值返回一个结果
flatmap():对每个输入值进行指定的操作,每一条输入值都有一个结果,然后扁平化,最后返回一个对象
filter():数据过滤
union():数据叠加,淡出加数据(与join不同)
intersection():找出有交集的RDD
ditinct():去除重合的数据 (val example=rdd1.distinct())
groupkey()、sortByKey()都是根据key排序
reduceByKey(+)返回根据key进行加法。排序进行统计有可能触发action(触发count).
join():数据横向操作
coalesce() & repartition():改变RDD数据分区,前者没有shuffling,后者有repartition()有shuffling()
(3)Action Example
count():总数
collect():把数据都数据到driver
take():取数据
top():取前面是数据
coutByVaule():对每一数进行计数
reduce():求和
aggregate():聚合
foreach():执行相同的操作
saveAsTextFile():把RDD存为txt
三、RDD Lineage及要点
RDD Lineage是一个可以表示Spark程序中RDD之间依赖关系的图
RDD是可以利用Transformation操作从其他一个或者多个RDD创建形成的
Spark利用DAG来管理程序的执行计数
DAG表示了Spark程序中RDD的各种操作计划
(1)RDD持久化存储和缓存(cache()&persist())
对于interactive(交互式)的操作比较有用(机器学习)
cache()是MEMORY_ONLY
presist()有以下几个选择:
MEMORY_ONLY
MEMORY_AND_DISK
MEMORY_ONLY_SER(序列化java对象,对象保存为字节数组流)
MEMORY_AND_DISK_SER(序列化java对象,对象保存为字节数组流)
DISK_ONLY