Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spark在处理数据的时候,会将数据都加载到内存再做处理吗?

Spark在处理数据的时候,会将数据都加载到内存再做处理吗?

作者头像
大数据学习与分享
发布于 2020-09-14 08:44:39
发布于 2020-09-14 08:44:39
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD、SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗?

很显然,答案是否定的!

对该问题产生疑问的根源还是对Spark计算模型理解不透彻。

对于Spark RDD,它是一个分布式的弹性数据集,不真正存储数据。如果你没有在代码中调用persist或者cache算子,Spark是不会真正将数据都放到内存里的。

此外,还要考虑persist/cache的缓存级别,以及对什么进行缓存(比如是对整张表生成的DataSet缓存还是列裁剪之后生成的DataSet缓存)(关于Spark RDD的特性解析参考《Spark RDD详解》

既然Spark RDD不存储数据,那么它内部是如何读取数据的呢?其实Spark内部也实现了一套存储系统:BlockManager。为了更深刻的理解Spark RDD数据的处理流程,先抛开BlockManager本身原理,从源码角度阐述RDD内部函数的迭代体系。

我们都知道RDD算子最终会被转化为shuffle map task和result task,这些task通过调用RDD的iterator方法获取对应partition数据,而这个iterator方法又会逐层调用父RDD的iterator方法获取数据(通过重写scala.collection.iterator的hasNext和next方法实现)。主要过程如下:

首先看ShuffleMapTask和ResultTask中runTask方法的源码:

关键看这部分处理逻辑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rdd.iterator(partition, context)

getOrCompute方法会先通过当前executor上的BlockManager获取指定blockId的block,如果block不存在则调用computeOrReadCheckpoint,如果要处理的RDD没有被checkpoint或者materialized,则接着调用compute方法进行计算。

compute方法是RDD的抽象方法,由继承RDD的子类具体实现。

以WordCount为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sc.textFile(input)
  .flatMap(line => line.split(" "))
  .map(word => (word, 1))
  .reduceByKey(_ + _)
  .saveAsTextFile(output)
  1. textFile会构建一个HadoopRDD
  2. flatMap/map会构建一个MapPartitionsRDD
  3. reduceByKey触发shuffle时会构建一个ShuffledRDD
  4. saveAsTextFile作为action算子会触发整个任务的执行

以flatMap/map产生的MapPartitionsRDD实现的compute方法为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
override def compute(split: Partition, context: TaskContext): Iterator[U] =
    f(context, split.index, firstParent[T].iterator(split, context))

底层调用了parent RDD的iterator方法,然后作为参数传入到了当前的MapPartitionsRDD。而f函数就是对parent RDD的iterator调用了相同的map类函数以执行用户给定的函数。

所以,这是一个逐层嵌套的rdd.iterator方法调用,子RDD调用父RDD的iterator方法并在其结果之上调用Iterator的map函数以执行用户给定的函数,逐层调用直到调用到最初的iterator(比如上述WordCount示例中HadoopRDD partition的iterator)。

而scala.collection.Iterator的map/flatMap方法返回的Iterator就是基于当前Iterator重写了next和hasNext方法的Iterator实例。比如,对于map函数,结果Iterator的hasNext就是直接调用了self iterator的hasNext,next方法就是在self iterator的next方法的结果上调用了指定的map函数。

flatMap和filter函数稍微复杂些,但本质上一样,都是通过调用self iterator的hasNext和next方法对数据进行遍历和处理。

所以,当我们调用最终结果iterator的hasNext和next方法进行遍历时,每遍历一个数据元素都会逐层调用父层iterator的hasNext和next方法。各层的map函数组成一个pipeline,每个数据元素都经过这个pipeline的处理得到最终结果。

这也是Spark的优势之一,map类算子整个形成类似流式处理的pipeline管道,一条数据被该链条上的各个RDD所包裹的函数处理。

再回到WordCount例子。HadoopRDD直接跟数据源关联,内存中存储多少数据跟读取文件的buffer和该RDD的分区数相关(比如buffer*partitionNum,当然这是一个理论值),saveAsTextFile与此类似。MapPartitionsRDD里实际在内存里的数据也跟partition数有关系。ShuffledRDD稍微复杂些,因为牵扯到shuffle,但是RDD本身的特性仍然满足(记录文件的存储位置)。

说完了Spark RDD,再来看另一个问题:Spark SQL对于多表之间join操作,会先把所有表中数据加载到内存再做处理吗?

当然,肯定也不需要!

具体可以查看Spark SQL针对相应的Join SQL的查询计划,以及在之前的文章《Spark SQL如何选择join策略》中,针对目前Spark SQL支持的join方式,任何一种都不要将join语句中涉及的表全部加载到内存。即使是Broadcast Hash Join也只需将满足条件的小表完整加载到内存。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据学习与分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析
在博文《深入理解Spark 2.1 Core (七):任务执行的原理与源码分析 》我们曾讲到过:
小爷毛毛_卓寿杰
2019/02/13
1.1K0
深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析
Spark源码解析:RDD
0x00 前言 本篇是Spark源码解析的第一篇,主要通过源码分析Spark设计中最重要的一个概念——RDD。 本文会主要讲解RDD的主要概念和源码中的设计,并通过一个例子详细地讲解RDD是如何生成的和转换的。 文章结构 先回顾一下RDD的一些特征以及几个基本概念 RDD源码分析,整体的源码设计 举一个例子,通过这个例子来一步步地追踪源码。 0x01 概念 什么是RDD RDD(Resilient Distributed Dataset):弹性分布式数据集。 我们可以先大致这样理解RDD:RDD是一个
木东居士
2018/05/25
2.7K1
Spark 转换算子源码
可以从源码看出其入参是f: T ⇒ U 是一个函数,首先经过sc.clean(f) 进行闭包检测,然后创建一个MapPartitionsRDD。sc.clean()函数的作用检测用户构建的函数是否可以序列化,这是因为Spark中的map是一个分布式的函数,最终的执行是在Executor上开线程执行,而我们的函数构建都是在Driver端进行。Spark实际上进行的是计算的转移,将函数传递到数据所在的Worker节点。
Tim在路上
2022/03/23
1K0
Spark源码系列(二)RDD详解
1、什么是RDD? 上一章讲了Spark提交作业的过程,这一章我们要讲RDD。简单的讲,RDD就是Spark的input,知道input是啥吧,就是输入的数据。 RDD的全名是Resilient Distributed Dataset,意思是容错的分布式数据集,每一个RDD都会有5个特征: 1、有一个分片列表。就是能被切分,和hadoop一样的,能够切分的数据才能并行计算。 2、有一个函数计算每一个分片,这里指的是下面会提到的compute函数。 3、对其他的RDD的依赖列表,依赖还具体分为宽依赖和窄依赖,
岑玉海
2018/02/28
8690
Spark源码系列(二)RDD详解
Spark k-v类型转换算子
将传入的函数应用于value的算子,实质是创建了MapPartitionsRDD,并在调用迭代函数时,只将函数应用于value。
Tim在路上
2022/03/23
7940
Spark2.x学习笔记:3、 Spark核心概念RDD
程裕强
2018/01/02
1.4K0
Spark2.x学习笔记:3、 Spark核心概念RDD
美团图灵机器学习平台性能起飞的秘密(一)
美团图灵机器学习平台在长期的优化实践中,积累了一系列独特的优化方法。本文主要介绍了图灵机器学习平台在内存优化方面沉淀的优化技术,我们深入到源码层面,介绍了Spark算子的原理并提供了最佳实践。希望为读者带来一些思路上的启发。
美团技术团队
2022/12/16
5930
美团图灵机器学习平台性能起飞的秘密(一)
Spark 核心 RDD 剖析(下)
上文Spark 核心 RDD 剖析(上)介绍了 RDD 两个重要要素:partition 和 partitioner。这篇文章将介绍剩余的部分,即 compute func、dependency、preferedLocation
codingforfun
2018/08/24
2840
Spark源代码分析——谈RDD和依赖关系
为了更好地理解,这里我们使用HDFS上常见的HDFS实现:Hadoop RDD的实现。
jack.yang
2025/04/05
940
Spark源码和调优简介 Spark Core
作者:calvinrzluo,腾讯 IEG 后台开发工程师 本文基于 Spark 2.4.4 版本的源码,试图分析其 Core 模块的部分实现原理,其中如有错误,请指正。为了简化论述,将部分细节放到了源码中作为注释,因此正文中是主要内容。 Spark Core RDD RDD(Resilient Distributed Dataset),即弹性数据集是 Spark 中的基础结构。RDD 是 distributive 的、immutable 的,可以被 persist 到磁盘或者内存中。 对 RDD
腾讯技术工程官方号
2020/02/10
1.4K0
Spark源码和调优简介 Spark Core
原 荐 Spark框架核心概念
Spark框架核心概念     首先介绍Spark中的核心名词概念,然后再逐一详细说明。 RDD:弹性分布式数据集,是Spark最核心的数据结构。有分区机制,所以可以分布式进行处理。有容错机制,通过RDD之间的依赖关系来恢复数据。 依赖关系:RDD的依赖关系是通过各种Transformation(变换)来得到的。父RDD和子RDD之间的依赖关系分两种:①窄依赖②宽依赖。     ①窄依赖:父RDD的分区和子RDD的分区关系是:一对一。     窄依赖不会发生Shuffle,执行效率高,spark框架底层
云飞扬
2018/05/17
1.4K0
Spark详解02Job 逻辑执行图Job 逻辑执行图
Job 逻辑执行图 General logical plan GeneralLogicalPlan.png 典型的 Job 逻辑执行图如上所示,经过下面四个步骤可以得到最终执行结果: 从数据源(可以是
Albert陈凯
2018/04/08
1.1K0
Spark详解02Job 逻辑执行图Job 逻辑执行图
Spark之【RDD编程】详细讲解(No5)——《RDD依赖关系》
本篇博客是Spark之【RDD编程】系列第五篇,为大家介绍的是RDD依赖关系。
大数据梦想家
2021/01/27
4920
Spark之【RDD编程】详细讲解(No5)——《RDD依赖关系》
Spark Core入门2【RDD的实质与RDD编程API】
所以RDD不过是对一个函数的封装,当一个函数对数据处理完成后,我们就得到一个RDD的数据集(是一个虚拟的,后续会解释)。
Java架构师必看
2021/05/14
1.2K0
Spark Core入门2【RDD的实质与RDD编程API】
Spark详解06容错机制Cache 和 Checkpoint Cache 和 Checkpoint
Cache 和 Checkpoint 作为区别于 Hadoop 的一个重要 feature,cache 机制保证了需要访问重复数据的应用(如迭代型算法和交互式应用)可以运行的更快。与 Hadoop MapReduce job 不同的是 Spark 的逻辑/物理执行图可能很庞大,task 中 computing chain 可能会很长,计算某些 RDD 也可能会很耗时。这时,如果 task 中途运行出错,那么 task 的整个 computing chain 需要重算,代价太高。因此,有必要将计算代价较大的
Albert陈凯
2018/04/08
2.2K0
Spark详解06容错机制Cache 和 Checkpoint Cache 和 Checkpoint
深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析
在《深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析 》我们讲解了,以传统Hadoop MapReduce类似的从HDFS中读取数据,再到rdd.HadoopRDD.compute便可以调用函数f,即map中的函数的过程。在《深入理解Spark 2.1 Core (十):Shuffle map端的原理与源码分析》 我们深入讲解了sorter.insertAll(records),即如何对数据进行排序并写入内存缓冲区。
小爷毛毛_卓寿杰
2019/02/13
9600
深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析
Spark内核分析之Shuffle操作流程(非常重要)
        如题,我们来分析一下spark的shuffle操作原理;为什么说其非常重要,是因为shuffle操作是我们在Spark调优中非常重要的一环,对shuffle进行了优化,往往可以使得我们的spark程序运行效率有极大的提升。依照惯例,我们先来看一张图;
z小赵
2018/09/05
1.1K0
Spark内核分析之Shuffle操作流程(非常重要)
Spark源码系列(六)Shuffle的过程解析
Spark大会上,所有的演讲嘉宾都认为shuffle是最影响性能的地方,但是又无可奈何。之前去百度面试hadoop的时候,也被问到了这个问题,直接回答了不知道。 这篇文章主要是沿着下面几个问题来开展: 1、shuffle过程的划分? 2、shuffle的中间结果如何存储? 3、shuffle的数据如何拉取过来? Shuffle过程的划分 Spark的操作模型是基于RDD的,当调用RDD的reduceByKey、groupByKey等类似的操作的时候,就需要有shuffle了。再拿出reduceByKey这个
岑玉海
2018/02/28
1.6K0
Spark源码系列(六)Shuffle的过程解析
Spark原理 | 关于 mapPartitions 的误区
今天 Review 了一下同事的代码,发现其代码中有非常多的 mapPartitions,问其原因,他说性能比 map 更好。我说为什么性能好呢?于是就有了这篇文章。
大数据技术架构
2021/03/23
4.3K0
Spark RDD 分布式弹性数据集
rdd是一个粗粒度的数据生成方式和流转迭代计算方式的描述。它可以通过稳定的存储器或者从其他RDD生成,它并不需要急着进行转换,只需要在特定的rdd进行一次性的数据的迭代流转。rdd记录着自己的依赖关系,以防在数据丢失时可以通过“血缘”关系再次生成数据。用户也可以自己选择在经常重用的rdd进行数据落地,放置丢失后重做。
Tim在路上
2022/03/23
4090
Spark RDD 分布式弹性数据集
相关推荐
深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档