https://forlan.iteye.com/blog/2377199

前言 
很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。

比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导:

1.RDD的定义,RDD是一个分布式的不可变数据集合 
2.Spark 是一个内存处理引擎 
如果你没有主动对RDDCache/Persist,它不过是一个概念上存在的虚拟数据集,你实际上是看不到这个RDD的数据的全集的(他不会真的都放到内存里)。

RDD的本质是什么

一个RDD 本质上是一个函数,而RDD的变换不过是函数的嵌套。RDD我认为有两类:

* 输入RDD,典型如KafkaRDD,JdbcRDD 
* 转换RDD,如MapPartitionsRDD 
我们以下面的代码为例做分析:

Scala代码

sc.textFile("abc.log").map().saveAsTextFile("")

textFile 会构建出一个NewHadoopRDD, 
map函数运行后会构建出一个MapPartitionsRDD 
saveAsTextFile触发了实际流程代码的执行 
所以RDD不过是对一个函数的封装,当一个函数对数据处理完成后,我们就得到一个RDD的数据集(是一个虚拟的,后续会解释)。

NewHadoopRDD是数据来源,每个parition负责获取数据,获得过程是通过iterator.next 获得一条一条记录的。假设某个时刻拿到了一条数据A,这个A会立刻被map里的函数处理得到B(完成了转换),然后开始写入到HDFS上。其他数据重复如此。所以整个过程: 
理论上某个MapPartitionsRDD里实际在内存里的数据等于其Partition的数目,是个非常小的数值。 
NewHadoopRDD则会略多些,因为属于数据源,读取文件,假设读取文件的buffer是1M,那么最多也就是partitionNum*1M 数据在内存里 
saveAsTextFile也是一样的,往HDFS写文件,需要buffer,最多数据量为 buffer* partitionNum

所以整个过程其实是流式的过程,一条数据被各个RDD所包裹的函数处理。

刚才我反复提到了嵌套函数,怎么知道它是嵌套的呢?

如果你写了这样一个代码:

Scala代码

sc.textFile("abc.log").map().map().........map().saveAsTextFile("")

有成千上万个map,很可能就堆栈溢出了。为啥?实际上是函数嵌套太深了。

按上面的逻辑,内存使用其实是非常小的,10G内存跑100T数据也不是难事。但是为什么Spark常常因为内存问题挂掉呢? 我们接着往下看。

Shuffle的本质是什么? 
这就是为什么要分Stage了。每个Stage其实就是我上面说的那样,一套数据被N个嵌套的函数处理(也就是你的transform动作)。遇到了Shuffle,就被切开来,所谓的Shuffle,本质上是把数据按规则临时都落到磁盘上,相当于完成了一个saveAsTextFile的动作,不过是存本地磁盘。然后被切开的下一个Stage则以本地磁盘的这些数据作为数据源,重新走上面描述的流程。

我们再做一次描述: 
所谓Shuffle不过是把处理流程切分,给切分的上一段(我们称为Stage M)加个存储到磁盘的Action动作,把切分的下一段(Stage M+1)数据源变成Stage M存储的磁盘文件。每个Stage都可以走我上面的描述,让每条数据都可以被N个嵌套的函数处理,最后通过用户指定的动作进行存储。

为什么Shuffle 容易导致Spark挂掉 
前面我们提到,Shuffle不过是偷偷的帮你加上了个类似saveAsLocalDiskFile的动作。然而,写磁盘是一个高昂的动作。所以我们尽可能的把数据先放到内存,再批量写到文件里,还有读磁盘文件也是个费内存的动作。把数据放内存,就遇到个问题,比如10000条数据,到底会占用多少内存?这个其实很难预估的。所以一不小心,就容易导致内存溢出了。这其实也是一个很无奈的事情。

我们做Cache/Persist意味着什么? 
其实就是给某个Stage加上了一个saveAsMemoryBlockFile的动作,然后下次再要数据的时候,就不用算了。这些存在内存的数据就表示了某个RDD处理后的结果。这个才是说为啥Spark是内存计算引擎的地方。在MR里,你是要放到HDFS里的,但Spark允许你把中间结果放内存里。

