Spark:The Definitive Guide--读书小结(二)

前言

大概花了一个月(2020-09~2020-10)左右的时间,看完了整本书。笔者毕业后,主要从事机器学习、数据挖掘方向的相关工作。由于Spark作为目前主流的分布式计算引擎,个人也一直在用Spark进行相关的数据分析与建模工作。通读全书,感觉比较适合入门级学习,主要介绍了Spark 2.0相关API及Spark生态。涵盖Spark SQL、Struct Streaming、GraphX、MLlib等内容。对初学者而言是一本不错的书籍。

数据、源码链接: https://github.com/databricks/Spark-The-Definitive-Guide

第Ⅰ部分 大数据与Spark概述

链接: https://editor.csdn.net/md/?articleId=109321946

第Ⅱ部分 结构化API–DataFrame、SQL和Dataset

链接: https://editor.csdn.net/md/?articleId=109321946

第Ⅲ部分 低级API

第Ⅱ部分介绍了Spark基于DataFrame的结构化API,在几乎所有的应用场景下都应该尽量使用这些结构化API,当这些结构化API无法满足工作上的特殊需求时,就需要使用Spark的低级API,一种是基于弹性分布式数据集(RDD)、另一种用于分发和处理分布式共享变量(累加器、广播变量)。

  1. flatMap
    flatMap是map函数的扩展,在映射操作中,可以将每个当前行映射为多行。

    在这里插入图片描述

  2. reduce
    reduce方法通过指定一个函数,将RDD中的值规约为一个值。例如:给定一组数字,采用reduce求和,大致过程如下:reduce通过指定一个函数来接受两个参数,然后对他们求和后返回一个新值,新值作为其中一个参数传递给该函数,另一个参数为下一个数字,依次遍历完整个RDD,最终放回一个值,即他们的和。

    在这里插入图片描述

  3. 检查点(checkpointing)
    DataFrame API中没有检查点(checkpointing)这个概念,检查点是指将RDD保存到磁盘上的操作,以便将来对此RDD的引用能直接访问磁盘上的那些中间结果,而不需要从其源头重新计算RDD。它与缓存类似,只是它不存储在内存上,只存储在磁盘上,这在执行迭代计算时是一个很有用的优化。

    在这里插入图片描述
    在这里插入图片描述

  4. map、mapPartitions、mapPartitionsWithIndex
    map针对RDD中的每一个数据进行操作,mapPartitions针对RDD的每一个分区进行操作,mapPartitionsWithIndex与mapPartitions功能一致,后者接受两个参数,一个是分区索引号,一个是遍历分区的迭代器,前者只需一个参数(遍历分区迭代器)即可。当partition数量太大是,一次性处理整个分区可能会导致OOM,但map操作就不会存在这个问题。

  5. glom
    将数据集中的每个分区都转化为数组,分区过大或存在大量分区时,容易导致driver端奔溃

    在这里插入图片描述

  6. keyBy
    根据当前value创建key

    在这里插入图片描述

  7. flatMapValues
    针对key-value形式的RDD,将value扁平化后输出
    在这里插入图片描述

  8. lookup
    查看某个key对应的value
    在这里插入图片描述

  9. groupByKey、reduceBykey
    groupBykey必须将当前key对应的所有value全部加载进内存,如果有严重的负载倾斜的现象,则某些分组可能会导致单台节点OOM。reduceByKey相当于在节点间移动数据前,先对当前节点做了一个groupByKey,然后再移动数据。显然,我们应该尽量使用reduceByKey这类高效算子。

在这里插入图片描述

  1. cogroup
    支持将三个以内的key-value组合在一起
    在这里插入图片描述

  2. zip
    两个RDD进行连接,要求两个RDD数据一样多
    在这里插入图片描述

  3. 自定义分区
    自定义分区是使用RDD的主要原因之一结构化API中并不支持自定义分区。自定义分区的唯一目标是将数据均匀的分布到整个集群中,以避免诸如数据倾斜之类的问题。虽然哈希分区和范围分区很有用,但他们都是最基本的分区,当数据量存在倾斜的时候,需要实现底层的分区方法,你可以尽可能多的拆分这些key以提高并行性,并防止执行过程中的OOM。

在这里插入图片描述

  1. coalesce、repartition
    在这里插入图片描述
  2. 广播变量
    变量未被广播前,在Spark多个操作和作业中,它会被重复发送到工作节点中的每一个作业中,而不是只发送一次。广播变量是共享的,不可以修改的。Spark在集群中通过广播变量可以高效的传输数据,节省了大量的序列化和反序列化的成本。
    在这里插入图片描述
  3. 累加器
    累加器另一种类型的共享变量,它用于将转化操作更新的值以高效和容错的方式传输到其它驱动节点。如果RDD的某个操作要更新累加器,它的值会在实际计算RDD时更新,遵守Spark的惰性评估机制。像map类操作,则不会立马执行。
    在这里插入图片描述在这里插入图片描述

第Ⅳ部分 生产与应用

链接: https://editor.csdn.net/md/?articleId=109321946//未写待续

第Ⅴ部分 流处理

链接: https://editor.csdn.net/md/?articleId=109321946//未写待续

第Ⅵ部分 高级分析与机器学习

链接: https://editor.csdn.net/md/?articleId=109321946//未写待续

第Ⅶ部分 生态系统

链接: https://editor.csdn.net/md/?articleId=109321946//未写待续