checkpoint

package com.shujia.core

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

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

    val sc: SparkContext = new SparkContext(conf)

    //设置checkpoint的目录
    sc.setCheckpointDir("Spark/data/checkpoint")

    val stuRDD: RDD[String] = sc
      .textFile("Spark/data/students.txt")

    val mapStuRDD: RDD[String] = stuRDD
      .map(line => {
        println("=====读取了Student数据=====")
        line
      })

    //对多次使用的RDD进行cache 默认会将其缓存到内存中
   mapStuRDD.cache()

    //如果想要使用其他的缓存策略 需要适用persist()方法
    //mapStuRDD.persist(StorageLevel.MEMORY_ONLY)
    //mapStuRDD.persist(StorageLevel.MEMORY_AND_DISK_SER)

    /**checkpoint并不能缓存数据 需要额外一个task从头开始计算
     * 并将数据写入外部系统(一般是hdfs)
     * 在使用之前需要指定一个目录
     * 一般用于实时计算任务 按照一定的时间策略保存 某一时刻该计算任务的状态
     * 用于容错
     * 在checkpoint之前 可以使用cache提高效率
     */
    mapStuRDD.checkpoint()

    //统计班级人数
    val clazzRDD: RDD[(String, Int)] = mapStuRDD
      .map(line => (line.split(",")(4), 1))

    val clazzCntRDD: RDD[(String, Int)] = clazzRDD
      .reduceByKey(_ + _)

    //打印
    clazzCntRDD.foreach(println)

    //统计性别人数
    val genderRDD: RDD[(String, Int)] = mapStuRDD
      .map(line => (line.split(",")(3), 1))

    val genderCntRDD: RDD[(String, Int)] = genderRDD
      .reduceByKey(_ + _)

    //打印
    genderCntRDD.foreach(println)

    //使用完了记得释放缓存的RDD
  mapStuRDD.unpersist()

    while(true){

    }
  }
}

package com.shujia.core

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

object Demo22Acc {
  def main(args: Array[String]): Unit = {
    //累加器
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo22Acc")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    //通过List构建RDD
    val intRDD: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5))

    var localVal:Int=1

    intRDD
      .map(i=>{
        println(s"原来的值:$localVal")
        localVal += 1
        println(s"现在的值:$localVal")
        i*i
      }).foreach(println)
  }
}

原来的值:1
现在的值:2
1
原来的值:2
现在的值:3
4
原来的值:3
现在的值:4
9
原来的值:4
现在的值:5
16
原来的值:5
现在的值:6
25 

package com.shujia.core

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

object Demo22Acc {
  def main(args: Array[String]): Unit = {
    //累加器
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo22Acc")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    //通过List构建RDD
    val intRDD: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5),2)

    var localVal:Int=1

    intRDD
      .map(i=>{
        println(s"原来的值:$localVal")
        localVal += 1
        println(s"现在的值:$localVal")
        i*i
      }).foreach(println)
  }
}

原来的值:1
现在的值:2
1
原来的值:2
现在的值:3
4

原来的值:1
现在的值:2
9
原来的值:2
现在的值:3
16
原来的值:3
现在的值:4
25

package com.shujia.core

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

object Demo22Acc {
  def main(args: Array[String]): Unit = {
    //累加器
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo22Acc")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    //通过List构建RDD
    val intRDD: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5),2)

    var localVal:Int=1

    /**
     * 在算子内部对算子外部的变量进行累加
     */
    intRDD
      .map(i=>{
        /**算子内部的代码会以Task的形式发送到Executor执行
         * 如果在算子内部使用了算子外部的变量localVal
         * 则算子外部的变量localVal会以副本的形式发送到每个Executor执行
         */
        println(s"原来的值:$localVal")
        localVal += 1
        println(s"现在的值:$localVal")
        i*i
      }).foreach(println)

    /**
     * 算子内部的代码在Driver端执行的
     * 所以如果在算子内部对算子外部的变量localVal进行修改是不会生效的
     */
    println(s"localVal的值为:$localVal")

  }
}

 原来的值:1
现在的值:2
1
原来的值:2
现在的值:3
4

原来的值:1
现在的值:2
9
原来的值:2
现在的值:3
16
原来的值:3
现在的值:4
25

localVal的值为:1

package com.shujia.core

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

object Demo22Acc {
  def main(args: Array[String]): Unit = {
    //累加器
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo22Acc")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    //通过List构建RDD
    val intRDD: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5),2)

    var localVal:Int=1

    /**
     * 在算子内部对算子外部的变量进行累加
     */
    intRDD
      .map(i=>{
        /**算子内部的代码会以Task的形式发送到Executor执行
         * 如果在算子内部使用了算子外部的变量localVal
         * 则算子外部的变量localVal会以副本的形式发送到每个Executor执行
         */
        println(s"原来的值:$localVal")
        localVal += 1
        println(s"现在的值:$localVal")
        i*i
      }).foreach(println)

    /**
     * 算子内部的代码在Driver端执行的
     * 所以如果在算子内部对算子外部的变量localVal进行修改是不会生效的
     */
    println(s"localVal的值为:$localVal")

    ///使用累加器
    //在算子外部(Driver端)定义
    val longAcc: LongAccumulator = sc.longAccumulator("longAcc")
    intRDD
      .map(i=>{
        //在算子内部使用累加器
        println(s"longAcc原来的值:${longAcc.value}")
        longAcc.add(1)
        println(s"longAcc现在的值:${longAcc.value}")
        i*i
      }).foreach(println)

    //在算子外部(Driver)获取最终的结果
    println(s"longAcc的值为:${longAcc.value}")
  }
}

 

原来的值:1
现在的值:2
1
原来的值:2
现在的值:3
4

原来的值:1
现在的值:2
9
原来的值:2
现在的值:3
16
原来的值:3
现在的值:4
25


localVal的值为:1


longAcc原来的值:0
longAcc现在的值:1
1
longAcc原来的值:1
longAcc现在的值:2
4


longAcc原来的值:0
longAcc现在的值:1
9
longAcc原来的值:1
longAcc现在的值:2
16
longAcc原来的值:2
longAcc现在的值:3
25


longAcc的值为:5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值