SparkStreaming源码阅读思路

SparkStreaming的DirectAPI源码阅读思路

Spark Streaming的流式处理,尤其和kafka的集合,应该是企业应用的关键技术点,作为spark学习和工作者,要熟练的掌握其中原理,精读源码,才能更好的完成任务和相关工调优工作内容。对其原理简介,浪尖不啰嗦,请看前面的文章《聊聊流式批处理》。在这里浪尖主要介绍,Spark Streaming源码阅读时的注意事项及关注点,只有牢牢把握这几点,才能更好的使用Spark Streaming。

阅读源码谨记的点

对于SparkStreaming的相关操作呢,我们只需要谨记一下几点:

1,我们的输入输出流是如何注册到DStreamGraph,并生成job的。

输入流是在构建输入流对象的时候由InputDStream这个抽象类里面的ssc.graph.addInputStream(this),将其加入到我们DStreamGraph里面。

输出流是在构建的时候调用register方法来将其自身加入到DStreamGraph

2,sparkStreaming是如何封装我们的函数的。

我们自定义的函数最终会被封装到流的compute函数里调用。

3,我们的调用关系链也即pipeline怎么产生的。

4,我们的job生成的周期是由哪些参数决定的。

(time - zeroTime).isMultipleOf(slideDuration)

slideDuration 和 batchDuration 这两个变量有什么关系呢?

5,slideDuration //尤其是窗口函数。

slideDuration 在我们创建输入流的时候被初始化为batchDuration

没有window操作的话,由InputStream衍生出来的流,都会以 slideDuration: Duration = parent.slideDuration这种方式去继承,父流的slideDuration。

这个操作由window操作打乱,在window操作中被赋值为我们为window操作设置的滑动窗口,由此将我们的rdd生成周期改为了我们设定的滑动窗口,以及SparkStreamingjob 的生成周期是我们的滑动窗口指定的时间。

6,基于Receiver的方式,Receiver是如何被调度执行的?

重点细节

其实,针对spark Streaming的任务,我们可以简单将其分为两个步骤:

1, RDD的生成。就拿与kafka结合的步骤来看,有两种RDD的生成策略。第一种就是基于Receiver的方式,生成blockRDD,这个我们在知识星球里面详细讲了。然后就是direct API的格式是生成KafkaRDD,这个RDD是和kakfa消费的分区数一一对应。Kafka产生的基本思路是,针对获取到分区,然后计算要消费的偏移,然后将这些分装成分区信息,那么在compute函数力计算的时候,会使用simpleConsumer针对分区和偏移信息,去kafka里面获取数据。

2, Job的生成及执行。

Job生成是按照批处理时间,但是由于窗口函数的存在,会导致job生成是批处理时间的若干倍。这个在视频里会详细讲的。

最终是在jobScheduler里面,遍历job,然后提交到一个固定线程数的线程池里。这个线程数实际上默认是1,我们可以通过spark.streaming.concurrentJobs设置,结合调度模式,来实现并发job调度。

private val jobExecutor =

ThreadUtils.newDaemonFixedThreadPool(numConcurrentJobs, "streaming-job-executor")

要记住上述1,2两个点,再结合开头的六个问题,就能很清楚的搞明白Spark Streaming运行原理及与kafka结合的两种模式的区别,最终可以完成更精致开发和调优。

kafkaRDD生成及获取数据的结构图

job生成及调度的过程

详细源码视频,请加入星球获取。

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2018-06-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LanceToBigData

Hadoop(十三)分析MapReduce程序

前言   刚才发生了悲伤的一幕,本来这篇博客马上就要写好的,花了我一晚上的时间。但是刚才电脑没有插电源就没有了。很难受!想哭,但是没有办法继续站起来。   前面...

2949
来自专栏大数据学习笔记

Hadoop基础教程-第14章 大数据面试笔试题汇总(持续更新)

第14章 大数据面试笔试题汇总(持续更新) 注意:大部分题目来自互联网,部分题目来自同事口述 14.1 Zookeeper (1)Zookeeper是什...

3676
来自专栏点滴积累

geotrellis使用(三十九)COG 写入更新

前言 前面介绍过了如何在 ETL 的时候更新 Layer,使得能够在大数据量的时候完成 ETL 操作,同时前两篇文章也介绍了 COG 以及如何在 Geotrel...

40212
来自专栏一个技术人的金融之路

简讲LSM树(Log-Structured Merge Tree)

前言:最近在了解大数据实时分析技术druid,究其原理时发现用到了类LSM树思想以实现高效的数据插入,于是展开了对LSM的了解,了解之后感觉这东西虽然也并没有很...

4607
来自专栏Hadoop实操

安装CDSW数据磁盘初始化异常问题分析

本文主要讲述基于Kerberos环境下的CDH5.13.1版本安装CDSW1.3.0数据磁盘初始化异常问题分析及解决办法。

1062
来自专栏喔家ArchiSelf

MCU上的代码执行时间

在许多实时应用程序中,二八原则并不生效,CPU 可以花费95%(或更多)的时间在不到5% 的代码上。电动机控制、引擎控制、无线通信以及其他许多对时间敏感的应用程...

822
来自专栏我是攻城师

在scala中使用spark sql解决特定需求

2955
来自专栏数据和云

Oracle In-Memory Option的细节

在OOW大会之后,Oracle In-Memory Option这一数据库选件的细节被更多的公布出来。我选取一点信息和大家分享。 In-Memory Optio...

2849
来自专栏大数据智能实战

Spark Hbase读取操作的一些总结与测试

Spark连接HBase实现查询的操作有好多种步骤,其中常用的是直接调用Hbase本身提供的写入和读出的接口。 然而不少人在此基础上进行了各种封装,有的支持sp...

2437
来自专栏安富莱嵌入式技术分享

【二代示波器教程】第13章 RTX操作系统版本二代示波器实现

本章教程为大家讲解RTX操作系统版本的二代示波器实现。主要讲解RTOS设计框架,即各个任务实现的功能,任务间的通信方案选择,任务栈,系统栈以及全局变量共享问题。...

1272

扫码关注云+社区