Transformations 类算子是一类算子(函数)叫做转换算子,如map,flatMap,reduceByKey 等。Transformations 算子是延迟执行,也叫懒加载执行。
filter |
Action 类算子也是一类算子(函数)叫做行动算子,如foreach,collect,count 等。Transformations 类算子是延迟执行,Action 类算子是触发执行。一个 application 应用程序中有几个Action 类算子执行,就有几个 job 运行。
count 返回数据集中的元素数。会在结果计算完成后回收到 Driver 端。 返回一个包含数据集前 n 个元素的集合。 first=take(1),返回数据集中的第一个元素。 循环遍历数据集中的每个元素,运行相应的逻辑。 将计算结果回收到 Driver 端。 |
a、概念:
控制算子有三种,cache,persist,checkpoint,以上算子都可以将 RDD
持久化,持久化的单位是 partition。cache 和 persist 都是懒执行的。
必须有一个 action 类算子触发执行。checkpoint 算子不仅能将 RDD
持久化到磁盘,还能切断 RDD 之间的依赖关系。
b、cache
默认将 RDD 的数据持久化到内存中。cache 是懒执行。
注意:chche () =
persist()=persist(StorageLevel.Memory_Only)
测试 cache 代码:
SparkConf conf = new SparkConf();
conf.setMaster("local").setAppName("CacheTest");
JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD lines = jsc.textFile("persistData.txt");
lines = lines.cache();
long startTime = System.currentTimeMillis();
long count = lines.count();
long endTime = System.currentTimeMillis();
System.out.println("共"+count+ "条数据,"+"初始化时间+cache时间+计算时间="+(endTime-startTime));
long countStartTime = System.currentTimeMillis();
long countrResult = lines.count();
long countEndTime = System.currentTimeMillis();
System.out.println("共"+countrResult+ "条数据,"+"计算时间="+(countEndTime-countStartTime));
jsc.stop();
c、 persist:
可以指定持久化的级别。最常用的是 MEMORY_ONLY 和MEMORY_AND_DISK。”_2”表示有副本数。
持久化级别如下:
1. cache 和 persist 都是懒执行,必须有一个 action 类算子触发执行。
2. cache 和 persist 算子的返回值可以赋值给一个变量,在其他 job 中直接使用这个变量就是使用持久化的数据了。持久化的单位是partition。
3. cache 和 persist 算子后不能立即紧跟 action 算子。
4. cache 和 persist 算子持久化的数据当 applilcation 执行完成之后会被清除。
错误:rdd.cache().count() 返回的不是持久化的 RDD,而是一个数值了。
checkpoint 将 RDD 持久化到磁盘,还可以切断 RDD 之间的依赖关系。checkpoint 目录数据当 application 执行完之后不会被清除。
a、persist(StorageLevel.DISK_ONLY)与 Checkpoint 的区别?
1) checkpoint 需要指定额外的目录存储数据,checkpoint 数据是由外部的存储系统管理,不是 Spark 框架管理,当 application完成之后,不会被清空。
2) cache() 和 persist() 持久化的数据是由 Spark 框架管理,当application 完成之后,会被清空。
3) checkpoint 多用于保存状态。
b、 checkpoint 的执行原理:
1. 当 RDD 的 job 执行完毕后,会从 finalRDD 从后往前回溯。
2. 当回溯到某一个 RDD 调用了 checkpoint 方法,会对当前的 RDD做一个标记。
3. Spark 框架会自动启动一个新的 job,重新计算这个 RDD 的数据,将数据持久化到 HDFS 上。
c、优化:对 RDD 执行 checkpoint 之前,最好对这个 RDD 先执行cache,这样新启动的 job 只需要将内存中的数据拷贝到 HDFS 上就可以,省去了重新计算这一步。
d、 使用:
SparkConf conf = new SparkConf();
conf.setMaster("local").setAppName("checkpoint");
JavaSparkContext sc = new JavaSparkContext(conf);
sc.setCheckpointDir("./checkpoint");
JavaRDD parallelize =
sc.parallelize(Arrays.asList(1,2,3));
parallelize.checkpoint();
parallelize.count();
sc.stop();
1). 创建 SparkConf 对象
a、可以设置 Application name。 b、可以设置运行模式 c、可以设置 Spark applicatiion 的资源需求。 |
2). 创建 SparkContext 对象
3). 基于 Spark 的上下文创建一个 RDD,对 RDD 进行处理。
4). 应用程序中要有 Action 类算子来触发 Transformation 类算子执行。
5). 关闭 Spark 上下文对象 SparkContext。