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