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方式思考的更多相关文章

  1. Spark Streaming揭秘 Day35 Spark core思考

    Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...

  2. Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考

    Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考 Job是SparkStreaming的重要基础,今天让我们深入,进行一些思考. Job是什么? 首先, ...

  3. Spark Streaming揭秘 Day33 checkpoint的使用

    Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...

  4. Spark Streaming揭秘 Day32 WAL框架及实现

    Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...

  5. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  6. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

  7. Spark Streaming揭秘 Day23 启动关闭源码图解

    Spark Streaming揭秘 Day23 启动关闭源码图解 今天主要分析一下SparkStreaming的启动和关闭过程. 从Demo程序出发,主要聚焦在两段代码: 启动代码: 关闭代码: 启动 ...

  8. Spark Streaming揭秘 Day22 架构源码图解

    Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...

  9. Spark Streaming揭秘 Day20 动态Batch size实现初探(上)

    Spark Streaming揭秘 Day20 动态Batch size实现初探(上) 今天开始,主要是通过对动态Batch size调整的论文的解析,来进一步了解SparkStreaming的处理机 ...

随机推荐

  1. linux,__attribute__用法

    转载:http://hi.baidu.com/twinspace/item/24365251e837c2948d12edf1 1. gcc的__attribute__编译属性 要了解Linux Ker ...

  2. Android基本控件之ListView(一)

    我们在使用手机的时候,通常看到,像通讯录,QQ列表样式的东西,这里来解释一下,其实那些都是一个ListView 今天,我们就来详细的讲解一下ListView这个控件 ListView中每条显示的数据都 ...

  3. JMeter 学习笔记从不懂慢慢提升(01)

    开源已经成为一个趋势,虽然说做测试是一个低端的行业,但是我们也应该在这个低端的行业慢慢提升自己,让自己到达理想的高度. 以前说如果你会使用loadrunner可能别人就会觉得你有一定的水平那么就会拿高 ...

  4. css笔记12:块元素和行内元素

    1.概念: 行内元素:又叫内联元素,内联元素只能容纳文本或者其他内联元素,常见的内联元素有<span><a> 块元素:块元素一般都是从新行开始,可容纳文本,其他内联元素和其他块 ...

  5. 关于js判断鼠标移入元素的方向——上下左右

    一开始我是这么想的,将待移入的元素分割四块,用mousemove获取第一次鼠标落入的区域来判断鼠标是从哪个方向进去的. 所以只要写个算法来判断鼠标的值落入该元素的区域就可以得出鼠标移入的方向,如下图: ...

  6. MSP430常见问题之指令系统类

    Q1. IAR中怎样描述P2OUT.3脚,#define LCD_cs1 P2OUT.3; 对吗?A1:430 不能位寻址,所以一般的位操作,都通过“与”来作用.#define LCD_cs1 (P2 ...

  7. hdu 4669 动态规划

    思路:主要就是一个动态方程dp[now][(j*Exp[len[num[i]]]+num[i])%k]+=dp[pre][j];我用的是滚动数组.其实也就是dp[i][(j*Exp[len[num[i ...

  8. poj 2104 划分树

    思路:裸的划分树 #include<iostream> #include<algorithm> #include<cstring> #include<cstd ...

  9. java-MySQL存储过程

    import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import ...

  10. 截图技巧——鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬。

    截图技巧--鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬.