Spark权威指南读书笔记(六) RDD 与分布式共享变量

Spark权威指南读书笔记(六) RDD 与分布式共享变量

一、弹性分布式数据集

低级API分类

低级API有两种,一种用于处理分布式数据集, 一种用于分发或处理分布式共享变量(广播变量和累加器)。

何时使用低级API

  1. 高级API找不到所需功能
  2. 需要维护一些使用RDD编写的遗留代码库
  3. 需要执行一些自定义共享变量时

如何使用低级API

SparkContext是低级API入口,可通过SparkSession来获取SparkContext。

关于RDD

简单而言,RDD是一个只读不可变的且已分块的记录集合,并可以并行处理。与DF比较而言,DF每条记录为结构化的数据行,字段已知且与schema已知,RDD中记录仅仅是程序员选择的对象。

对于用户而言,一般只会创建两种类型RDD,通用型RDD或提供附加函数的KV RDD。

每个RDD具有五个主要内部属性:

  1. 数据分片列表
  2. 作用在每个数据分片的计算函数
  3. 描述与其他RDD的依赖关系列表
  4. (可选)为KV RDD配置的Partitioner(分片方法)
  5. (可选)优先位置列表,根据数据本地特性,指定了每个Partition分片的处理位置偏好。

它支持两种算子操作,惰性执行的转换操作和立即执行的动作操作,均已分布式方法处理数据。

RDD创建

image-20200907103709051

操作RDD

image-20200907105649473

image-20200907105800380

image-20200907105817602

随机分割

image-20200907110309347

动作RDD

image-20200907111655337

image-20200907111710127

image-20200907111829761

image-20200907111849125

image-20200907111929681

image-20200907111945670

image-20200907112042893

image-20200907112055888

image-20200907112133646

image-20200907112150669

image-20200907112413260

image-20200907112434589

image-20200907112454681

image-20200907112517239

保存文件

image-20200907112624679

image-20200907113111074

缓存 与 检查点

image-20200907114135485

image-20200907115300572

流水线方法

通过流水线技术调用外部进程来生成RDD,将每个数据分区交给指定外部进程来计算结果RDD。每个输入分区的所有元素被当作另一个外部进程的标准输入,输入元素由换行符分隔。最终结果由该外部进程的标准输出生成,标准输出的每一行产生输出分区的一个元素,空分区也会调用一个外部进程。

image-20200907144347362

image-20200907144545489

image-20200907144743561

image-20200907145315224

image-20200907150519403

二、高级RDD

KV RDD 基础

image-20200907151445818

image-20200907151523452

image-20200907152151219

image-20200907152349687

image-20200907152430861

image-20200907152745773

聚合操作

image-20200907153025254

image-20200907153133923

image-20200907153246626

image-20200907153344559

image-20200907154003505

image-20200907160908231

image-20200907162651572

image-20200907162952089

image-20200907163526837

image-20200907164023291

image-20200907164355603

连接操作

image-20200907164616249

image-20200907164935478

控制分区

image-20200907170058204

image-20200907170403145

分区器(详细理解参考:https://www.cnblogs.com/liuming1992/p/6377540.html)

image-20200907171028792

image-20200907171536153

image-20200907174535798

自定义序列化

image-20200907175435592

三、分布式共享变量

Spark中分布式共享变量主要包括两种类型: 广播变量和累加器。

广播变量

通过使用广播变量可以在集群中有效地共享(只读的)不变量,而不需要将其封装到函数中。在驱动节点上使用变量的一般方法为简单的在函数闭包中引用,但是这种情况必须在工作节点上执行多次反序列化(每次任务依次)。如果在多个Spark操作和作业中使用了相同的变量,将重复发送到工作节点的每一个作业,而不是发送一次。

广播变量是共享的,不可修改的变量,它们缓存在集群中的每个节点上,而不是在每个任务中都反复序列化。

image-20200907145315224

image-20200907220430183

image-20200907220449400

三、累加器

累加器提供一个累加用的变量,Spark集群可以按行方式对其进行安全更新。累加器仅支持由满足交换律和结合律的操作进行累加的变量,因此累加器可以高效并行,实现计数器或求和操作。Spark提供对数字类型累加器的原生支持,程序员可以自动添加对新类型的支持。

对于仅发生在动作操作内执行的累加器更新,Spark保证每个人物对累加器的更新将只发生一次,重新启动并不会再次更新该值。但是在转换操作中,如果任务或作业阶段重新执行,应注意累加器更新可能发生多次。

累加器遵循Spark的惰性评估机制,若RDD某个操作要更新累加器,则它的值只会在实际计算RDD时更新。

命名累加器可以在Spark用户界面上显示它们的运行结果,而未命名累加器则不会显示出来。

image-20200907223605004

image-20200907223822810

posted @ 2020-09-07 22:40  ganshuoos  阅读(220)  评论(0编辑  收藏  举报