总结 
我们从一个较新的角度解释了RDD 和Shuffle 都是一个什么样的东西。

转自:http://www.jianshu.com/p/b70fe63a77a8

Spark 会把数据都载入到内存吗相关推荐

  1. Spark:大数据的电花火石!

    什么是Spark?可能你很多年前就使用过Spark,反正当年我四六级单词都是用的星火系列,没错,星火系列的洋名就是Spark. 当然这里说的Spark指的是Apache Spark,Apache Sp ...

  2. mysql数据范围什么意思_数据都在mysql里的话,基于经纬度的范围查询有什么高效的方案吗...

    [今日话题] 数据都在mysql里的话,基于经纬度的范围查询有什么高效的方案吗 – yingang 1. 经纬度搜索(1)-Geohash算法原理 http://hankesi2000.iteye.c ...

  3. 堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加

    堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据"压住",只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为"后 ...

  4. Spark 把RDD数据保存到hdfs单个文件中,而不是目录

    相比于Hadoop,Spark在数据的处理方面更加灵活方便.然而在最近的使用中遇到了一点小麻烦:Spark保存文件的的函数(如saveAsTextFile)在保存数据时都需要新建一个目录,然后在这个目 ...

  5. Spark源码分析之九:内存管理模型

    Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...

  6. 80%的Linux都不懂的内存问题

    作者:罗道文的私房菜 http://luodw.cc/2016/08/13/linux-cache/ 前言 之前在实习时,听了 OOM 的分享之后,就对 Linux 内核内存管理充满兴趣,但是这块知识 ...

  7. 大数据都应用在哪些领域?

    大数据被应用较多的领域有哪些?疫情期间大数据技术对于疫情的防控发挥了巨大的作用,抗疫期间多家互联网企业纷纷加强大数据在疫情防控中的应用.小到社区大到部委相关部门都将大数据作为不可或缺的防疫工具,生活中 ...

  8. Apache Spark处理大数据入门,看这一篇就够了

    作者 Srini Penchikala ,译者 丛一 什么是Spark Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab ...

  9. Spark:大数据的“电光石火”

    原文: http://www.csdn.net/article/2013-07-08/2816149-Spark Spark:大数据的"电光石火" 发表于 2013-07-08 1 ...

最新文章

  1. 看下Linux 如何查看端口占用情况
  2. SAP MM 事务代码MRKO触发的财务凭证不会出现在PO History里
  3. Mrtg搭建流量监控服务器
  4. [测试]单元测试框架NUnit
  5. python 如何生成特定间隔数列?range()、numpy.arange()
  6. webbench源码解析
  7. HTML页面代码移动端和pc兼容,pc端网站如何实现移动端适配?
  8. 如何拿到阿里算法校招offer
  9. zookeeper 密码_Dubbo、ZooKeeper介绍
  10. 架构设计:微服务模式下,实现灰度发布模式
  11. docker+mysql+授权_docker安装mysql, 授权远程连接
  12. java 关闭守护线程_Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt...
  13. MySQL是怎样运行的(实体书扫描+掘金小册)免费下载
  14. 微服务网关 vs K8s Ingress
  15. leetcode解题思路分析(一百二十八)1053 - 1078 题
  16. windows许可证即将过期 win10的解决办法
  17. js中的数组拷贝(浅拷贝,深拷贝)
  18. 华为IT总监离职时给大家写了一封告别信(ZT)
  19. Android 个人中心界面实现
  20. 湖北颁发首批测绘资质新证

热门文章

  1. PAT 甲级 1056 Mice and Rice
  2. 防雷工程图纸设计方法
  3. STM32CubeMX学习教程之一:GPIO输出之跑马灯
  4. 百度地图的使用方法,如何在Vue项目中使用百度地图
  5. oel6mysql_OEL7.6安装Oracle Database 19C(VERSION 19.3.0.0)
  6. 廉价迷你Linux机器Raspberry Pi详解
  7. 05-初始Mach-O
  8. javaweb JSP JAVA 电影院在线订票系统(电影购票系统 电影售票 电影票预订系统)(在线选座)
  9. 微信公众平台对接C#-上传永久媒体文件
  10. 维多利亚的秘密微信推广广告模仿-刮刮卡