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 解决这个问题的方 ...
随机推荐
- 使用c语言实现linux数据库的操作
前言:上一篇讲解了linux下使用命令行操作数据库,这篇继续讲解怎么使用c语言实现linux数据库的操作. 使用c语言实现环境搭建:既然我们要使用c语言实现linux数据库操作,那么首先我们得先把数据 ...
- Linux下zeromq.js安装
本文章主要阐述在离线环境下安装zeromq.js的方法和步骤.zeromq.js下载地址: https://www.npmjs.com/package/zeromq或者 https://github. ...
- 51nod:1689 逛街
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1689 一开始想枚举逛街的终点,然后开两个大根堆维护b值,分别 ...
- BZOJ2338: [HNOI2011]数矩形
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标 ...
- android仿漫画源码、抽奖转盘、Google相册、动画源码等
Android精选源码 android实现仿今日头条的开源项目 波浪效果,实现流量的动态显示 美妆领域的app, 集成了摄像头取色, 朋友圈, 滤镜等 android仿漫画源码 android一个视差 ...
- 布隆(Bloom)过滤器 JAVA实现
前言 Bloom过滤器,通过将字符串映射为信息指纹从而节省了空间.Bloom过滤器的原理为,将一个字符串通过一定算法映射为八个Hash值,将八个Hash值对应位置的Bitset位进行填充.在进行校验的 ...
- Linux中git的使用
之前在windows中一直采用github的桌面版,库的建立更新都是借助软件的帮助.所使用的的功能也非常局限,仅仅只是创建库再提交自己的代码.至于版本管理.回滚.分支以及git的结构都没有清楚的认识. ...
- Sql Server——约束
约束是什么: 每个人都在网站或者APP上注册过账号,在注册账号时会限制用户名.密码等格式,如果格式不对就不能注册.在数据库中我们可以通过约束来进行限制,超过约束范围的数据就不能写入. 约束的种类: 主 ...
- Unity 小笔记
1,Time.deltatime放在Update和fixedupdate中得到的值是不一样的.还以为是通过两个值来获取. 2,VR中绘制射线可以使用LineRender. 3,Unity中判断一个东西 ...
- Android简介(一)
Android构架 Android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用架构层.系统运行库层和Linux核心层. 1. ...