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://blog.youkuaiyun.com/Java_Man_China/article/details/109321946

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

链接: https://blog.youkuaiyun.com/Java_Man_China/article/details/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.youkuaiyun.com/md/?articleId=109321946//未写待续

第Ⅴ部分 流处理

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

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

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

第Ⅶ部分 生态系统

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

### 如何使用 Keil5 Hex 文件 对于仅拥有已编译好的 hex 文件而无源文件的情况,在 Keil V5 平台上直接hex 文件至单片机(如华大单片机)需采取特定的方法,因为直接调用该平台进行此类操作不可行[^1]。 #### 设置 Output 路径 进入 Keil 的 output 设置界面,指定要录的 hex 文件的具体位置。确保在路径输入框中填完整的 hex 文件名称并附带 `.hex` 扩展名;缺少此扩展名可能导致系统继续尝试录先前编译的结果而非所选的 hex 文件[^3]。 #### 配置 Flash 工具选项 针对不同类型的微控制器(MCU),可能还需调整 flash 下载工具的相关配置参数以匹配目标设备的要求。这一步骤通常涉及选择合适的编程算法以及设定通信接口等细节[^2]。 #### 启动下载过程 完成上述准备工作之后,可以通过点击调试窗口内的 “Download” 或者快捷菜单里的相应命令来启动实际的程序入流程。如果一切顺利的话,软件会自动连接硬件并将选定的 hex 数据传输到 MCU 中存储起来[^4]。 ```python # Python 示例代码用于说明自动化脚本概念 (并非真实实现) def download_hex_to_mcu(hex_file_path, mcu_type): """ 自定义函数模拟将 HEX 文件下载到指定型号的 MCU 上 参数: hex_file_path -- 完整路径字符串指向待上传的 .hex 文件 mcu_type -- 字符串表示的目标单片机类型标识符 返回值: 成功则返回 True ,失败抛出异常信息 """ try: configure_output_settings(hex_file_path) # 设定输出设置 select_flash_tool(mcu_type) # 挑选适合的闪存工具 execute_download_command() # 发送下载指令 return True # 表明成功结束 except Exception as e: raise RuntimeError(f"Failed to upload {hex_file_path}: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值