spark
tydhot
gogogo
展开
-
spark两种kafka偏移量维护方式
1.spark可以通过checkpoint的方式来维护kafka的偏移量,配置简单,只需要配置checkpoint的路径就可以完成偏移量的维护,如果本身spark业务就采用了state状态,那么既不需要额外配置即可确保偏移量的维护。原理:spark会将kafka spark straming处理的topic以及对应消费偏移量持久化到文件当中,当spark任务崩溃后,保存在持久化文件的偏移量将会...原创 2020-02-27 01:23:15 · 1417 阅读 · 0 评论 -
spark 如何用netty实现akka的actor模型
Spark的中,通过netty实现了类似akka的actor机制。在spark中,一个EndPointData就类似一个akka中的actor。private class EndpointData( val name: String, val endpoint: RpcEndpoint, val ref: NettyRpcEndpointRef) { v...原创 2020-01-30 11:31:40 · 2413 阅读 · 1 评论 -
spark 上游rdd的缓存
Rdd的缓存有两种意义上的缓存。当在SparkContext中常创建输入流的时候,将会注册一个InputDStream流到DStreamGraph当中。当对该流进行transform操作,比如map,flatmap等操作的时候,将会以一开始的InputDStream生成MappedDStream和FlatMappedDStream。在所有stream的超类DStream实现了ma...原创 2020-01-29 09:24:44 · 301 阅读 · 0 评论 -
spark BlockManager如何实现Broadcast广播
当通过SparkContext调用broadcast()方法的时候,将会直接尝试调用BroadcastFactory的newBroadcast()方法,BroadcastFactory的默认实现是TorrentBroadcastFactory,在其newBroadcast()方法中,实际上就是new了一个TorrentBroadcast。在TorrentBroadcast的初试化流程中,将会通...原创 2020-01-28 10:46:09 · 373 阅读 · 0 评论 -
spark BlockManager如何实现shuffle
当上游的算子完成了shuffle操作,下游的rdd如何获取shuffle所需要的数据。首先在上游进行写入操作时,写入到的是executor本地的BlockManager。val blockId = ShuffleBlockId(dep.shuffleId, mapId, IndexShuffleBlockResolver.NOOP_REDUCE_ID)val partitionLeng...原创 2020-01-27 10:40:35 · 1771 阅读 · 1 评论 -
spark TaskMemoryManager shuffle 内存管理
在spark中,在shuffle过程中内存放的数据将会通过TaskMemoryManager来进行管理,以ShuffleExternalSorter为例子。final long recordPointer = sortedRecords.packedRecordPointer.getRecordPointer();final Object recordPage = taskMemoryMa...原创 2020-01-26 09:34:07 · 1001 阅读 · 0 评论 -
spark 上下游shuffle结果的存放获取
当一个job在DAGScheduler中被分隔为stage,将会根据其内部的shuffle关系将整个job整理出ShuffleMapStage,而最后结果的ResultStage在提交时,将会不断遍历其parent stage,而本身被加入DAGScheduler的等待集合,只在所有parent的stage执行完毕之后才会执行任务流程中的child stage。private def sub...原创 2020-01-25 09:50:59 · 3561 阅读 · 0 评论 -
spark executor task执行
Executor执行任务的起点是Executor的launchTask()方法。val executorData = executorDataMap(task.executorId)executorData.freeCores -= scheduler.CPUS_PER_TASKlogDebug(s"Launching task ${task.taskId} on executor i...原创 2020-01-24 01:56:51 · 5041 阅读 · 0 评论 -
spark KafkaRDD的理解
Spark版本 2.4.0先从0-8版本的kafka说起。当jobGenerator根据时间准备生成相应的job的时候,会依次在graph中调用各个输入流的getOrCompute()方法来获取得到rdd,在这里DirectKafkaInputDStream的compute()方法将会被调用,在这里将会在driver端生成一个时间批次的rdd,也就是KafkaRDD。KafkaR...原创 2020-01-19 00:41:47 · 1652 阅读 · 0 评论 -
spark ui 上schedulingDelay理解
Spark UI页面上的schedulingDelay具体为一批job submit到第一个job开始执行的这段时间。其中submitTime在JobGenerate中根据定时生成job的事件而触发的generateJobs()方法中,当job被封装成JobSet的时候准备提交给JobScheduler执行的时候,在JobSet的构造方法被记录。Try { jobSchedul...原创 2020-01-06 23:30:58 · 2097 阅读 · 0 评论 -
spark eventLoop模型
Sprak中,线程之前的交互采用eventLoop模型。当JobGenerate中的clock达到触发新一次job生成的时间后,并不会直接驱动graph去生成job,而是通过往eventLoop中发送一个JobGenerate事件以触发job生成事件的产生。private val eventQueue: BlockingQueue[E] = new LinkedBlockingDeque...原创 2020-01-06 01:03:59 · 525 阅读 · 0 评论 -
spark job生成的时间驱动
JobGenerator中有一个timer成员,根据配置中的时间间隔不断产生GenerateJobs事件来触发job的产生,以成为job产生的起点。Timer通过clock来作为构建时间的依据。val clock = { val clockClass = ssc.sc.conf.get( "spark.streaming.clock", "org.apache.spark.uti...原创 2020-01-03 00:34:44 · 294 阅读 · 1 评论 -
spark反压速率计算
当spark开启反压之后,将会在PIDRateEstimator中根据上一批任务的处理延时情况计算下一批接收数据的大小。def compute( time: Long, elements: Long, processingDelay: Long, schedulingDelay: Long): Option[Double]计算需要四个参数,该批数据处理结束...原创 2019-11-17 23:44:23 · 191 阅读 · 0 评论 -
spark使用checkpoint恢复的两个小坑
1.spark在使用checkpoint恢复的时候不能再执行流的定义的流程,新加入的流的状态在恢复完成后的spark状态下处于未初始化状态,在spark根据checkpoint恢复的时候将不会再对各个流进行初始化,而是直接保存的状态中恢复。这将导致新加入的流还未初始化就被调用,抛出stream还未初始化的异常。2.spark在使用checkpoint恢复的过程中,不能恢复kryo序列化的类...原创 2019-10-31 23:45:32 · 1608 阅读 · 0 评论 -
spark多个kafka source采用同一个group id导致的消费堆积延迟
Kafka版本0.10.0spark版本 2.1Spark streaming在同一个application中多个kafka source当使用一个group id的时候订阅不同topic会存在消息消费堆积,并且控制页面streaming时间会存在严重延时。在spark根据存在的输出流依次生成job的时候,将会依次串行调用各个kafka source的compute()方法...原创 2019-10-16 00:47:13 · 1534 阅读 · 8 评论 -
spark on yarn yarn-client模式实现源码走读
Spark版本2.4.0在SparkContext的初始化过程中,将会根据配置的启动模式来选择不同的任务调度器TaskScheduler,而这个不同模式的实现也是在这里根据选择的TaskScheduler类型进行区分并实现。case masterUrl => val cm = getClusterManager(masterUrl) match { case...原创 2019-10-11 23:34:35 · 552 阅读 · 0 评论 -
spark mapWithState 实现
mapWithState()可以保存流的状态,并能做到当前rdd和前一段时间的rdd进行比较或者聚合。当stream调用mapWithState()方法的时候,将会返回一个MapWithStateDStreamImpl。@Experimentaldef mapWithState[StateType: ClassTag, MappedType: ClassTag]( spec: ...原创 2019-03-25 23:22:03 · 2028 阅读 · 3 评论 -
spark stage 划分 源码
Spark在任务提交后首先会在DAGScheduler中根据任务划分为不同的stage,起点在DAGScheduler的handleJobSubmitted()方法中。private[scheduler] def handleJobSubmitted(jobId: Int, finalRDD: RDD[_], func: (TaskContext, Iterator[_]) ...原创 2019-03-23 01:16:46 · 366 阅读 · 0 评论 -
spark broadcast的TorrentBroadcast实现
在spark中,默认采用的broadcast的方式Torrent方式,其实现方式也是TorrentBroadcast类,当通过spark上下文调用broadcast广播某数据时,将会生成唯一的broadcastid用于区分该广播变量。在TorrentBroadcast的构造过程中,将会通过writeBlocks()方法将所需要广播的数据切分并序列化。具体的切分逻辑实现在了其伴生对象的bl...原创 2019-04-07 02:41:36 · 617 阅读 · 0 评论 -
Kryo序列化实现源码分析
在使用Kryo序列化之前需要将被序列化的类通过register()方法注册到其中去。在register的过程中,实则是要根据要序列化的类生成对应的Registration,Registration中记录了类的唯一id与对应的序列化类,在Kryo中,默认的序列化对象是FieldSerializer,没有特别指明的,都将以FieldSerializer来进行序列化。public Regist...原创 2019-04-17 01:48:57 · 1202 阅读 · 0 评论 -
spark的异步消息总线LiveListenBus
LiveListenBus是spark提供的异步消息总线。private val queues = new CopyOnWriteArrayList[AsyncEventQueue]()@volatile private[scheduler] var queuedEvents = new mutable.ListBuffer[SparkListenerEvent]()在LiveLis...原创 2019-04-26 22:49:04 · 524 阅读 · 0 评论 -
spark的ContextCleaner清理
ContextCleaner是Spark中用来清理无用rdd,broadcast等数据的清理器,其主要用到的是java的weakReference弱引用来达成清理无用数据的目的。ContextCleaner主要由两个线程两个集合组成。private val referenceBuffer = Collections.newSetFromMap[CleanupTaskWeakRe...原创 2019-04-27 13:41:34 · 1903 阅读 · 0 评论 -
spark的TimSort排序算法实现
Spark版本2.4.0。Spark中的排序实现也是通过TimSort类实现,实现具体方式与JDK略有区别。具体实现,在TimSort类的sort()方法的sort()方法中。if (nRemaining < MIN_MERGE) { int initRunLen = countRunAndMakeAscending(a, lo, hi, c); binar...原创 2019-07-26 02:55:39 · 650 阅读 · 0 评论 -
spark RadixSort基数排序源码实现
Spark版本2.4.0Spark的RadixSort基数排序实现的排序容器基于一个LongArray实现。在LongArray中,一个元素的长度为8字节,当排序的时候,将是每8个字节确定一个元素。public static int sort( LongArray array, long numRecords, int startByteIndex, int endBy...原创 2019-08-12 21:38:49 · 351 阅读 · 0 评论 -
spark闭包清理器ClosureCleaner
在spark给出的闭包清理器中的代码注释中,关于闭包的例子,给出了一个类作为例子,稍作修改如下。class SomethingNotSerializable { def someMethod(): Unit = scope("one") { def y = someValue scope("two") { println(y + 1) } }...原创 2019-09-02 21:41:05 · 2874 阅读 · 0 评论 -
Spark OpenHashMap分析
Spark的OpenHashMap比jdk的HashMap快5倍,也会花费更少的空间。protected var _keySet = new OpenHashSet[K](initialCapacity)在OpenHashMap中,key将会存储在一个OpenHashSet中,因此先看到OpenHashSet的实现。protected var _bitset = new BitSe...原创 2019-09-06 01:20:15 · 883 阅读 · 0 评论 -
spark中一些不是很有意义的数据结构
Spark版本2.4.0CompactBuffer是一个基于scala的ArrayBuffer进行了优化的object数组。原生的ArrayBuffer在缺省情况就会构造一个大小为16的数组,这在一些小数据量,只有1个2个的情况,其实并不是很优雅的做法。private var element0: T = _private var element1: T = _// Num...原创 2019-09-18 01:55:20 · 260 阅读 · 0 评论 -
spark SortShuffleWriter的实现
SortShuffleWriter是spark中一种shuffle的方式,一下是其write()方法。override def write(records: Iterator[Product2[K, V]]): Unit = { sorter = if (dep.mapSideCombine) { new ExternalSorter[K, V, C]( contex...原创 2019-03-24 18:26:13 · 289 阅读 · 0 评论