自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 收藏
  • 关注

转载 Spark系列---SparkSQL动态与反射方式创建DataFrame(Java、Scala版本)

1.动态创建Scheme将非json格式RDD转换成DataFrame,推荐scala版本package com.kevin.scala.dataframe import org.apache.spark.sql.types._import org.apache.spark.sql.{RowFactory, SQLContext}import org.apache.spark.{SparkConf, SparkContext} /** * 动态创建Scheme将非json格式RDD转换成

2021-12-19 16:10:58 507

原创 Spark源码——CheckPoint原理

(图片来源:北风网)找到RDD的iterator方法/** * Internal method to this RDD; will read from cache if applicable, or otherwise compute it. * This should ''not'' be called by users directly, but is available for implementors of custom * subclasses of RDD. */.

2021-12-17 15:20:07 1942

原创 Spark源码——BlockManager

(图片来源:北风网)源码所在目录:首先进入BlockManagerMasterEndpoint看看/** * BlockManagerMasterEndpoint is an [[ThreadSafeRpcEndpoint]] on the master node to track statuses * of all slaves' block managers. */BlockManagerMasterEndpoint 是主节点上的 [[ThreadSafeRpcEndpoint]].

2021-12-17 14:23:10 2099

转载 Spark源码——Shuffle过程

shuffle很重要,调优的重点、性能的杀手未优化的shuffle:(图片来源:北风网)未优化的shuffle有两个特点:spark早期版本中,shuffleMapTask将所有数据写入bucket缓存后,才会刷新到磁盘,但是缓存就容易OOM,所以后来的版本,这个缓存设置了阈值,默认100kb,写入数据达到缓存的阈值后,就会将数据刷新到磁盘。这种就不容易OOM,但是频繁刷新涉及过多IO操作,所以这个阈值也是性能优化的一个点和MapReduce不同,MapReduce需要将所有数据写入本地磁盘文

2021-12-16 18:16:11 251

原创 Spark源码——Task执行原理

