一、RDD检查点
(一)RDD检查点机制
(三)RDD检查点案例演示
- 在
net.huawei.rdd
包里创建CheckpointDemo
对象
package net.huawei.rdd
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object CheckpointDemo {
def main(args: Array[String]): Unit = {
// 设置系统属性(本地运行必须设置,否则无权访问HDFS)
System.setProperty("HADOOP_USER_NAME", "root")
// 创建SparkConf对象
val conf = new SparkConf()
// 设置应用程序名称,可在Spark WebUI里显示
conf.setAppName("Spark-CheckpointDemo")
// 设置集群Master节点访问地址
conf.setMaster("local[2]")
// 设置测试内存
conf.set("spark.testing.memory", "2147480000")
// 基于SparkConf对象创建SparkContext对象,该对象是提交Spark应用程序的入口
val sc = new SparkContext(conf)
// 设置检查点数据存储路径
sc.setCheckpointDir("hdfs://master:9000/spark-ck")
// 创建模拟数据RDD
val rdd: RDD[Int] = sc.parallelize(List(1, 1, 2, 3, 5, 8, 13))
// 过滤结果
val resultRDD = rdd.filter(_ >= 5)
// 持久化RDD到内存中
resultRDD.cache()
// 将resultRDD标记为检查点
resultRDD.checkpoint()
// 第一次行动算子计算时,将把标记为检查点的RDD数据存储到文件系统指定路径中
val result: String = resultRDD.collect().mkString(", ")
println(result)
// 第二次行动算子计算时,将直接从文件系统读取resultRDD数据,而不需要从头计算
val count = resultRDD.count()
println(count)
// 停止Spark容器
sc.stop()
}
}
创建检查点保存数据的目录
运行程序,在控制台查看结果
查看HDFS检查点目录,执行命令:hdfs dfs -ls -R /spark-ck
1、默认情况下变量的传递
- map()算子传入的函数中使用外部变量arr
scala> val arr = Array(1, 2, 3, 4, 5)
scala> val lines = sc.textFile("data.txt")
scala> val result = lines.map((_, arr))
scala> result.collect()
2、使用广播变量时变量的传递
- 广播变量其实是对普通变量的封装,在分布式函数中可以通过Broadcast对象的
value
方法访问广播变量的值
使用广播变量将数组arr传递给map()算子
scala> val arr = Array(1, 2, 3, 4, 5)
scala> val broadcastVar = sc.broadcast(arr)
scala> val lines = sc.textFile("data.txt")
scala> val result = lines.map((_, broadcastVar))
scala> result.collect()
输出result的数据
(二)累加器
1、累加器功能
- 累加器提供了将Worker节点的值聚合到Driver的功能,可以用于实现计数和求和。
2、不使用累加器
- 对一个整型数组求和
- 上述代码由于
sum
变量在Driver
中定义,而累加操作sum = sum + x
会发送到Executor
中执行,因此输出结果不正确。
3、使用累加器
- 对一个整型数组求和
scala> val myacc = sc.longAccumulator("My Accumulator") // 声明累加器
scala> val rdd = sc.makeRDD(Array(1, 2, 3, 4, 5))
scala> rdd.foreach(x => myacc.add(x)) // 向累加器添加值
scala> println("sum = " + myacc.value) // 在Driver端输出结果