Spark知识点汇总
一、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知识点汇总的更多相关文章
- nginx几个知识点汇总
WHY? 为什么用Nginx而不用LVS? 7点理由足以说明一切:1 .高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 - 3 万并发连接数.?2 .内存消耗少: 在 3 万 ...
- python全栈开发 * 10知识点汇总 * 180612
10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...
- 清华大学OS操作系统实验lab1练习知识点汇总
lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...
- c++ 函数知识点汇总
c++ 函数知识点汇总 swap函数 交换两个数组元素 比如 swap(a[i],a[j]); 就是交换a[i] 和 a[j] 的值 strcpy() 复制一个数组元素的值到另一个数组元素里 strc ...
- 前端开发 JavaScript 干货知识点汇总
很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...
- BBS项目知识点汇总
目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...
- Java面试知识点汇总
Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总 版权声明 ...
- 离散数学 II(最全面的知识点汇总)
离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...
- ECMAScript版本知识点汇总
ECMAScript版本知识点汇总 ES5 btoa.atob 对参数进行base64格式编码.解码 /** * btoa() * base64编码 * @param {string} str * @ ...
- c++常考算法知识点汇总
前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学.就是想当遇到一些比较小的知识,切不值得用一整篇 博客去记述的时 ...
随机推荐
- 再说cxGrid主从表相关
查了那么多叽叽歪歪的资料:masterView的key,从表key和detailkey以及从表需要排序. 注意设定参数后,最后active数据集.这里有个顺序问题,否则会增加随机新 回到原点看随机he ...
- 武汉工程大学2020GPLT选拔赛(重现赛)
L2-4 缘之空 1.使用倍增法求最近公共祖先,然后利用公共祖先计算两点的树上距离 2.但是此题并没有提供根节点,所以要先找到根节点以后才可以进行倍增法求lca /** - swj - * /> ...
- Greenplum数据库索引解析
以下是对greenplum数据库使用总结. 创建索引 CREATE INDEX i_test_tb_state_az ON test_tb(name_en) WHERE name_en = 'AZ'; ...
- DAY3--launch文件编写
1.launch启动文件简介 到目前为止,每当我们需要运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令.当系统中的节点数量不断增加时,"每个节点一个终端"的模式会变得 ...
- Salt之Cpu 100%无响应故障 Salt request timed out. The master is not responding
报错信息如下: Salt request timed out. The master is not responding. You may need to run your command with ...
- 微信小程序 6/12 的坑
配置 小程序的时候配置请求的是 https://xxx 不是http://xxx 前端请求的链接都是https
- .net core分布式锁的实现(基于redis)
一.单个redis节点 实现原理:核心采用StackExchange.Redis的LockTake方法实现.支持同步获取锁,或者等待直到超时获取锁. 基于SENTX命令. copy一下文档的demo ...
- .Net Core环境绑定及配置launchSettings.json
1.Asp.net Core的默认环境配置在项目Properties-->launchSettings.json下 { "$schema": "http://jso ...
- 凯亚IOT平台在线测试MQTT接入设备
一.概述 凯亚 (Kayak)开通了MQTT端口425,以便给感兴趣的同僚进行测试,下面将在此篇文章讲解如何平台接入设备进行MQTT通信 凯亚 (Kayak) 是什么? 凯亚(Kayak)是基于.NE ...
- 36.7K star!拖拽构建AI流程,这个开源LLM应用框架绝了!
36.7K star!拖拽构建AI流程,这个开源LLM应用框架绝了! 只需拖拽节点,5分钟搭建专属AI工作流! Flowise 是一款革命性的低代码LLM应用构建工具,开发者通过可视化拖拽界面,就能快 ...