一、Spark架构设计

二、Spark常用算子

tips1: 数据处理的生命周期

tips2: repartition vs coalesce区别:

  • 可以使用 repartition 算子随意调整(提升或降低)RDD 的并行度,而 coalesce 算子则只能用于降低 RDD 并行度
  • repartitionrepartition的计算过程都是先哈希、再取模,得到的结果便是该条数据的目标分区索引。对于绝大多数的数据记录,目标分区往往坐落在另一个 Executor、甚至是另一个节点之上,所以避免不了shuffle
  • coalesce在降低并行度的计算中,它采取的思路是把同一个 Executor 内的不同数据分区进行合并(只会在当前进程内进行数据合并),不会存在shuffle

参考:https://time.geekbang.org/column/article/423131

三、Shuffle机制

Shuffle 的本意是扑克的“洗牌”,在分布式计算场景中,它被引申为集群范围内跨节点、跨进程的数据分发

Map 阶段与 Reduce 阶段,通过生产与消费 Shuffle 中间文件的方式,来完成集群范围内的数据交换。换句话说,Map 阶段生产 Shuffle 中间文件,Reduce 阶段消费 Shuffle 中间文件,二者以中间文件为媒介,完成数据交换

在 Map 执行阶段,每个Map Task都会生成包含 data 文件与 index 文件的 Shuffle 中间文件。Shuffle 文件的生成,是以 Map Task 为粒度的,Map 阶段有多少个 Map Task,就会生成多少份(注意:这里是份,不是个) Shuffle 中间文件

Shuffle Write:在生成中间文件的过程中,Spark 会借助一种类似于 Map 的数据结构,来计算、缓存并排序数据分区中的数据记录。Spark 读取分区内容并向 Map 结构中插入数据,直到 Map 结构被灌满而溢出,如此往复,直到数据分区中所有的数据记录都被处理完毕。对所有临时文件和内存数据结构中剩余的数据记录做归并排序,生成数据文件和索引文件

Shuffle Read:对于所有 Map Task 生成的中间文件,Reduce Task 需要通过网络从不同节点的硬盘中下载并拉取属于自己的数据内容。不同的 Reduce Task 正是根据 index 文件中的起始索引来确定哪些数据内容是“属于自己的”。

分区计算公式:P = Hash(Record Key) % N;N是reduce task数量,P是reduce task的分区编号,每个reduce task根据各自的分区编号拉取中间文件

问:假设5个map task,3个reduce task,会生成多少个中间文件?

答:每个map task根据Hash(Record Key)) % 3,生成3个中间文件,共5个map task,最多生成15个中间文件

参考:https://time.geekbang.org/column/article/420399

四、Spark运行时-内存管理及分配

Reserved Memory:固定为 300MB,不受开发者控制,它是 Spark 预留的、用来存储各种 Spark 内部对象的内存区域

User Memory:用于存储开发者自定义的数据结构,例如 RDD 算子中引用的数组、列表、映射等等

Execution Memory:用来执行分布式任务。分布式任务的计算,主要包括数据的转换、过滤、映射、排序、聚合、归并等环节,而这些计算环节的内存消耗,统统来自于 Execution Memory

Storage Memory:用于缓存分布式数据集,比如 RDD Cache、广播变量等等。RDD Cache 指的是 RDD 物化到内存中的副本。在一个较长的 DAG 中,如果同一个 RDD 被引用多次,那么把这个 RDD 缓存到内存中,往往会大幅提升作业的执行性能

在 1.6 版本之后,Spark 推出了统一内存管理模式,在这种模式下,Execution Memory 和 Storage Memory 之间可以相互转化

  • 如果对方的内存空间有空闲,双方可以互相抢占;
  • 对于 Storage Memory 抢占的 Execution Memory 部分,当分布式任务有计算需要时,Storage Memory 必须立即归还抢占的内存,涉及的缓存数据要么落盘、要么清除;
  • 对于 Execution Memory 抢占的 Storage Memory 部分,即便 Storage Memory 有收回内存的需要,也必须要等到分布式任务执行完毕才能释放。

RDD Cache使用

// 按照单词做分组计数
val wordCounts: RDD[(String, Int)] = kvRDD.reduceByKey((x, y) => x + y) wordCounts.cache // 使用cache算子告知Spark对wordCounts加缓存
wordCounts.count // 触发wordCounts的计算,并将wordCounts缓存到内存 // wordCounts.persist(MEMORY_ONLY) // 或者这样写,比较推荐 // 打印词频最高的5个词汇
wordCounts.map{case (k, v) => (v, k)}.sortByKey(false).take(5) // 将分组计数结果落盘到文件
val targetPath: String = _
wordCounts.saveAsTextFile(targetPath)

