首页 > 其他分享 >spark RDD底层原理

spark RDD底层原理

时间:2023-05-31 12:04:39浏览次数:35  
标签:存储 cache Partition 个数 RDD spark Block 底层

RDD底层实现原理

RDD是一个分布式数据集,顾名思义,其数据应该分部存储于多台机器上。事实上,每个RDD的数据都以Block的形式存储于多台机器上,下图是Spark的RDD存储架构图,其中每个Executor会启动一个BlockManagerSlave,并管理一部分Block;而Block的元数据由Driver节点的BlockManagerMaster保存。BlockManagerSlave生成Block后向BlockManagerMaster注册该Block,BlockManagerMaster管理RDD与Block的关系,当RDD不再需要存储的时候,将向BlockManagerSlave发送指令删除相应的Block。

spark RDD底层原理_数据

图2 RDD存储原理

RDD cache的原理

RDD的转换过程中,并不是每个RDD都会存储,如果某个RDD会被重复使用,或者计算其代价很高,那么可以通过显示调用RDD提供的cache()方法,把该RDD存储下来。那RDD的cache是如何实现的呢?

RDD中提供的cache()方法只是简单的把该RDD放到cache列表中。当RDD的iterator被调用时,通过CacheManager把RDD计算出来,并存储到BlockManager中,下次获取该RDD的数据时便可直接通过CacheManager从BlockManager读出。

RDD dependency与DAG

    RDD提供了许多转换操作,每个转换操作都会生成新的RDD,这是新的RDD便依赖于原有的RDD,这种RDD之间的依赖关系最终形成了DAG(Directed Acyclic Graph)。

    RDD之间的依赖关系分为两种,分别是NarrowDependency与ShuffleDependency,其中ShuffleDependency为子RDD的每个Partition都依赖于父RDD的所有Partition,而NarrowDependency则只依赖一个或部分的Partition。下图的groupBy与join操作是ShuffleDependency,map和union是NarrowDependency。

spark RDD底层原理_数据_02

图3 RDD dependency

    

RDD partitioner与并行度

    每个RDD都有Partitioner属性,它决定了该RDD如何分区,当然Partition的个数还将决定每个Stage的Task个数。当前Spark需要应用设置Stage的并行Task个数(配置项为:spark.default.parallelism),在未设置的情况下,子RDD会根据父RDD的Partition决定,如map操作下子RDD的Partition与父Partition完全一致,Union操作时子RDD的Partition个数为父Partition个数之和。

    如何设置spark.default.parallelism对用户是一个挑战,它会很大程度上决定Spark程序的性能。


标签:存储,cache,Partition,个数,RDD,spark,Block,底层
From: https://blog.51cto.com/u_11908275/6385846

相关文章

  • spark context stop use with as
    调用方法:withsession.SparkStreamingSession('CC_Traffic_Realtime',ssc_time_windown)asss_session:kafkaStreams=ss_session.get_direct_stream(TOPICNAME)kafkaStreams.transform(xxxx)...ss_session.ready_to_go()实现方......
  • spark rdd median 中位数求解
    lookup(key)ReturnthelistofvaluesintheRDDforkey key.ThisoperationisdoneefficientlyiftheRDDhasaknownpartitionerbyonlysearchingthepartitionthatthekeymapsto.>>>l=range(1000)>>>rdd=sc.parallelize(zip(l,l......
  • python spark 求解最大 最小 平均 中位数
    rating_data_raw=sc.textFile("%s/ml-100k/u.data"%PATH)printrating_data_raw.first()num_ratings=rating_data_raw.count()print"Ratings:%d"%num_ratings#In[35]:rating_data=rating_data_raw.map(lambdaline:line.split(&quo......
  • pyspark
    一、pyspark为了让Spark支持Python,ApacheSpark社区发布了一个工具PySpark。使用PySpark,我们可以使用Python编程语言处理RDD。这一切是由一个名为Py4j的库达到的。其架构如下所示。PySpark的优势之一是在开发中允许你直接调用Python的内置库和第三方库如果Spark是本地模式,可以直接......
  • HashMap底层原理
    HashMap是Java中常用的数据结构之一,它提供了高效的键值对存储和检索功能。下面是HashMap底层的详细原理介绍:1.数据结构:HashMap底层使用数组和链表(或红黑树)的组合实现。它通过哈希算法将键转换为数组索引,并将值存储在对应索引位置上。2.哈希算法:当我们向HashMap中存储一个键值......
  • Spark入门看这篇就够了(万字长文)
    本文已收录至Github,推荐阅读......
  • synchronized底层原理
    synchronized对象锁采用互斥的方式使得在同一时刻只有一个线程能够持有锁并操作共享资源,如果其它线程想要获取锁就会进入阻塞状态,从而保证了线程安全问题。synchronized底层原理:synchronized的实现基于JVM的锁监视器(monitor),每个JVM都有维护自己的一套锁监视器,当集群部署时synchro......
  • 本地spark通过spark集群连接hive
    最近在学习spark,上周将spark集群搭建起来了,今天在idea中创建了一个测试程序读取hive库中的数据,程序很简单,但是踩到一些坑,卡了四五个小时,做个记录。搭建Spark集群比较简单:1、安装scala,scala版本要和spark使用的scala版本一致(因为这个问题卡了五六个小时)2、下载、解压,配置环境变......
  • SparkSQL
    目录SparkSQL数据抽象案例一:加载数据成分布式表案例二:将RDD转为DataFrame使用样例类指定类型+列名自定义Schema案例三:RDD-DF-DS相互转换案例四:SparkSQL花式查询需求一、SQL和DSL两种方式实现各种查询案例五:SparkSQL实现WordCount案例六:多数据源支持案例七:电影数据分析案例八:SparkS......
  • 在本地运行spark程序,出现Scala module 2.13.4 requires Jackson Databind version >=
    这是jackson多版本题,我们需要屏蔽所有hadoop组件中的Jackson,在pom.xml文件里修改:添加<exclusions><exclusion><groupId>com.fasterxml.jackson.module</groupId><artifactId>*</artifactId></exclusion><exclusion>......