Spark
文章平均质量分 84
记录spark学习记录以及源码阅读的点点滴滴
小白数据猿
专注高并发,大数据,人工智能&机器学习
展开
-
Spark源码分析系列之RDD
面试过程中经常会遇到一个问题:谈谈你对Spark RDD的理解,你该如何回答呢?RDD是弹性数据集,是Spark的基础数据结构,然后呢,没了吗?那我觉得可能面试官觉得你应该处于最低级的水平,本文详细的介绍了RDD,面试过程中你如果按照下面的顺序进行描述RDD,面试官应该会对你刮目相看。概述RDD是(Resilient Distributed Dataset)弹性分布式数据集,Spark中数据的基本抽象,表示不可变的,分区的可以并行操作的元素集合。RDD有五大部分组成:分区集合: partitio.原创 2020-12-07 14:57:38 · 418 阅读 · 0 评论 -
Spark DAGScheduler源码分析系列之二: 事件处理器
概述DAGScheduler中处理任务提交,任务失败,增加节点,删除节点等事件是通过事件处理器进行的。EventLoop用来接收来自调用者的事件并在线程中处理所有的事件。这是一个典型的生产消费模型:生产者通过调用DAGSchedulerEventProcessLoop.post(event: E)来将消息进行发布;消费者Eventloop内部维护了一个线程,循环的消费消息eventQueue.take(),调用onReceive(event)进行处理。DAGSchedulerEventProcessLoo原创 2020-12-04 16:22:01 · 393 阅读 · 0 评论 -
Spark Shuffle源码分析系列之UnsafeShuffleWriter
前面我们介绍了BypassMergeSortShuffleWriter和SortShuffleWriter,知道了它们的应用场景和实现方式,本节我们来看下UnsafeShuffleWriter,它使用了Tungsten优化,排序的是二进制的数据,不会对数据进行反序列化操作,在某些情况下会加速Shuffle过程。概述UnsafeShuffleWriter提供了以序列化方式写入文件的方式,写入的内存既可以是on-heap也可以是off-heap,当数据到来时候,先序列化,然后使用序列化的数据排序,要想使.原创 2020-12-04 13:25:12 · 634 阅读 · 0 评论 -
Spark DAGScheduler源码分析系列之一: 基础
DAGSchedulerDAGScheduler是Spark中比较重要的类,实现了面向DAG的高层次调度,DAGScheduler通过计算将DAG中的一系列RDD划分到不同的Stage,然后构建这些Stage之间的父子关系,最后将每个Stage按照Partition切分为多个Task,并以TaskSet的形式提交给底层的TaskScheduler。所有的组件都通过向DAGScheduler投递DAGSchedulerEvent来使用DAGScheduler。DAGScheduler内部的DAGSchedu原创 2020-11-19 19:02:29 · 498 阅读 · 0 评论 -
Spark实战&源码分析系列,持续更新
基于spark 2.11的源码分析系列,不定时更新中、deployRDDRDD源码分析之PartitionRDD源码分析之Dependencystage划分任务调度&执行Spark Task执行流程源码分析系列之一: 基础Spark Task执行流程源码分析系列之二: 任务构建&调度&资源分配Spark Task执行流程源码分析系列之三: TaskSetManager分析Spark Task执行流程源码分析系列之四: 任务启动&运行&结果处理sh原创 2020-11-18 11:12:49 · 788 阅读 · 2 评论 -
Spark Task执行流程源码分析系列之四: 任务启动&运行&结果处理
上面几节我们分析了Task的构建和调度,本节我们将聚焦在Task的执行,会涉及到Task是如何启动起来的,具体的不同任务是如何执行的,执行得到的结果是如何处理的。Task启动首先我们来看下Task是如何启动的,Driver发送lauchTask消息给Executor,Executor的常驻进程CoarseGrainedExecutorBackend接收到Driver发送来的LaunchTask消息后,会解码任务信息,然后由Executor开始执行任务,Executor会对Task进行封装为TaskR.原创 2020-11-16 16:22:38 · 1013 阅读 · 0 评论 -
Spark Task执行流程源码分析系列之三: TaskSetManager分析
概述TaskSetManager是一个stage的任务集合的抽象,主要进行当前Stage任务集管理,跟踪每一个任务,进行失败重试,推测执行以及基于数据本地性的调度等,对外只提供两个接口,resourceOffer来判断是否在指定的executor上面执行任务,statusUpdate在任务成功或者失败时候,告知任务状态改变。本文将分析源码,解密它是如何进行调度任务执行,推测执行以及失败重试的。基本属性我们先来看下TaskSetManager的主要成员变量,主要是任务的管理相关的变量:taskSet原创 2020-11-16 15:42:39 · 1091 阅读 · 0 评论 -
Spark Task执行流程源码分析系列之二: 任务构建&调度&资源分配
上一节我们介绍了Task各个环节用到的主要数据结构,本节我们来看看Spark中一个Task是如何构建起来的,又是如何获取到资源,然后提交给集群相应的资源进行启动的。任务构建&提交Spark job内部是通过DAG来维护血缘关系的,通过shuffle算子进行stage的划分,上游stage计算完成后,下游stage才能进行,在一个stage中有多个任务需要执行,划分完stage后就会对同一个stage的任务集合进行提交,然后分配资源执行任务,我们先来看下任务提交入口,步骤如下:首先清空需要.原创 2020-11-15 17:21:49 · 774 阅读 · 0 评论 -
Spark Task执行流程源码分析系列之一: 基础
Spark的最重要的目的是进行Task的执行,涉及到调度,任务执行,资源分配等多个环节,涉及到多个模块,本文对Task从构建,提交,执行以及执行结果返回各个环节中用到的主要结构进行简单的描述,为后续源码分析做个铺垫。调度相关DAGSchedulerDAGScheduler是面向DAG的高层次调度,即将DAG中的各个RDD划分到不同的Stage。DAGScheduler可以通过计算将DAG中的一系列RDD划分到不同的Stage,然后构建这些Stage之间的父子关系,最后将每个Stage按照Parti.原创 2020-11-13 17:45:37 · 562 阅读 · 0 评论 -
Spark Shuffle源码分析系列之ShuffleReader 二
上一节我们分析了ShuffleReadTask是如何获取数据位置,得到各个块数据的,本节我们继续分析Spark对数据是如何存储、聚合、排序,然后供后续算子使用的。概述上一节我们讲到了ShuffleReduce任务获取数据的迭代器,那么获取来的数据存放到哪里?刚fetch来的FileSegment存放在缓冲区,经过解压缩和反序列化,如果shuffle算子规定了需要聚合操作,则要使用ExternalAppendOnlyMap进行数据聚合,优先在内存中使用SizeTrackerAppendOnlyMap进.原创 2020-11-07 13:02:27 · 680 阅读 · 0 评论 -
Spark Shuffle源码分析系列之ShuffleReader 一
Shuffle涉及到三方面问题:Shuffle write写过程,中间数据记录过程以及Shuffle read读过程,上面几节我们分析了write和中间记录过程,本文将聚焦在Shuffle read部分。ShffuleRead什么时候进行数据读取?ShuffleMap产生的数据如何拉取过来?拉取过来的数据如何存储和处理?本节我将通过源码分析来解答这些问题。问题ShuffleRDD是何时产生的?Shuffle-ReduceTask在什么时候开始执行,是等parent stage中的一个Shuffl.原创 2020-11-06 10:45:09 · 1305 阅读 · 0 评论 -
Spark Shuffle源码分析系列之SortShuffleWriter
上一节我们分析了BypassMergeSortShuffleWriter,它是Hash风格的ShuffleWriter,主要适用于不需要map-side聚合排序,并且分区数目小于spark.shuffle.sort.bypassMergeThreshold<默认200>;本节我们来介绍SortBased-ShuffleWriter,它可以处理map端的聚合排序操作,是默认的ShuffleWriter。ShuffleMapTask整体流程Spark中负责具体的Shuffle Map端执行任.原创 2020-11-04 13:39:29 · 687 阅读 · 0 评论 -
Spark Shuffle源码分析系列之BypassMergeSortShuffleWriter
BypassMergeSortShuffleWriter实现了Hash风格的Shuffle机制,和已经废弃的HashShuffleWriter类似。这个shuffle writer将传入的record写入单独的文件,每个reduce partition对应一个文件,然后拼接这些文件汇总成一个单独的输出文件。这个输出文件按照partitionId分成多个区域,并生成相应的索引文件,Reducer会根据索引问价中各个partitionId的偏移量来fetch对应的数据。BypassMergeSortShu.原创 2020-10-31 22:57:42 · 645 阅读 · 0 评论 -
Spark Shuffle源码分析系列之PartitionedPairBuffer&PartitionedAppendOnlyMap
概述SortShuffleWriter使用ExternalSorter进行ShuffleMapTask数据内存以及落盘操作,ExternalSorter中使用内存进行数据的缓存过程中根据是否需要map-side聚合以及是否需要排序来选择不同的内存存储方式,分别为PartitionedPairBuffer和PartitionedAppendOnlyMap。我们先看下两种数据结构的异同点:PartitionedAppendOnlyMap中数据存储在父类AppendOnlyMap的data数组中,Parti原创 2020-10-29 14:44:09 · 1231 阅读 · 4 评论 -
Spark Shuffle源码分析系列之AppendOnlyMap
AppendOnlyMap是spark自己实现的HashMap,与java自身的HashMap不同,它只能添加数据,不能remove,同时支持在内存中对任务执行结果进行聚合运算,本节我们来看下这个数据结构。整体结构AppendOnlyMap本质是一个HashMap,内部使用数组来存储数据,它的key-value是使用数组中相邻的两个元素进行存储的,如下图所示:我们来看下源码中相关存储以及容量的定义:val MAXIMUM_CAPACITY = (1 << 29)private v.原创 2020-10-28 13:42:19 · 1001 阅读 · 0 评论 -
Spark Shuffle源码分析系列之Shuffle分析准备工作
Spark Shuffle源码分析系列之Shuffle介绍&演进过程介绍了Shuffle的演进过程,本文将介绍shuffle过程中使用到的基础类shuffleManager,ShuffleWriter ,ShuffleReader , ShuffleHandle, ShuffleBlockResolver的实现,为后续进行Map-Reduce实现分析打下基础。ShuffleManager概述ShuffleManager是Spark系统中可插拔的Shuffle系统接口,ShuffleManage原创 2020-10-26 20:42:32 · 535 阅读 · 0 评论 -
Spark存储管理源码分析系列之BlockManage块写入分析
上一节我们讲述了BlockManager是如何进行数据获取的,当需要的数据还没有计算时候,就需要先生成相应的Block数据,本节我们就来看下BlockManager是怎么把数据写入到Spark存储中的。写入入口BlockManager将读取和写入统一入口在getOrElseUpdate,会先从本地&远端获取数据,如果没有,就进行写入操作,写入成功,读取本地数据返回给使用方,如下所示:def getOrElseUpdate[T]( blockId: BlockId, level: Sto原创 2020-10-25 21:35:38 · 299 阅读 · 0 评论 -
Spark存储管理源码分析系列之BlockManage块读取分析
BlockManager会运行在Spark集群中的所有节点上,每个节点上的BlockManager通过MemoryManager、 MemoryStore、 DiskBlockManager、 DiskStore来管理其内存、磁盘中的块,并与其他节点进行块的交互。所以块的读和写入是其最主要的功能,接下来两节我们来分析下读取和写入的具体实现,本节我们先来聊聊读取块数据。块读取概述在BlockManager中提供了多种对块进行读写的方法,getOrElseUpdate将读写进行统一,块可以由RDD计算逻辑[原创 2020-10-24 22:33:46 · 658 阅读 · 0 评论 -
Spark存储管理源码分析系列之BlockManage初探
前面我们详细分析了Spark存储体系里面数据的表示,节点的通信,数据的存储过程,本节我们来看下存储体系里面的核心类BlockManager,BlockManager是spark自己的存储系统,RDD-Cache、 Shuffle-output、broadcast等的实现都是基于BlockManager来实现的,BlockManager也是分布式结构,在Driver和所有Executor上都会有blockmanager节点,每个节点上存储的block信息都会汇报给driver端的BlockManagerMa.原创 2020-10-23 20:00:03 · 458 阅读 · 0 评论 -
Spark存储管理源码分析系列之BlockManagerMessages消息处理
前面我们分析了Block的唯一标识,数据的抽象表示,BlockInfo的管理,Block的存储磁盘以及存入内存的各种功能,本节我们来看一下Driver和Executor是如何进行Block的消息通信和统一管理集群中的Block信息的。BlockManagerInfoDirver端会有一个HashMap来记录每个BlockManager上的元数据信息,元数据信息是用BlockManagerInfo来抽象表示的,它管理了该BlockManager管理的所有block的BlockStatus以及堆内,堆外.原创 2020-10-23 16:05:24 · 409 阅读 · 0 评论 -
Spark Shuffle源码分析系列之MapOutputTracker
MapOutputTracker是spark环境的主要组件之一,其功能有三方面,首先DAGScheduler使用MapOutputTrackerMaster来管理各个ShuffleMapTask的输出数据[MapStatus],另外根据各ShuffleMapTask结果的统计信息来进行尽可能的本地化Scheduler;其次ShuffleMapStage使用MapOutputTrackerMaster来判断是否要进行ShuffleMapTask的计算;最后ShuffleReduce任务用来获取从哪些exec.原创 2020-10-22 14:45:30 · 810 阅读 · 0 评论 -
spark存储管理源码分析系列之MemoryStore
内存池MemoryPool是对存储内存的具体管理,内存管理器MemoryManager是提供给外界进行管理内存的接口,而MemoryStore是用来将数据块保存到申请的storage内存中,并提供了从内存获取保存的数据的方法。在storage内存不足时,负责将内存中保存的数据刷新到磁盘上并释放占用的内存。MemoryStore在保存数据之前,会调用MemoryManager的相关acquire方法,判断StorageMemoryPool中是否有足够的内存可以分配,如果可用内存不足则直接返回false,由调.原创 2020-10-16 09:14:57 · 637 阅读 · 0 评论 -
spark存储管理源码分析系列之DiskStore
上一节我们分析了DiskManagerManager,它负责Block逻辑块的目录管理,本节将介绍DiskStore,它是真正负责磁盘存储的组件,用来保存block数据到磁盘中,负责数据写入,读取,删除操作,使用NIO ByteBuffer,MappedByteBuffer,FileChannel等黑科技加速文件写入读取,读取到的数据使用抽象的BlockData来表达,然后供使用方使用。BlockDataBlockData是一个松散的Scala特征,是DiskStore读取磁盘文件的数据组织形式,其.原创 2020-10-15 19:58:54 · 332 阅读 · 0 评论 -
spark存储管理源码分析系列之DiskBlockManager
前面我们了解了Spark存储的底层块数据Block的相关数据结构以及块管理器BlockInfoManager,本节我们来看下DiskBlockManager,它主要负责维护块数据在磁盘上存储位置的关系,负责数据目录规划,然后通过DiskStore进行数据写入,读取,删除操作。DiskBlockManagerDiskBlockManager负责维护块数据与其在磁盘上存储位置的关系,创建了二级目录来维护逻辑block和落地后的block文件的映射关系的,二级目录用于对文件进行散列存储,散列存储可以使所有.原创 2020-10-14 18:20:05 · 610 阅读 · 0 评论 -
spark存储管理源码分析系列之BlockInfoManager
BlockId定义了块的唯一标识,BlockInfo是块信息的管理,本节将介绍块信息管理器BlockInfoManager,BlockInfoManager对Block的锁管理,采用了共享锁与排他锁,其中读锁是共享锁,写锁是排他锁。BlockInfoManager属性BlockInfoManager的成员属性有以下几个:infos:存储BlockId -> BlockInfo对应关系,包含了MemoryStore以及DiskStore管理的Block。writeLocksByTask:每.原创 2020-10-14 11:28:40 · 297 阅读 · 0 评论 -
spark存储管理源码分析系列之Block
Spark中的Cache, Shuffle-output, 以及Broadcast的实现都是基于BlockManager来实现,BlockManager提供了数据存储[内存/文件存储]接口。BlockManager是通过Block来组织和管理数据的,块的唯一标识是BlockId;BlockManager控制块数据的写入和读取,数据的表达方式是ManagerBuffer;另外BlockManager需要对Block元信息进行管理,元信息的维护是通过BlockInfo来进行的,本节我们就来看一下这三部分的实现.原创 2020-10-13 14:08:07 · 808 阅读 · 2 评论 -
spark内存管理源码分析系列之执行内存管理器TaskMemoryManager
Spark中Task的执行内存是通过TaskMemoryManger统一管理的,不论是ShuffleMapTask还是ResultTask,Spark都会生成一个专用的TaskMemoryManger对象,然后通过TaskContext将TaskMemoryManger对象共享给该task attempt的所有memory consumers。 TaskMemoryManger自建了一套内存页管理机制,并统一对ON_HEAP和OFF_HEAP内存进行编址,分配和释放。概述TaskMemoryMang.原创 2020-09-29 11:38:58 · 818 阅读 · 0 评论 -
spark源码分析之Broadcast
Broadcast简介&使用在Spark程序中,经常会遇到算子函数中使用较大的外部变量的场景。由于在算子函数中使用到外部变量时,默认情况下,Spark会将该变量复制多个副本,通过网络传输到task中,此时每个task都有一个变量副本。如果变量本身比较大的话[比如100M,甚至1G],那么大量的变量副本在网络中传输的性能开销,以及在各个节点的Executor中占用过多内存导致的频繁GC,都会极大地影响性能。因此对于上述情况,如果使用的外部变量比较大,Spark提供的广播功能,对该变量进行广播,会提升原创 2020-09-27 14:04:14 · 1046 阅读 · 0 评论 -
spark内存管理源码分析系列之详解UnifiedMemoryManager
上一讲我们介绍了MemoryManager以及具体的实现类StaticMemoryManager,知道了StaticMemoryManager的优势和缺点,本节我们继续介绍具体实现类UnifiedMemoryManager,它实现相对StaticMemoryManager内部实现会复杂点,不过用户使用会更省心些,它可以在存储内存和执行内存之间进行互相借用内存,让用户可以在不具备内存调参经验情况下也能很好的降低OOM的风险。UnifiedMemoryManagerUnifiedMemoryManage.原创 2020-09-24 16:24:43 · 594 阅读 · 0 评论 -
spark内存管理源码分析系列之MemoryManager
上一篇我们分析了执行内存池和存储内存池,它们是内存的抽象,负责记录内存的使用情况,不负责直接的内存管理。Spark 为存储内存和执行内存的管理提供了统一的接口MemoryManager,同一个 Executor 内的任务都调用这个接口的方法来申请或释放内存。Spark1.6前,采用的静态内存管理机制,存储内存、执行内存和其他内存的大小在 Spark 应用程序运行期间均为固定的,但用户可以应用程序启动前进行配置,在Spark 3.0中Spark移除了StaticMemoryManager,详见SPARK-2.原创 2020-09-22 13:49:32 · 628 阅读 · 0 评论 -
spark内存管理源码分析系列之详解内存池
内存池是Spark内存的抽象,它记录了总内存大小,已使用内存大小,剩余内存大小,提供给MemoryManager进行分配/回收内存。它包括两个实现类:ExecutionMemoryPool和StorageMemoryPool,分别对应execution memory和storage memory。当需要新的内存时,spark通过memoryPool来判断内存是否充足。需要注意的是memoryPool以及子类方法只是用来标记内存使用情况,而不实际分配/回收内存。原创 2020-09-21 00:02:07 · 516 阅读 · 0 评论 -
spark内存管理源码分析系列之内存管理概述
Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色。理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优。本文介绍了Spark的内存框架以及介绍了Spark的哪些模块使用到了内存管理功能,Driver端内存管理比较简单,所以后续的分析都专注于Executor端的内存管理。原创 2020-09-20 17:49:59 · 316 阅读 · 0 评论 -
Spark Shuffle源码分析系列之Shuffle介绍&演进过程
Shuffle是什么在spark源码分析之stage生成中,我们讲到Spark在DAGSchduler阶段会将一个Job划分为多个Stage,在上游Stage做map工作,下游Stage做reduce工作,其本质上还是MapReduce计算框架。Shuffle是连接map和reduce之间的桥梁,它将map的输出对应到reduce输入中,这期间涉及到序列化反序列化、跨节点网络IO以及磁盘读写IO等,所以说Shuffle是整个应用程序运行过程中非常昂贵的一个阶段,理解Spark Shuffle原理有助于优化原创 2020-05-13 09:46:02 · 777 阅读 · 0 评论 -
Spark数据处理实战之聚合
spark dataset/dataframe经常会用到聚合函数进行指标的聚合计算,本文详细讲解了聚合函数,聚合算子,方便使用者清晰的认识如何进行聚合操作。聚合函数org.apache.spark.sql.functions._ 所有的聚合函数都可以通过两种方式调用,以Column为参数或者以columnName为参数,例如avg(Column e)和avg(String col...原创 2020-04-27 10:23:21 · 1346 阅读 · 0 评论 -
Spark数据处理实战之列空值&新增列处理
在spark dataset/dataframe操作过程中,我们经常会遇到对于一个列值的一些判断情况,是否为NULL,创建一个新列等,本文讲解了常用的增加列的方法,并且对于列空值判断,填充处理以及查询的api做了详细的描述和实例讲解,阅读完可以掌握列的处理相关方法。增加列Spark dataframe提供了withColumn函数来进行添加列或者替换列<指定的列名字跟之前的一样时候&...原创 2020-04-27 10:11:25 · 4785 阅读 · 0 评论 -
Spark core数据读取&存储实战
前言spark sql[spark 1.0.0]出现之前,数据的读取是通过sparkContext得到的是RDD,数据的存储是通过不同类型RDD的saveXXX方法存储的,Spark的整个生态系统与Hadoop是完全兼容的,所以对于Hadoop所支持的文件类型或者数据类型,Spark也同样支持。另外,由于Hadoop的API有新旧两个版本,所以Spark为了能够兼容Hadoop所有的版本,也提供...原创 2019-11-21 18:35:31 · 502 阅读 · 0 评论 -
Spark 2.x读取&存储数据实战
前言Spark是基于Hadoop生态圈二次构建的,它支持多种输入输出源,spark可以通过Hadoop MapReduce 所使用的InputFormat 和 OutPutFormat 接口访问数据,而大部分常见的文件格式与存储系统(S3, HDFS, Cassandra, HBase 等)都支持这种接口。数据读取与存储在spark 2.x之前是通过sqlContext/hiveConte...原创 2019-11-20 10:43:40 · 925 阅读 · 0 评论 -
一文让你了解DataSet处理Sql的各种实战技巧
概述项目中经常会用到sql相关操作,如果利用createTempView建立临时表,纯写sql方式实现是一种常用的方法,但是如何利用原生的算子进行sql的各种操作,经常摸不着头脑,本来基于spark 2.1.1进行原生算子进行sql常见操作的实战。数据构造原始数据原始数据包含五个字段,通过toDF指定column名字进行改名操作,最后我们建立了一个临时表,作为后文的sql语言和算子进行同样...原创 2019-11-06 17:48:51 · 2824 阅读 · 0 评论 -
Spark-Row实战&源码分析
前言spark在操作dataset/dataframe时候,经常需要对每一行数据进行处理,像map/mapPartition/foreach/ foreachParition等,那么我们在拿到一行数据时候,如何从中拿取出我们想要的列,然后进行相关业务操作,经常摸不着头脑,本文基于spark 2.1.1分析了一行数据的表达,以及详细的讲解了各种操作拿取行中相应列数据的方法。Row实战操作根据a...原创 2019-11-06 11:05:19 · 1538 阅读 · 0 评论 -
Spark DAGScheduler源码分析系列之三: Job提交&Stage划分&提交
概述 spark主程序中当遇到action算子的时候,就会提交一个job。一个job通常包含一个或多个stage,各个Stage之间存在着依赖关系,下游的Stage依赖于上游的Stage,Stage划分过程是从最后一个Stage开始往前执行的,最后一个Stage的类型是ResultStage。ResultStage可以使用指定的函数对RDD中的分区进行计算并得到最终结果。 本文...原创 2019-10-25 12:02:26 · 437 阅读 · 0 评论