Spark(三)【SparkCore】- Spark 转换算子、行动算子、持久化算子、代码流程

1. Transformations 转换算子

1.1 概念:

          Transformations 类算子是一类算子(函数)叫做转换算子,如map,flatMap,reduceByKey 等。Transformations 算子是延迟执行,也叫懒加载执行。

1.2 Transformation 类算子:

 filter
     过滤符合条件的记录数,true 保留,false 过滤掉。
 map
     将一个 RDD 中的每个数据项,通过 map 中的函数映射变为一个新的元素。
     特点:输入一条,输出一条数据。
 flatMap
     先 map 后 flat。与 map 类似,每个输入项可以映射为 0 到多个输出项。
 sample
     随机抽样算子,根据传进去的小数按比例进行又放回或者无放回的抽样。
 reduceByKey
     将相同的 Key 根据相应的逻辑进行处理。
sortByKey/sortBy
     作用在 K,V 格式的 RDD 上,对 key 进行升序或者降序排序。

2. Action 行动算子

2.1 概念:

Action 类算子也是一类算子(函数)叫做行动算子,如foreach,collect,count 等。Transformations 类算子是延迟执行,Action 类算子是触发执行。一个 application 应用程序中有几个Action 类算子执行,就有几个 job 运行。

2.2 Action 类算子

 count

返回数据集中的元素数。会在结果计算完成后回收到 Driver 端。
 take(n)

返回一个包含数据集前 n 个元素的集合。
 first

first=take(1),返回数据集中的第一个元素。
 foreach

循环遍历数据集中的每个元素,运行相应的逻辑。
 collect

将计算结果回收到 Driver 端。

 

3、持久化算子

3.1. 控制算子

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”表示有副本数。

持久化级别如下:

Spark(三)【SparkCore】- Spark 转换算子、行动算子、持久化算子、代码流程_第1张图片

 

3.2. cache 和 persist 的注意事项

  1. cache 和 persist 都是懒执行,必须有一个 action 类算子触发执行。

  2. cache 和 persist 算子的返回值可以赋值给一个变量,在其他 job 中直接使用这个变量就是使用持久化的数据了。持久化的单位是partition。

  3. cache 和 persist 算子后不能立即紧跟 action 算子。

  4. cache 和 persist 算子持久化的数据当 applilcation 执行完成之后会被清除。

  错误:rdd.cache().count() 返回的不是持久化的 RDD,而是一个数值了。

3.3. checkpoint

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();

 

4. Spark 代码流程

1). 创建 SparkConf 对象

a、可以设置 Application name。
b、可以设置运行模式
c、可以设置 Spark applicatiion 的资源需求。

2). 创建 SparkContext 对象

3). 基于 Spark 的上下文创建一个 RDD,对 RDD 进行处理。

4). 应用程序中要有 Action 类算子来触发 Transformation 类算子执行。

5). 关闭 Spark 上下文对象 SparkContext。

你可能感兴趣的:(Spark分布式计算框架)