版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youbitch1/article/details/89228315
SparkStreaming的核心架构(一)
- 这篇博客的主要核心就是让大家搞懂spark运行原理和核心架构
史上最简单的spark教程
所有代码示例地址:https://github.com/Mydreamandreality/sparkResearch
(提前声明:文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(文章参考:Elasticsearch权威指南,Spark快速大数据分析文档,Elasticsearch官方文档,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
Git主页 https://github.com/Mydreamandreality
sparkStreaming基本概念
- streaming使用的是微批次的架构,这个在第一章我们也简单的了解过
- 你可以这么理解,streaming是一系列连续的小规模批处理
- streaming从各种数据源读取数据,并且把数据分为小的批次
- 新的批次按照均匀的时间间隔创建出来
- 每个时间区间开始的时候,一个新的批次就被创建出来,在该区间内收到的数据都会被添加到这个批次中,时间区间结束的时候,批次停止增长
- 时间区间是由批次间隔这个参数设置的,就是我们上一章节中的
Durations.seconds(1)
这个参数 - 批次间隔一般都是设置在毫秒级或者几秒之间,这个参数是由我们开发者根据实际的需求配置的
- 每次传输的批次我们都可以理解为RDDs,Dstream只不过是基于RDD的一层抽象而已,所以我们才可以使用filter等其他函数操作Dstream
- sparkStreaming的抽象就是离散化流,也就是我们说的Dstream,它本质上其实还是一个RDD
DStream的概念
- 创建Dstream我们可以从外部的数据源进行创建
- 亦可以针对其他的Dstream应用进行转化操作得到新的Dstream
- 在一个Dstream中的每个RDD包含来自一定时间间隔的数据
- Dstream基本上支持RDD所支持的转化操作
- Dstream还有有状态的转换操作,可以聚合不同时间区间的数据
- Dstream还支持输出操作,就像我们第一章案例中的print()函数,
- 输出操作和RDD的行动操作概念有些类似
接收器的概念
- SparkStreaming会为每个输入源启动对应的接收器
- 接收器以任务的形式运行在应用的执行器进程中
- 从输入源收集数据并且保存为RDD
- 默认收集到数据后会把数据被分到另一个执行器进程中保障容错性
- 数据会保存在执行器的内存中,缓存方式和RDD是一样的
接收器需要注意的几点
- 在本地执行streaming程序的时候,不可以使用 local或者local[1]作为mater的URL,这两种运行方式意味着本地只有一个线程运行本地任务,如果我们使用基于接收器的dstream,那么这个线程只会执行接收器,不会处理接收到的数据
- 分配给streaming的程序内核数必须大于接收器数量,否则只能接收数据,而无法处理
数据容错
- streaming的容错和RDD的容错是一致的,只要输入的数据还在,spark驱动器就会重算出任意状态,比如可以重新执行处理输入数据的操作
- 默认情况下我们接收的输入数据存在于两个节点,当有一个节点故障的时候,spark会自动恢复,但是这样会处理从程序启动以来所有的数据
- 所以sparkStreaming提供了检查点机制,就是我们把数据状态阶段性的存储到文件系统中 比如HDFS,一般是处理5-10个批次的数据处理一次,然后我们在恢复数据的时候,只需要回溯到上一个检查点即可
sparkStreaming需要注意的点:
- 只要SparkContext启动,这个时候就不会有新的数据流计算可以创建或者添加到它
- 只要Context被停止,它不会自动重启
- 同一时间Jvm只有一个streamingContext可以被激活
- 一个sparkContext可以被复用创建多个streamingCOntext.,前提是在创建下一个之前,上一个已经stop,(是streamingContext停止,不是sparkContext停止)