图解spark
文章平均质量分 78
DrawnBreak
这个作者很懒,什么都没留下…
展开
-
spark的master、worker、exeuctor容错机制
我们看下spark是怎么针对master、worker、executor的异常情况做处理的。容错机制-exeuctor退出首先可以假设worker中的executor执行任务时,发送了莫名其妙的异常或者错误,然后对应线程消失了。我们看这个时候会做什么事情上图总结下来就是:executor由backend进程包着,如果抛异常,他会感知到,并调用executorRunner.exitStatus(), 通知worker看下通知worker之后发生了什么:worker会通知master,mas原创 2021-02-15 01:22:22 · 655 阅读 · 2 评论 -
图解spark-local模式运行原理
local部署模式首先spark运行时有4个角色,如下:Driver:应用驱动程序, 是spark集群的客户Master:Spark的主控节点,是spark集群的老板Worker:Spark的工作节点,是集群的各个节点主管Executor:Spark的工作进程,由worker监管,负责具体任务的执行简单local模式运行流程(无集群)我们先看下启动任务前, driver和executor之间,简单发生了什么(注意local模式下,executor是在driverApp里面的):loca原创 2021-01-31 17:23:43 · 826 阅读 · 1 评论 -
图解spark之spark如何做reduce时的数据拉取
spark的reduce过程究竟做了什么呢?我们可以看一下:先拉取数据,在聚合,最后会调上一章讲map操作时的insertAll方法即缓存结果的方法。如何做reduce聚合没啥好说的,我们看下他是怎么读取中间计算结果的1.从BlockManage处获取map任务的状态信息首先会试图获取任务的状态信息,以确认当前从哪里读取数据我们看下是从具体的获取信息过程:可以看到有以下关键点:reduce的上游任务节点状态一开始是不确定的, 如果没有需要自己根据shuffleId去拉取过来。取状态信原创 2021-01-24 00:48:31 · 893 阅读 · 0 评论 -
图解spark之map端计算结果缓存
当spark中做完一次map操作,准备发给下游时,究竟会做什么事呢?我按照一些问题来逐步分析。首先有个问题:map操作之后,数据是直接缓存到内存或者磁盘,等待下游client来拉取吗?spark是批处理,假设正好map处理完一批数据,会调用insertAll方法去做缓存,然而缓存并不是那么简单的存储,而是如下:可以看到,spark会判断这个map操作之后,是否会接一个聚合的操作,如果有,那么会在缓存并准备发给下游时时,提前做好聚合操作, 否则就是简单缓存。我们先看下简单缓存的分支:可以看到在这原创 2021-01-21 00:19:29 · 456 阅读 · 0 评论 -
图解Spark和mapreducer在shuffle时的区别
书中以经典的wordCount为例子wordCount就是计算文本中a-z字母的个数,利用分布式计算的能力mapreduce做wordCount标红的地方就是关键点, mapreducer做map后直接落盘了, 落盘后进行排序,排序完取出相同键的组发送,到resultTask做聚合计算。其实不太懂mapreduce早期为什么这么做,是因为那时候还不知道怎么在内存和磁盘间切换吗?早期spark的wordCount计算标红的地方是一个关键点。map后优先根据key存到内存中, 并拆成1个个bu原创 2020-12-01 00:22:40 · 217 阅读 · 0 评论 -
图解Spark的task是怎么分发到各节点上并执行的
假设此时已经构建好DAG划分好stage,接着就是要分发task了。当运行submitTask时,有如下的过程:上图可以看到,每次都会新建一个专门的taskManager,都运行ok后就会消失,并不是独立持续存在的一个角色。reviveOffers具体做什么的呢?看一下可以看到reciveOffer主要是做worker资源分配的。workerOffer列表一般需要做随机处理,避免一直分给同一个各机器上的CPU核数在分配的考虑范围之内。spark每次可能会有多个TaskSetManager原创 2020-07-06 00:27:17 · 2210 阅读 · 0 评论 -
图解spark的任务构建和提交流程
简述spark的任务运行流程先是在写spark代码的时候,背后做一些RDD的转换,写完后构建DAG,划分stage, 然后提交到资源管理器分配计算资源, 并在worker上执行。首先写spark代码时离不开对RDD的调用,那么:为什么需要RDD数据处理模型统一:RDD是1个数据结构, 能够获取数据的分区。不区分流式还是批式,只理解为1个数学模型。依赖划分原则:RDD之间通过窄依赖(仅1个依赖)和宽依赖(多依赖)进行关联。为什么要划分依赖?依赖数量不同,决定是否能在1个stage原创 2020-07-02 00:00:24 · 520 阅读 · 0 评论