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 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go-简洁的并发

多核处理器越来越普及。有没有一种简单的办法,能够让我们写的软件释放多核的威力?是有的。随着Golang, Erlang, Scala等为并发设计的程序语言的兴起...

45012
来自专栏Spark学习技巧

大数据查询——HBase读写设计与实践

作者 | 汪婷编辑 | Vincent导语:本文介绍的项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和...

3469
来自专栏祝威廉

如何使用MLSQL中的帮助指令学习模块的使用

MLSQL 已经实现了文章中描述的功能 如何实现语法的自解释(MLSQL易用性设计有感) 。

1054
来自专栏岑玉海

Spark的机器学习算法mlib的例子运行

  Spark自带了机器学习的算法mlib,页面网址 http://spark.incubator.apache.org/docs/latest/mllib-g...

4265
来自专栏Spark学习技巧

从coalesce算子发散开的

1203
来自专栏日常学python

如何爬取asp动态网页?搞定可恶的动态参数,这一文告诉你!

这个asp网站是我的学校的电费查询系统,需要学校的内网才能查询,所以这文说下思路和我遇到的一些坑。我搞这个网站主要是为了方便查电费而已,其实也方便不了多少。而且...

2883
来自专栏点滴积累

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

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

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

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

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

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

简讲LSM树(Log-Structured Merge Tree)

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

6017
来自专栏Hadoop实操

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

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

1122

扫码关注云+社区

领取腾讯云代金券