`

Spark 会把数据都载入到内存吗

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

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

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

RDD的本质是什么

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

* 输入RDD,典型如KafkaRDD,JdbcRDD
* 转换RDD,如MapPartitionsRDD
我们以下面的代码为例做分析:
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所包裹的函数处理。

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

如果你写了这样一个代码:
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 案例测试数据

    Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Spark以其内存计算模型著称,极大地提高了数据处理速度,比传统的Hadoop MapReduce快上许多倍。Spark的核心组件包括:Spark Core(基础执行引擎)、Spark SQL(用于SQL查询和数据集成)、Spark Streaming(处理实时...

    Apache Spark 内存管理详解

    - 当Executor的内存达到限制时,Spark会尝试将部分数据页换到磁盘上,以避免OutOfMemoryError(OOM)错误的发生。 #### 五、性能调优技巧 为了提高Spark应用的性能,以下是一些常用的内存管理调优技巧: - **调整...

    SPARK内存管理机制最全!

    在Spark作业执行过程中,当遇到执行内存不足的情况时,系统会尝试进行内存清理,释放存储内存中的数据,从而保证执行内存的充足。如果执行内存中的安全区域不足,则会触发垃圾回收操作。因此,合理配置相关内存参数...

    源码地java spark淘宝大数据分析可视化系统(源码+数据+报告)址.zip

    6. 性能优化:Spark的内存计算特性使其在大数据处理中具有高效率,但同时也需注意资源管理,避免内存溢出等问题。系统可能采用动态资源调度、数据分区等策略,以提高计算性能和资源利用率。 7. 报告生成:分析完成...

    Spark_competion 数据集

    本篇文章将以"Spark_competition"数据集为例,深入探讨如何利用Spark进行大数据分析,以及涉及到的相关知识点。 一、Spark核心概念与架构 Spark的核心在于它的弹性分布式数据集(Resilient Distributed Datasets,...

    Spark大数据处理数据性能优化学习

    总的来说,Spark大数据处理数据性能优化涉及到多个层面,包括架构理解、数据读写优化、执行计划调整、资源管理、并行度设定、延迟优化、缓存管理以及监控调试。深入学习这些知识点,有助于我们在处理海量数据时,...

    大数据期末课设~基于spark的气象数据处理与分析

    这部分工作可能涉及到Spark的数据加载、清洗、转换和聚合操作。例如,使用Spark的DataFrame API读取JSON数据,处理缺失值和异常值,然后通过groupByKey或groupBy函数按城市进行分组,计算每个城市的气温和降水量平均...

    spark快速大数据分析

    接着,书中的章节会深入到Spark SQL,这是Spark用于处理结构化数据的部分,它允许用户使用SQL或者DataFrame/Dataset API进行查询,同时支持多种数据源。Spark SQL的引入使得Spark在数据分析领域更加易用,对SQL熟悉...

    Spark快速%数据处理

    总的来说,《Spark快速数据处理》会带领读者了解如何利用Spark进行大数据分析,包括如何设置和管理Spark集群,编写Spark程序,以及如何运用Spark的各个模块进行高效的数据处理和分析。通过这本书的学习,读者将能够...

    Spark大数据处理 技术 应用与性能优化 完整版 pdf

    4. 缓存策略:利用RDD持久化,将常用数据缓存到内存,减少重复计算。 5. SQL优化:使用DataFrame或Dataset API,避免冗余转换,使用合适的数据类型和列裁剪。 6. Shuffle优化:减少shuffle操作,使用broadcast ...

    基于Spark的电影数据集分析

    该项目是大三下学期的课程设计,使用的数据集来自知名数据网站 Kaggle 的 tmdb-movie-metadata 电影数据集,以Python为编程语言,使用大数据框架Spark对数据进行了预处理,然后分别从多个方面对数据进行了分类和分析...

    基于Spark的大数据挖掘技术的研究.pdf

    本文主要探讨了基于Spark框架的大数据挖掘技术,涉及到Spark的核心功能、系统生态、以及在大数据挖掘中的应用。下面将对所包含的知识点进行详细阐述。 首先,Spark是当前工业生产中广泛应用的开源大数据分布式计算...

    spark快速大数据分析,高清带书签版

    Spark作为一款强大的分布式计算框架,以其内存计算的特性,大大提升了数据处理的速度,使得实时分析和复杂计算成为可能。这本书详细介绍了Spark的核心概念和技术,帮助读者掌握如何在大数据领域运用Spark进行高效的...

    spark-集群与大数据处理

    Spark是Apache软件基金会旗下的开源大数据处理框架,由加州大学伯克利分校的AMP实验室开发,是基于内存计算的大数据并行处理系统。它提供了高层次的APIs,比如Java、Scala、Python、R等,用于数据挖掘、机器学习、...

    sparkStreaming消费数据不丢失

    sparkStreaming消费数据不丢失,sparkStreaming消费数据不丢失

    Spark大数据分析与实战课后练习答案.rar

    《Spark大数据分析与实战》课程是一门深入探讨Apache Spark在大数据处理领域的应用和技术的课程,其课后练习答案集提供了对课程所讲授知识的巩固和实践。这是一份珍贵的配套教学资源,旨在帮助学生更好地理解和掌握...

    基于Spark的大数据分析平台的设计与实现

    本设计旨在构建一个基于Spark的大数据分析平台,该平台将利用Scala编程语言进行开发,通过Spark SQL对数据进行处理,并最终将处理后的结果存储到MySQL数据库中,以便后续的数据可视化及分析。 #### 二、关键技术...

    solaris spark内存模型

    根据提供的文件信息,本文将详细解析Solaris Spark内存模型的核心概念与原理,涵盖硬件内存模型与软件内存模型的关键知识点。 ### Solaris Spark 内存模型概述 #### 1. 引言 在共享内存的多处理器系统中,内存...

    项目实战——Spark将Hive表的数据写入ElasticSearch(Java版本)

    在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...

Global site tag (gtag.js) - Google Analytics