(图片来源:北风网)从TaskRunner入手进入它的run方法override def run(): Unit = { threadId = Thread.currentThread.getId Thread.currentThread.setName(threadName) val threadMXBean = ManagementFactory.getThreadMXBean val taskMemoryManager = new TaskMem.

2021-12-15 21:24:27 1237

原创 Spark源码——Executor

在Worker中启动Executor,实际上是启动了oarseGrainedExecutorBackend其中有个receive方法,是接收Driver注册成功executor之后返回的下消息。override def receive: PartialFunction[Any, Unit] = { case RegisteredExecutor => logInfo("Successfully registered with driver") try {

2021-12-15 12:30:57 807

原创 Spark源码——TaskScheduler

在上一篇文章的最后,当stage划分完了,task计算好了最佳位置,就要调用taskScheduler.submitTasks,创建taskSet对象并提交 if (tasks.size > 0) { logInfo("Submitting " + tasks.size + " missing tasks from " + stage + " (" + stage.rdd + ")") stage.pendingPartitions ++= tasks.map(_.parti

2021-12-15 11:23:36 818

原创 Spark源码——Job全流程以及DAGScheduler的Stage划分

(图片来源:北风网)进去RDD,随便点击一个action操作,比如foreach操作 /** * Applies a function f to all elements of this RDD. */ def foreach(f: T => Unit): Unit = withScope { val cleanF = sc.clean(f) sc.runJob(this, (iter: Iterator[T]) => iter.foreach(clea.

2021-12-14 21:49:50 463

原创 Spark源码——Worker原理

解释:1、master要求worker启动driver和executor2、worker启动driver的一个基本的原理,worker会启动一个线程DriverRunner,然后DriverRunner会去负责启动driver进程,然后在之后对driver进程进行管理3、worker启动executor的一个基本的原理,worker会启动一个线程ExecutorRunner,然后ExecutorRunner会去负责启动executor进程,然后在之后对executor进程进行管理4、driver首.

2021-12-14 17:05:40 554

转载 Spark源码——Master资源调度

原理解释:1、首先判断master的状态不是alive的话直接返回,也就是说,standby master是不会进行application等资源的调度的2、对取出workers中所有注册上来上的worker,进行过滤,必须是状态为alive的worker,调用rondom的shuffle方法进行随机的打乱(从第三个worker进行shuffle)3、遍历活着的worker,启动driver,将driver加入都内存缓冲结构中,并将driver从等待的driver的队列中移除4、在workers上启动

2021-12-14 14:53:34 125

转载 Spark源码——Master状态改变

executor状态改变(ExecutorStateChanged)1、找到executor对应的applicaiton,然后再反过来通过applicaiton内部的executors缓存获得executor信息2、设置executor的当前状态为LAUNCHING状态,并向driver同步发送ExecutorUpdated消息3、如果executor的状态已经发生变化,从application中移除executor,从运行中executor对应的worker中移除executor4、判断如果ex.

2021-12-13 22:41:04 105

原创 Spark源码——注册机制

worker向master注册worker在启动之后,就会向master进行注册对于worker状态为DEAD的,过滤掉。在compeleRecover()中,master在一定时间期限已经完成了恢复,但是发现其中的worker为UNKNOWN的情况下,对worker进行remove,将worker的状态设置为DEAD,如果过了很长时间worker又莫名其妙的向master进行注册的情况下,直接过滤掉。对于worker状态为UNKNOWN,master会将旧的worker信息给清理掉,替换

2021-12-13 22:10:13 624

原创 Spark源码——Master主备切换

Master主备切换Master的主备切换分为两种:基于文件系统和基于zookeeper基于文件系统的,spark提供目录保存spark Application和worker的注册信息,并将他们的恢复状态写入该目录,当spark的master节点宕掉的时候,重启master,就能获取application和worker的注册信息。需要手动进行切换基于zookeeper的,用于生产模式。其基本原理是通过zookeeper来选举一个Master,其他的Master处于Standby状态。将Standal

2021-12-13 19:27:55 590

原创 Spark源码——SparkContext

图片来源三个重点:TaskScheduler,如何注册的Application、Executor如何反注册DAGSchedulerSparkUITaskSchedulerSparkContext.createTaskScheduler返回一个tuple。追踪进createTaskScheduler:可以看到三个形参,其中master是启动模式,针对不同的master会match不同的启动逻辑看一下standalone模式可以看到,首先创建了TaskSchedulerImpl.

2021-12-12 22:53:01 323

原创 Spark内核架构

当我们在服务器执行spark-submit命令后,会将我们的程序提交到spark集群中然后发生下面的事情:启动Driver进程,执行我们的Application我们的程序中会写sparkconf和sparkcontext,所以Driver会初始化SparkContext初始化SparkContext会构造出DAGScheduler和TaskSchedulerTaskTracker会连接集群的Master,注册ApplicationMaster接收到注册请求后,使用资源调度算法,在Spark集群

2021-12-12 18:05:06 1085

原创 Spark学习记录

打算花一到两个月的时间,重新学习Spark,从应用,到源码。

2021-12-07 22:50:42 57

原创 MRv2中的数据处理引擎

MRAppMaster仍采用了MRv1中的数据处理引擎,分别由MapTask和Reduce Task完成Map任务和Reduce 任务,但MRv2做了优化,主要是在shuffle阶段。(1)Map端:用Netty代替JettyMRv1中,TaskTracker采用了Jetty服务器处理来自各个Reduce Task的数据请求,Jetty性能较低,所以改用了Netty。(2)Reduce端:批拷贝MRv1中,shuffle的时候Reduce Task会为每个数据分片建立一个专门的HTTP连接,即

2021-12-06 14:03:37 930

原创 MapReduce On Yarn

MRAppMaster基本架构MRAppMaster是MR的ApplicationMaster实现,使得MR应用程序可以直接运行在YARN之上,在YARN上,MRAppMaster负责管理MR作业的生命周期,包括作业管理、资源申请与再分配、Container启动与释放、作业恢复等。ContainerAllocator:和RM通信,为MR作业申请资源。周期性和RM通信,RM通过心跳应答的方式为之返回已经分配的Container列表、完成的Container列表等信息ClientService:是一

2021-12-06 13:06:55 174

原创 NodeManager概述

架构NodeStatusUpdate:NM和RM通信的唯一通道,NM启动时,该组件和RM注册,汇报节点上的总可用资源;之后,该组件周期性和RM通信,汇报各个Container的状态更新,包括节点上正运行的Container、已完成的Container等信息,同时RM会为之返回待清理的Container列表、待清理应用程序列表、诊断信息、各种Token。ContainerManager:ContainerManager由多个子组件构成,协同管理运行再该节点上的所有Container。RPC

2021-12-05 17:11:06 917

原创 YARN资源调度

资源调度模型(1)双层资源调度模型YARN采用双层资源调度模型,第一层,RM中的资源调度器将资源分配给各个AM,第二层,AM将资源分配给内部的任务。YARN的资源分配是异步的,资源调度器将资源分配给一个应用程序后,不会立刻push到AM,而是放到缓冲区里,等待AM通过周期性的心跳主动来取,即YARN采用了pull-based通信模型。YARN资源分配过程:NM通过周期性心跳汇报节点信息RM为NM返回一个心跳ack,包括需要释放的Container列表等信息。RM收到NM的信息后,触发一个N

2021-12-05 15:44:52 2270

原创 YARN的容错机制

MRv1中采用的Master/Slave架构,存在单点故障问题,作为分布式系统,YARN具备高容错性,各个服务组件的容错机制如下:ApplicationMaster容错:RM监控AM的运行状态,一旦发现它运行失败或者超时,就会重新分配资源并启动它,启动之后AM内部的状态如何恢复由自己保证,比如MRAppMaster在作业运行过程中将状态信息动态记录到HDFS上,一旦出现故障重启后,它能够从HDFS读取并恢复之前的运行状态,减少重复计算带来的开销。NodeManager容错:NM超时没有心跳,则RM认为

2021-12-04 18:07:13 1438

原创 ResourceManager剖析——ApplicationMaster、NodeManager、Application管理

ApplicationMaster管理启动流程:用户向RM提交应用程序,RM收到后,先向资源调度器申请用以启动AM的资源,申请到后再由ApplicationMasterLauncher与对应的NM通信,从而启动应用程序的ApplicationMasterAM启动完成后,ApplicationMasterLaunch会通过事件的形式,将刚刚启动的AM注册到AMLivelinessMonitor,以启动心跳监控。AM启动后,向ApplicationMasterService注册,将自己的host、端

2021-12-04 16:45:13 1025

原创 ResourcManager剖析——概述

基本职能RM通过两个RPC协议与NM和AM交互。ResouceTracker:NM通过该RPC协议向RM注册、汇报节点健康状况和Container运行状态、并领取RM下达的命令。该RPC中,RM是Server,NM是Client,NM是主动向RM发起请求的,并领取下达给自己的命令。ApplicationMasterProtocol:AM通过该协议向RM注册、申请资源和释放资源,AM是Client,RM是Server。ApplicationClientProtocol:客户端通过该协议向RM提交应

2021-12-04 15:42:55 144

原创 YARN基础库

基础库:Protocol BuffersApache AvroRPC库服务库和事件库状态机库第三方开源库Protocol Buffers结构化数据存储格式,用于结构化数据序列化/反序列化。编写一个Protocol Buffers应用需要三步:定义消息格式文件,通常以proto作为扩展名使用Google提供的Protocol Buffers编译器生成特定语言的代码文件使用Protocol Buffers库提供的API编写应用程序Apache Avro本身是个序列化框架,同时

2021-12-04 14:41:17 153

原创 YARN设计理念与基本架构

设计思想第一代和第二代MapReduce的差距在于,下一代将JobTracker的两个主要功能,资源管理和作业控制,拆分成两个独立的进程。资源管理进程与具体应用程序无关,且每个作业控制进程只负责管理一个作业。实现了将原有JobTracker中与应用程序相关和无关的模块分开,减轻了JobTracker负载,也使得Hadoop支持更多的计算框架。下一代MapReduce实际上衍生出了一个资源统一管理平台YARN,使得Hadoop不止支持MapReduce,还可以融入其他更多计算框架。基本架构总体上仍是

2021-12-03 21:01:30 1671

原创 Task内部实现——Reduce Task内部实现

整体流程五个阶段shuffle阶段:也称为copy阶段,从各个Map Task上远程拷贝一片数据,如果大小超过阈值,落盘,否则放内存中Merge阶段:远程拷贝数据的同时,Reduce Task启动两个后台线程对内存和磁盘上的文件进行合并,防止内存使用过多或磁盘上文件过多。Sort阶段:按照MapReduce语义,用户编写的reduce()函数输入数据是按key聚集的一组数据,为了将key相同的数据聚在一起,hadoop采用了排序的策略,由于map task已经局部排序,因此,reduce tas

2021-12-03 11:59:33 163

原创 Task运行过程——Map Task内部实现

整体流程五个阶段Read阶段:Map Task通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/valueMap阶段:该阶段主要是将解析出的key/value交给用户编写的map()函数处理,并产生一系列新的key/valuecollect阶段:在用户编写的map()函数中,当数据处理完成后,会调用OutputCollectior.collect()输出结果,该函数会将生成的key/value分片(调用Pattitioner),并写入一个环形缓冲区中Spi

2021-12-03 11:35:21 643

原创 Task运行过程——基本数据结构和算法

IFile存储格式IFile是支持行压缩的存储格式。保存的是有序数据集,因为MapTask会根据key值进行排序。排序对于Map Task:将处理的结果暂时放到一个缓冲区中,当缓冲区使用率到达一定阈值后,再对缓冲区中的数据进行一次排序,并将这些有序数据以IFile文件形式写到磁盘中,而当数据处理完毕后,会对磁盘上所有文件进行一次合并,将小文件合并到一个大文件。对于Reduce Task:它从每个Map Task上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则放到磁盘上,否则放到内存中,如果磁

2021-12-02 23:48:45 371

原创 Task运行过程——概述

应用程序分为Map和Reduce两阶段,分别由一个或多个Map Task和Reduce Task组成,每个Map Task处理输入数据集合中的一片数据(InputSplit),并将产生的若干个数据片段写到本地磁盘上,而Reduce Tsak则从每个Map Task上远程拷贝相应的数据片段,经分组聚集和归约后,将结果写到HDFS上作为最终结果。对于MapTask而言,运行过程为:通过用户提供的InputFormat将对应的InputSplit解析成一系列key/value,依次交给用户编写的map(.

2021-12-02 20:57:28 308

原创 TaskTracker内部原理——启动新任务

任务启动过程作业本地化本地化指在TaskTracker上为作业和任务构造一个运行环境,包括创建作业和任务的工作目录,从HDFS上下载运行任务相关的文件,可分为作业本地化和任务本地化。作业的第一个任务负责为该作业本地化,后续任务负责任务本地化。启动任务为了避免不同任务之间相互干扰,TaskTracker为各个任务启动了独立的JVM,JVM相当于包含一定资源量的容器,每个任务可在该容器内使用其资源运行。JVM启动过程:如果已启动JVM数目低于上限数目(Map slot或者Reduce slot数

2021-12-02 20:31:47 775

原创 TaskTracker内部原理——作业目录管理

MapReduce计算过程中,中间数据要落盘,但是这些数据不存在备份,一旦丢失,就要重新计算。所以为了提高数据的可靠性和并发写性能,Hadoop允许TaskTracker配置多个挂在不同磁盘的目录作为中间结果存放目录,对于任意一个作业,Hadoop会在每个磁盘中创建相同的目录结构,然后采用轮询策略使用这些目录(由类LocalDirAllocator实现)TaskTracker上的目录分两种:数据目录和日志目录,数据目录存放执行任务所必须的数据(比如jar包、作业配置文件)和运行中临时产生的数据;日志目录存

2021-12-02 20:12:49 131

原创 TaskTracker内部原理——行为分析

启动新任务TaskTracker出现空闲资源,将资源使用情况通过心跳汇报给JobTrackerJobTracker收到信息后,解析心跳信息,发现TaskTracker上有空闲资源,则调用调度器模块的assignTasks()函数为TaskTracker分配任务。JobTracker将新分配的任务封装成一个或者多个LaunchTaskAction对象,将其添加到心跳应答中返回给TaskTracker。TaskTracker收到心跳后,解析出LaunchTaskAction对象,创建JVM启动任务。

2021-12-02 17:44:37 375

原创 TaskTracker内部原理——TaskTracker启动过程和心跳机制

启动过程TaskTracker是一个独立的服务,有一个对应的main函数启动它。TaskTracker构造函数中初始化一些重要对象和线程,再run方法中维护一个与JobTracker的通信连接,以周期性地向JobTracker发送心跳并领取新的任务。变量初始化对象初始化心跳机制单次心跳发送TaskTracker会主动汇报信息并领取对应的命令,TaskTracker周期性向JobTracker汇报信息并领取任务形成心跳。状态发送TaskTracker发送的信息被封装到可序列化类Task

2021-12-01 22:30:42 596

原创 TaskTracker内部原理——概述

TaskTracker概述Tracker是JobTracker与Task之间的“沟通桥梁”,一方面,从JobTracker端接收并执行各种命令,比如运行任务、提交任务、杀死任务等等;另一方面,它将本节点上的各个任务状态通过周期性心跳汇报给JobTracker。Task Tracker实现两个功能:汇报心跳和执行命令汇报心跳:TaskTracker周期性将所在节点各种信息通过心跳机制汇报给JobTracker,包括,机器级别信息如节点健康状况、资源使用情况等;任务级别信息如任务执行进度、任务运行状态

2021-12-01 22:01:06 707

原创 JobTracker内部原理——Hadoop资源管理

Hadoop资源管理分两部分:资源表示模型和资源分配模型。资源表示模型:hadoop用槽位(slot)来组织各节点上的资源。hadoop将各个节点上的资源等量切分为若干份,每一份用一个slot表示,同时规定一个task可根据需要占用多个slot。slot也分map slot和reduce slot,可根据参数修改分配的slot数,节点的slot数回决定该节点的最大允许任务并发度。资源分配模型:由一个可插拔式的调度器完成。资源分配实际上的任务调度问题,是一个多目标优化问题,hadoop中,map ta

2021-12-01 21:18:32 741

原创 JobTracker内部原理—— 任务推测执行原理

啥是任务推测分布式集群环境下, 一个作业的多个任务可能运行速度不一致,可能出现某个任务拖后腿,拖慢整个进度,为了避免这种情况,hadoop采用了推测执行机制(speculative execution) , 根据一定法则推测出拖后腿的任务,并为此任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。任务推测的算法:1.0.0版本和0.21.0版本都有对应的算法,但是在2.0版本后采用了和之前不一样的推测执行机制,它重点关注新启动的备份任务

2021-12-01 19:35:02 172

原创 JobTracker内部原理—— 容错机制

JobTracker容错三种级别的恢复机制:级别由低到高作业级别任务级别记录级别级别越低,实现越简单,但造成的资源浪费越严重。1.0版本以前,hadoop采用任务级别的恢复机制,基于事务型日志完成作业恢复的。它只关注两种任务:运行完成的和未运行完成的。作业运行过程中,JobTracker会以日志形式将作业以及任务状态记录下来,一旦重启,则可从日志中恢复作业的运行状态,未开始运行的要重新运行,实现比较复杂。0.21.0版本开始,hadoop采用作业级别的恢复机制,当JobTracker重

2021-12-01 17:22:04 153

原创 JobTracker内部原理——Job和Task运行时的信息维护

作业描述模型”三叉树“作业描述方式:JobTracker为每个作业创建一个JobInProgress对象以跟踪和监控其运行状态,该对象存在于作业整个运行过程,作业提交时就创建,作业运行完成时就销毁。同时,为了采用分治的策略解决问题,JobTracker将每个作业拆分成若干个任务,并为每个任务创建一个TaskInProcess对象以跟踪和监控其运行状态,任务运行可能失败,JobTracker会按照一定的策略重新运行,所以每个任务可能尝试多次,直到成功,JobTracker每运行一次任务称为一次”任务运

2021-12-01 15:58:28 177

原创 JobTracker内部原理——心跳接收与应答

心跳实际上是一个RPC函数。TaskTracker周期性调用该函数汇报节点和任务状态信息,形成心跳。三个作用:判断TaskTracker是否活着及时让JobTracker获取各个节点上的资源使用情况和任务运行状态。为TaskTracker分配任务。TaskTracker周期性调用RPC函数heartbeat向JobTracker汇报信息和领取任务public synchronized HeartbeatResponse heartbeat(TaskTrackerStatus status

2021-11-30 23:47:52 295

原创 JobTracker内部实现——JobTracker启动过程

概述JobTrakcer包含一个main函数,main函数中有两行启动JobTracker的核心代码:JobTracker tracker = startTracker(new JobConf());//创建JobTracker对象tracker.offerService(); //启动各个服务重要对象初始化跟踪startTracker()函数内部,它最终创建了一个JobTracker对象,该对象对一些重要对象进行了初始化。ACLsManager类:权限管理类,提供了checkAccess

2021-11-30 21:13:06 765

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除