🚀 作者 :“大数据小禅” 🚀文章简介:本篇文章属于Spark系列文章,专栏将会记录从spark基础到进阶的内容,,内容涉及到Spark的入门集群搭建,核心组件,RDD,算子的使用,底层原理,SparkCore,SparkSQL,SparkStreaming等,Spark专栏地址.欢迎小伙伴们订阅💪
RDD(Resilient Distributed Datasets),弹性分布式数据集, 是分布式内存的一个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建。
1.RDD是一个编程模型
2.RDD是混合型变成模型,可以支持迭代计算,关系查询,MapReduce,流计算 3.RDD是只读的 4.RDD之间有依赖关系,根据执行操作符的不同,依赖关系可以分成宽依赖和窄依赖,如果RDD的每个分区最多只能被一个子RDD的一个分区使用,则 称之为窄依赖。若被多个子RDD的分区依赖,则称之为宽依赖。例如Map操作产生窄依赖,而join操作则产生宽依赖
在IDEA中编码按住Alt+Enter可以显示变量的类型,这里可以看到RDD在哪
分布式
RDD 支持分区, 可以运行在集群中
弹性
数据集
Spark的入口SparkContext SparkContext是spark-core的入口组件,作为Spark程序的入口,在Spark0.x版本就存在了,是一个元老级API。主要作用是链接集群,创建RDD,累加器,广播变量等
val conf = new SparkConf().setMaster("local[6]").setAppName("rdd")
val sc = new SparkContext(conf)
RDD的创建方式主要有三种
代码演示:
//从本地集合创建
def rddLocal(): Unit ={
val seq=Seq(1,2,3,4)
//2是指定的分区数,两个创建集合的区别就是parallelize可以不指定分区数
val rdd1=sc.parallelize(seq,2)
sc.parallelize(seq)
val rdd2=sc.makeRDD(seq,2)
rdd2.foreach(println(_))
}
//从文件创建
def rddnFiles(): Unit ={
val value = sc.textFile("file:\\\")
//从RDD衍生
def rddAddRDD(): Unit ={
val rdd1=sc.parallelize(Seq(1,2,3))
//通过在rdd上执行算子操作,会生成新的rdd
//原地计算
//str.substr 返回新的字符串,非原地计算
//RDD不可变
val rdd2=rdd1.map(item=>item)
}
在RDD出现之前,MapReduce 是比较主流的,但是MapReduce任务没有基于内存的数据共享方式,每一次都需要通过磁盘来进行数据共享,这种方式明显是比较低效的。 MapReduce 是如何执行迭代任务的?
RDD如何解决迭代计算低效的问题?
在spark中 整个计算过程是共享内存的,不需要把中间计算出来的结果先存放到文件系统。这种方式就显得更加的灵活,也拥有更快的执行速度。
RDD是只读的,不允许被修改。为什么要设计成是只读的?
RDD的容错方式