参考:https://time.geekbang.org/column/article/422400

五、Spark运行时-数据存储与管理

BlockManagerMaster负责与BlockManager交互,获取每个节点的数据信息

BlockManager 通过 MemoryStore 来完成内存的数据存取。MemoryStore 通过一种特殊的数据结构:LinkedHashMap 来完成 BlockId 到 MemoryEntry 的映射。其中,BlockId 记录着数据块的元数据,而 MemoryEntry 则用于封装数据实体

BlockManager 通过 DiskStore 来实现磁盘数据的存取与访问。DiskStore 并不直接维护元数据列表,而是通过 DiskBlockManager 这个对象,来完成从数据库到磁盘文件的映射,进而完成数据访问

参考:https://time.geekbang.org/column/article/424203

Spark知识点汇总的更多相关文章

  1. nginx几个知识点汇总

    WHY? 为什么用Nginx而不用LVS? 7点理由足以说明一切:1 .高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 - 3 万并发连接数.?2 .内存消耗少: 在 3 万 ...

  2. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  3. 清华大学OS操作系统实验lab1练习知识点汇总

    lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...

  4. c++ 函数知识点汇总

    c++ 函数知识点汇总 swap函数 交换两个数组元素 比如 swap(a[i],a[j]); 就是交换a[i] 和 a[j] 的值 strcpy() 复制一个数组元素的值到另一个数组元素里 strc ...

  5. 前端开发 JavaScript 干货知识点汇总

    很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...

  6. BBS项目知识点汇总

    目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...

  7. Java面试知识点汇总

    Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总   版权声明 ...

  8. 离散数学 II(最全面的知识点汇总)

    离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...

  9. ECMAScript版本知识点汇总

    ECMAScript版本知识点汇总 ES5 btoa.atob 对参数进行base64格式编码.解码 /** * btoa() * base64编码 * @param {string} str * @ ...

  10. c++常考算法知识点汇总

    前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学.就是想当遇到一些比较小的知识,切不值得用一整篇 博客去记述的时 ...

随机推荐

  1. AnnotationAwareAspectJAutoProxyCreator后置处理器的BeanDefinition定义信息导入和其对象实例创建过程

    步骤1 我们从配置类上的@EnableAspectJAutoProxy 注解入手,进入发现这个注解上又有一个@Import(AspectJAutoProxyRegistrar.class)注解, 了解 ...

  2. ThreadLocal 内存泄漏原因和解决方法

    一.ThreadLocal 内存泄漏的原因 ThreadLocal 的内存泄漏问题主要与其底层实现 ThreadLocalMap 的结构和垃圾回收机制有关.以下是核心原因: 1.ThreadLocal ...

  3. OpenJDK与OracleJDK--不挣钱的永远是二等公民

    众所周知,编程语言是的根是它的标准.标准和国际技术组织密切相关,比如 c++标准,由国际标准化组织(ISO) 的 C++ 标准委员会ISO/IEC JTC1/SC22/WG21)维护更新,他们发布的标 ...

  4. Linux各种服务配置开机自启

    一.Linux配置redis开机自启 (1)到redis配置文件中找到conf文件:vi redis.conf (2)daemonize no 修改为:daemonize yes (3)cd /etc ...

  5. 37.1K star!MCP爆火后,这个AI模型全能工具箱开源项目让智能体开发更简单!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "Awesome MCP Servers 是当前最全面的模型上下文协议服务器集合, ...

  6. 【SQL周周练】一句 SQL 如何帮助 5 个人买到电影院最好的座位?

    大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 3 篇,也是[SQL 周周练]系列的第 3 篇.该系列是挑选或 ...

  7. 【经验】C++通过文件句柄获取文件路径(两种方式)

    方法一 主要参考博客:根据文件句柄获得文件名(这篇超级清晰,就是有一点点小问题) 通过文件句柄获得文件路径(这篇不是很好用,但是思路大体是一致的) 主要思路: 根据HANDLE 创建映射文件,调用Ge ...

  8. 手把手教你实现MVVM架构

    .markdown-body { color: rgba(89, 89, 89, 1); font-size: 15px; font-family: -apple-system, system-ui, ...

  9. 解决github无法访问的问题,亲测有效--很强

    参考:https://segmentfault.com/a/1190000037498373 ubuntu系统:在/etc/hosts文件中增加以下内容: windows系统:C:\Windows\S ...

  10. Pycomcad中的过滤机制及访问引用块内对象简述

    1.过滤机制 所谓过滤机制,就是选择集的规则,过滤器列表由成对的参数组成.第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆).过滤器类型是指定使用哪种过滤器的 DXF 组码. ...