Spark Streaming揭秘 Day15 No Receivers方式思考
Spark Streaming揭秘 Day15
No Receivers方式思考
在前面也有比较多的篇幅介绍了Receiver在SparkStreaming中的应用,但是我们也会发现,传统的Receiver虽然使用比较方便,但是还是存在不少问题的,今天主要围绕kafka direct access讨论下,如果抛开Receiver来实现inputDStream该怎么做。
KafkaRDD
我们知道,在Spark中,数据的访问主要是通过RDD来进行,而针对Kafka的数据,是使用了KafkaRDD。
让我们进入KafkaRDD的定义,可以看到主要和数据访问相关的是一个包含OffsetRange的数组。


OffsetRange是对offset的范围定义,offset是什么?我们可以理解它是kafka中类似指针、游标的概念,一个offset代表了一个消息。
如果来使用这个OffsetRange,和其他RDD一样,主要是通过getPartition和compute两个方法。
getPartition主要是进行数据定位,里面对每个OffsetRange进行遍历,首先是获取了Kafka的地址,第二步是根据OffsetRange创建了一个KafkaRDDPartition。其中i是zipWithIndex方法生成的分区索引。

compute方法中,将不同的topic的partition对应生成KafkaRDD的partition,会根据KafkaRDDPartition提取出我们需要的内容,主要是会用到KafkaRDDIterator这个方法。从这段代码,我们可以看出KafkaRDDIterator是真正获取数据的方法,是lazy级别的方法,和KafkaRDDPartition一一对应。

KafkaRDDIterator是一个内部类,封装了对Kafka进行编程的逻辑。其代码逻辑主要是针对kafkaAPI的调用,采用的是SimpleConsumer这个数据模型,这个就不再详细深入。

DirectKafkaInputDStream
讲完了RDD,我们来看一下对于inputDStream的应用。
首先看下创建inputDStream的代码:

createDirectStream,可以直接指定range,如果不指定range的话,会根据参数设置进行获取,smallest是拿最早的数据,否则拿最晚的数据。最终是返回一个DirectKafkaInputDStream。

在DirectKafkaInputDStream中,主要是通过compute方法产生RDD实例,KafkaRDD和inputDStream一一对应。

有两点需要注意:
计算重试一次,主要是为了确保语义一致性。

在读取数据过程中,可以通过rateController控制消费数据的速度,并且这个速度可以为每个partition单独进行配置!!!

小结
Direct方式对我们实际的价值:
1.Direct方式没有缓存,不会出现内存溢出。
2.Receiver默认和executor绑定,Direct默认数据在多个executor上,会更方便做分布式。
3.数据消费问题,如果采用receiver方式,如果数据来不及处理,Delay多次的话,SparkStreaming可能会崩溃,Direct方式不会有这种情况,delay只是不进行下一个处理,无所谓。
4.完全的语义一致性,不会重复消费数据,并且能消费数据一定被消费,因为直接和kafka交互,只是真正执行成功之后,才会被记录下来。
5.Direct方式因为不需要内存管理,比Receiver方式性能高。
欲知后事如何,且听下回分解
DT大数据每天晚上20:00YY频道现场授课频道68917580
Spark Streaming揭秘 Day15 No Receivers方式思考的更多相关文章
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
- Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考
Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考 Job是SparkStreaming的重要基础,今天让我们深入,进行一些思考. Job是什么? 首先, ...
- Spark Streaming揭秘 Day33 checkpoint的使用
Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...
- Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- Spark Streaming揭秘 Day23 启动关闭源码图解
Spark Streaming揭秘 Day23 启动关闭源码图解 今天主要分析一下SparkStreaming的启动和关闭过程. 从Demo程序出发,主要聚焦在两段代码: 启动代码: 关闭代码: 启动 ...
- Spark Streaming揭秘 Day22 架构源码图解
Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...
- Spark Streaming揭秘 Day20 动态Batch size实现初探(上)
Spark Streaming揭秘 Day20 动态Batch size实现初探(上) 今天开始,主要是通过对动态Batch size调整的论文的解析,来进一步了解SparkStreaming的处理机 ...
随机推荐
- 刚安装完jdk和eclipse需要配置什么?
还需要配置环境变量,你还要下载 apache-tomcat WEB服务器,也就是说 系统能找到你的 服务器,具体配置:(在windows桌面上右击“我的电脑” —> “属性” —> “高级 ...
- SQL中空值与NULL区别
很多人都有过这样的问题吧 在SQL中填充空值与NULL有什么区别 现在我以一个实例给大家分享一下自己的想法 恳请大家给予批评也指正 谢谢 创建一个监时表 CREATE TABLE #temp ( ...
- 在openshift上创建django应用
python 3.3 + django 1.7 一.创建新应用 $ rhc app create -a mynewapp -t python-3.3 二.在新建的目录里添加git库 $ cd myne ...
- android开发之路11(用SharedPreferences存储数据)
Android平台给我们提供了一个SharedPreferences类,实际上SharedPreferences处理的就是一个key-value(键值对),它是 一个轻量级的存储类,特别适合用于保存软 ...
- 【报错】"The constructor Notification(int, CharSequence, long) is deprecated
Notification的构造方法 Notification(int, CharSequence, long) 在API11之后就淘汰了,之后的API需要用Notification.Builder() ...
- ES各种错误解决
_update API 执行报错 错误信息: { "error": { "root_cause": [ { "type": "re ...
- Visual Studio Team Foundation Server 2015(TFS 秘钥、序列号)
Visual Studio Team Foundation Server 2015 序列号:PTBNK-HVGCM-HB2GW-MXWMH-T3BJQ
- Linux 根文件系统的制作
一.建立根文件系统目录与文件 1. 创建目录 #mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin sys usr mnt tmp var ...
- 使用git ftp发布我个人的hexo博客内容
自己虚拟主机中的博客是由hexo3 + next主题,因为我想将 hexo 编译生成的文件可以通过ftp命令发布到ftp服务器上面. 发布使用的工具是git-ftp: 按照Use Jenkins an ...
- Java解析XMl文件之SAX和DOm方法
如题,这两种方法的jar包都在jdk中,不需要下载. 先来说下目录结构: 首先建一个Peron类封装person.xml的属性:DomParseService和SaxParseService分别为两种 ...