spark头脑镜像
思考是一件有意思的事情。遇到问题,思考出结论,那么脑子里面的过程是什么呢,或者脑子里面是什么呢。我一直认为,这团团的里面是一个模糊的n维空间。理解一个复杂的系统、公式、算法,都要在这个n维空间里具象化。这个具象化的镜像的精确度就代表了理解的深入度。想起了,考研的时候,太用力,每天晚上脑袋里镜像不断刷新的画面。
最近一直在折腾spark,项目赶得飞快,理解上的问题也一直在积压。今天慢慢梳理,突然发现脑袋里面的镜像构建的不对。
spark的rdd是分布式的存储在内存中的,每个stage的边界是宽依赖导致的shuffle,连续的窄依赖(如map)在一个stage中流水线的执行。之前脑中的镜像是图左,窄依赖不必依赖其他的node,一个node的分区窄依赖变换时不必依赖其他node,所以可以连续执行;宽依赖需要其他node的数据,所以只能shuffle了。
在这种镜像下,我自己很多困惑没有得到解答,比如2个rdd的笛卡尔积为什么是窄依赖呢?笛卡尔积是全连接,需要所有node上的数据。知乎上有个问题是问这个的,有个答案竟然是spark后来的实现打破了自己论文中的设计。有次面试一位多年spark经验的开发,也是这样被误导了。
重新构建一下,如图右。RDD只是一个抽象的概念,分区也是抽象的,并不会存储在内存中,只有调用了cache等明确要求存储的函数时,RDD的分区才会存储到内存变成block。spark运行时并不存在分区,而是对分区进行计算的任务。每个任务其实就是一段执行代码,代码中的内容是就是这一个stage中的连续窄依赖变换,如果图右中的map和groupBy。
那么为什么要把一个job通过宽依赖划分为不同的stage呢?其实很像我们优化一段代码,想提升速度,自然的,开多线程。但如果这段代码中,有一些过程需要依赖前面过程全部执行完才能正确运行。这时,我们切分这段代码为(a,b,c),c依赖b执行完,b依赖a执行完。然后,把这段代码划分为3个stage,每个stage分别多线程运行a,b,c 3块代码。a,b,c内部的操作就是窄依赖,可以并行的执行,a,b,c的边界就是宽依赖,需要前一个stage执行完才可以运行。
这样想,清晰了很多,一个变换是不是窄依赖的决定性因素是:每个分区任务是否可以独立并行的执行。是的话,就可以和其他相邻窄依赖一起合并成任务并行执行。那我们看一下笛卡尔积的例子吧。
如上图,笛卡尔积是可以独立并行执行的,拿到父RDD(2位)的2个分区(m,n)变换出a分区不需要依赖父RDD的其他分区。
笛卡尔积也并有打破论文中的定义:窄依赖是独生家庭,父RDD的一个分区只会唯一生成子RDD的一个分区。假设RDD1(M个分区)和RDD2(N个分区)笛卡尔积得到的子RDD有M*N个分区。父RDD为2个RDD,他的一个分区为(m,n)唯一生成子RDD中的一个分区a,是独生子女,符合政策,不用罚款。
持续构建中。。。
您的关注可能成为我写的动力,助我能每周坚持一篇吧
spark头脑镜像的更多相关文章
- zhihu spark集群,书籍,论文
spark集群中的节点可以只处理自身独立数据库里的数据,然后汇总吗? 修改 我将spark搭建在两台机器上,其中一台既是master又是slave,另一台是slave,两台机器上均装有独立的mongo ...
- Spark入门(1-4)安装、运行Spark
如何安装Spark 安装和使用Spark有几种不同方式.你可以在自己的电脑上将Spark作为一个独立的框架安装或者从诸如Cloudera,HortonWorks或MapR之类的供应商处获取一个Spar ...
- docker 快速部署ES集群 spark集群
1) 拉下来 ES集群 spark集群 两套快速部署环境, 并只用docker跑起来,并保存到私库. 2)弄清楚怎么样打包 linux镜像(或者说制作). 3)试着改一下,让它们跑在集群里面. 4) ...
- hadoop进阶----hadoop经验(一)-----生产环境hadoop部署在超大内存服务器的虚拟机集群上vs几个内存较小的物理机
生产环境 hadoop部署在超大内存服务器的虚拟机集群上 好 还是 几个内存较小的物理机上好? 虚拟机集群优点 虚拟化会带来一些其他方面的功能. 资源隔离.有些集群是专用的,比如给你三台设备只跑一个 ...
- 使用 Iceberg on Kubernetes 打造新一代云原生数据湖
背景 大数据发展至今,按照 Google 2003年发布的<The Google File System>第一篇论文算起,已走过17个年头.可惜的是 Google 当时并没有开源其技术,& ...
- Docker 搭建Spark 依赖singularities/spark:2.2镜像
singularities/spark:2.2版本中 Hadoop版本:2.8.2 Spark版本: 2.2.1 Scala版本:2.11.8 Java版本:1.8.0_151 拉取镜像: [root ...
- Docker 搭建Spark 依赖sequenceiq/spark:1.6镜像
使用Docker-Hub中Spark排行最高的sequenceiq/spark:1.6.0. 操作: 拉取镜像: [root@localhost home]# docker pull sequence ...
- 创建Spark镜像文件
创建Spark镜像文件 1.将spark容器提交到新的镜像中 $>docker commit 01a25bdf1499 myrepos:centos-spark 2.将centos-spark镜 ...
- 制作spark镜像
构建镜像 添加jdk引用(可以使用yum进行安装): 安装SSH 碰到一个问题,执行systemctl的时候发生了异常: Failed to get D-Bus connection 解决这个问题的方 ...
随机推荐
- HUST 1585 排队
1585 - 排队 时间限制:1秒 内存限制:128兆 351 次提交 179 次通过 题目描述 BG站在一个有n个人的队伍中,但他并不知道他处于队伍中的哪个位置,他向前向后观察,只能断定他的前方有至 ...
- bzoj 2946
Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l 读入单词 l 计算最长公共子串的长度 l 输 ...
- bzoj:3392: [Usaco2005 Feb]Part Acquisition 交易
Description 奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤50000)颗行星,在行星上进行交易.为了方便,奶牛们已经给可能出现的K(1≤K≤1000)种货物 ...
- [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)
以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...
- UVA 572 dfs求连通块
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
- android狼人杀源码,桌面源码,猎豹快切源码
Android精选源码 android实现狼人杀app源码 android实现精心打造的Android基础框架源码 android热门电影的客户端源码 android 实现桌面的Launcher源码 ...
- linux基本命令学习01
=============================================================================Unix/Linux最主要的应用领域是基础服务 ...
- zookeeper基本讲解及基本命令和配置 (转)
一.ZooKeeper概述 ZooKeeper是一种为分布式应用所设计的高可用.高性能且一致的开源协调服务,是Google的Chubby一个开源实现,是Hadoop和Hbase的重要组件,它提供了一项 ...
- css之隐藏内容的方法
css隐藏内容的方法有三种:即display:none.visibility:hidden.overflow:hidden. 1.display:none;的缺陷: 搜索引擎可能认为被隐藏的文字属于垃 ...
- 算法-java代码实现计数排序
计数排序 第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...