zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    欧拉函数线性筛法
    欧拉筛素数
    05:登月计划
    09:LGTB 学分块
    2017.7.15清北夏令营精英班Day1解题报告
    T7316 yyy的最大公约数(者)
    T7314 yyy的巧克力(钟)
    T7315 yyy矩阵折叠(长)
    DataReader,DataTable利用泛型填充实体类
    数据库入库的方式实现
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13629690.html
Copyright © 2011-2022 走看看