Saprk Core (一)

 

 RDD的stage划分时依据宽窄依赖划分的,窄依赖是一对一,相当于独生子女,宽依赖是一对多,相当于多个子女,宽依赖时会划分到不同stage中去,一直递归的寻找父RDD

RDD相关的持久化和缓存是Spark最重要的特征之一,缓存是Spark构建迭代式算法和快速交互式查询的关键。RDD通过persist方法或者cache方法将前面的计算结果缓存,只有在后面触发action时会被缓存在计算节点的内存中,并供后面重用

其中不同参数可以指定不同的存储机制,MEMORY_AND_DISK先存储到内存,满了以后会被存储到硬盘中, 堆外内存,不受JVM管控(GC垃圾回收机制),丢失的数据会被重算

checkpoint机制,检查点(本质上是通过将RDD写入Disk做检查点),是为了通过Lineage做容错的辅助,相当于在中间阶段做检查点容错。实现RDD的检查点功能,写入HDFS实现副本机制,类似于快照,将结果存储到高可用的地方,同样利用action算子触发检查点。

RDD只支持粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列Lineade记录下来,以便恢复丢失的分区。RDD的Lineage(血统)会记录RDD的元数据信息和转化行为,当该RDD的部分分区数据丢失时,它会根据这些信息来重新计算和恢复丢失的数据分区。

 

1、创建RDD的两种方式:

1、创建sparkcontext对象-->通过创建makeRDD创建;    通过parallelize()创建RDD

2、通过外部获取数据并创建RDD:

val rdd = sc.textFile(path=" 本地路径/HDFS路径+"),读取外部数据

 

2、RDD编程API

RDD支持两种操作,转化操作和行动操作,RDD的转化操作是返回一个新的RDD的操作,比如map()和filter(),而行动操作是向驱动器程序返回结果或者把结果写入外部系统的操作,比如count()和first()

Spark采用惰性计算式,RDD只有第一次在一个行动操作中用到时,才会真正计算,Spark可以优化整个计算过程,默认情况下,Spark的RDD会在你每次对她们进行操作时重新计算,如果想在多个行动中重用一个RDD,可以使用RDD.persist()让Spark把这个RDD缓

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf,SparkContext}

object TransformationDemo{
def main(args: Array[String]): Unit={
    val conf = new SparkConf().setAppName("TransformationDemo").setMaster("local")
    val sc = new SparkContext(conf)

    val rdd = sc.parallelize(List(1,2,3,4,5,6))
    val rdd2: RDD[Int] = rdd.map(_ *2)
    println(rdd2.collect().toBuffer)  
//同时有transformation和action算子才能实现输出

//filter过滤 通过对RDD的计算 ,判断结果为true时,会将结果存入新的RDD

    val rdd3:RDD[Int] = rdd2.filter(_ >10)
    println(rdd3.collect().toBuffer)


//flatMap是对RDD中的数据进行压平处理
    val rdd4 = sc.parallelize(Array("a b c","b c d"))
    val rdd5: RDD[String] = rdd4.flatMap(_.split(reqex=" "))
    println(rdd5.collect().to BUffer)

}

}

存下来

 Transformation算子:

Action算子:

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读