Spark会把数据都载入到内存么
转载自:https://www.iteblog.com/archives/1648
前言:
很多初学者其实对于Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念误导所致:
1.RDD的定义,RDD是一个分布式的不可变数据集合;
2.Spark是一个内存处理引擎;
如果你没有主动对RDD进行Cache/Persist等相关操作,它不过是一个概念上存在的虚拟机数据集,
你实际上是看不到这个RDD的数据的全集的(他不会真的都放在内存里)。
RDD的本质是什么
一个RDD本质上是一个函数,而RDD的变换不过是函数的嵌套,RDD我认为有两种:
1.输入RDD,典型如KafkaRDD,JdbcRDD以及HadoopRDD等
2.转换RDD,如MapPartitionsRDD
我们以下面的代码为例做分析:
sc.textFile("abc.log").map().saveAsTextFile("")
textFile中间会构建出一个HadoopRDD,然后返回了MapPartitionsRDD,map函数运行后会构建出一个MapPartitionsRDD,saveAsTextFile触发了实际流程代码的执行
所以RDD不过是对一个函数的封装,当一个函数对数据处理完成后,我们就得到一个RDD的数据集(是一个虚拟的,后续会解释)。
HadoopRDD是数据来源,每个partition负责获取数据,获得过程是通过iterator.next获得一条一条的数据,假设某个时刻拿到了一条数据A,这个A会立刻被map里的函数处理得到B(完成了转换),然后开始写入到其他数据重复如此。所以整个过程:
1、理论上某个MapPartitionsRDD里实际在内存里的数据等于其Partition的数目,是个非常小的数值。
2、HadoopRDD则会略多些,因为属于数据源,读取文件,假设读取文件的buffer是1M,那么最多也就是partitionNum*1M数据在内存里
3、saveAsTextFile也是一样的,往HDFS写文件,需要buffer,最多数据量为buffer*partitionNum,
所以整个过程其实是流式的过程,一条数据被各个RDD所包裹的函数处理。
刚才我反复提到了嵌套函数,怎么知道他是嵌套的呢?
如果你写了这样一个代码:
sc.textFile("abc.log").map().map().........map().saveAsTextFile("")
有成千上万个map,很可能就堆栈溢出了,为啥?实际上是函数嵌套的太深了。
按照上面的逻辑,内存使用其实是非常小的,10G内存跑100T数据也不是难事。但是为什么Spark常常因为内存问题挂掉呢?我们接着往下看:
Shuffle的本质是什么
这就是为什么要分Stage了。每个Stage其实就是我上面说的那样,一套数据被N个嵌套的函数处理(也就是你的transform动作)。遇到了Shuffle,就被切开来,所谓的sHUffle,本质上是把数据按规则临时都落到磁盘上,相当于完成了一个saveAsTextFile的动作,不过是存本地磁盘。然后被切开的下一个Stage则以本地磁盘的这些数据作为数据源,重新走上面描述的流程。
我们再做一次描述:
所谓Shuffle不过是把处理流程切分,给切分的上一段(我们称为Stage M)加个存储到磁盘的动作,
把切分的下一段(Stage M+1)数据源变成Stage M存储的磁盘文件。每个Stage都可以走我上面的
描述,让每条数据都可以被N个嵌套的函数处理,最后通过用户指定的动作进行存储。
为什么Shuffle容易导致Spark挂掉
前面我们提到,Shuffle不过是偷偷的帮你加上了个类似saveAsLocalDiskFile的动作。然而,写磁盘是一个昂贵的动作。所以我们尽可能的把数据先放到内存,再批量写到文件里。还有读磁盘文件也是挺费内存的动作。把数据放内存,就有这个问题,比如10000条数据,到底会占用多少内存?这个其实很难预估的,所以一不小心,就容易导致内存溢出了,这其实也是一个很无奈的事情。
我们做Cache/Persist意味着什么
其实就是给某个Stage加上一个saveAsMemoryBlockFile的动作,然后下次再要数据的时候,就不用算了。这些存在内存的数据就表示了某个RDD处理后的结果。这个才是说为啥Spark是内存计算引擎的地方。在MR里,你要是放在HDFS里的。但Spark允许你把中间结果放在内存里。
Spark会把数据都载入到内存么的更多相关文章
- Spark会把数据都载入到内存么?
前言 很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解. 比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导: RDD ...
- Spark:大数据的电花火石!
什么是Spark?可能你很多年前就使用过Spark,反正当年我四六级单词都是用的星火系列,没错,星火系列的洋名就是Spark. 当然这里说的Spark指的是Apache Spark,Apache Sp ...
- Unity载入和内存管理机制
Unity几种动态载入Prefab方式的差异: 事实上存在3种载入prefab的方式: 一是静态引用,建一个public的变量,在Inspector里把prefab拉上去,用的时候instantiat ...
- Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD.SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗? 很显然,答案是否定的! 对该问题产生疑问的根源还是对Sp ...
- [转载] Spark:大数据的“电光石火”
转载自http://www.csdn.net/article/2013-07-08/2816149 Spark已正式申请加入Apache孵化器,从灵机一闪的实验室“电火花”成长为大数据技术平台中异军突 ...
- Spark调优 数据倾斜
1. Spark数据倾斜问题 Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题. 例如,reduce ...
- Spark性能优化--数据倾斜调优与shuffle调优
一.数据倾斜发生的原理 原理:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作.此时如果某个key对应的数据量特 ...
- spark完整的数据倾斜解决方案
1.数据倾斜的原理 2.数据倾斜的现象 3.数据倾斜的产生原因与定位 在执行shuffle操作的时候,大家都知道,我们之前讲解过shuffle的原理. 是按照key,来进行values的数据的输出.拉 ...
- Spark源码分析之九:内存管理模型
Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...
随机推荐
- JScrollBar
接到了GUI相关的task,从来没看Java的我只好各种百度加看书了.这里介绍了 JScrollBar 的简单应用. 话不多说,直接上代码和效果图. import java.awt.*; imp ...
- ios 导航栏的显示和隐藏切换
从简单的一个没有导航栏的界面A push到另一个有导航栏的界面 B,在界面A的逻辑中加入下面逻辑: 屏幕快照 2016-03-30 上午10.35.24.png 这样完美的处理了这个场景变换需求.引起 ...
- javascript的几种继承
1.原型链继承:构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.确认原型和实例之间的关系用instanceof. ...
- ASP.NET知识总结(6.一般处理程序动态处理图片(验证码、水印、缩略图))
->使用GDI+完成图片的处理,需要引入程序集System.Drawing ->GDI+的基本处理模型 <1>创建画布Bitmap <2>创建画图工具对象Graph ...
- HTML表单提交
<!DOCTYPE html> <!--当前文档为html5--> <html> <head> <!--设置文档编码--> <meta ...
- 【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】
一.对象的三种状态. 1.对象有三种状态:持久化状态.临时状态.脱管状态(游离状态) 2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态. 3.三种状态的说明 (1)临时状态:临时 ...
- NPOIExcel
public class NPOIExcel { private string _title; private string _sheetName; private string _filePath; ...
- sqlmap和burpsuite绕过csrf token进行SQL注入检测
利用sqlmap和burpsuite绕过csrf token进行SQL注入 转载请注明来源:http://www.cnblogs.com/phoenix--/archive/2013/04/12/30 ...
- Angular JS 学习之路由
1.AngularJS路由允许我们通过不同的URL访问不同的内容:通过AngularJS可以实现多视图的单页WEB访问(SPA) 2.通常我们的URL形式为http://runoob.com/firs ...
- wordpress电子商务插件和主题的使用方法
前提步骤:卸载wordpress干净,需要把相应的数据库删除:drop databade **: (1)先改wordpress中重要文件的权限:777 (2)用usradd -d www /html命 ...