IMF传奇行动第84课:Spark Streaming第三课:StreamingContext、DStream、Receiver深度剖析


本课分成四部分讲解:

第一部分对StreamingContext功能及源码剖析;

第二部分对DStream功能及源码剖析;

第三部分对Receiver功能及源码剖析;

最后一部分将StreamingContextDStreamReceiver结合起来分析其流程。


注意:下面的图中带分号结尾的是Java代码,否则是Scala代码,请谅解。

一、StreamingContext功能及源码剖析:

1、通过StreamingContext实例对象jssc,创建应用程序主入口,并连上Driver上的接收数据服务端口9999写入源数据:

2、StreamingContext的主要功能有:

  • 主程序的入口;
  • 提供了各种创建DStream 的方法接收各种流入的数据源(例如:Kafka Flume Twitter ZeroMQ 和简单的TCP 套接字等);
  • 通过构造函数实例化 StreamingContext 对象 时,可以指定master URL appName 、或者传入SparkConf 配置对象、或者已经创建的SparkContext 对象;
  • 将接收的数据流传入DStreams 对象中;
  • 通过StreamingContext 对象实例的start 方法启动当前应用程序的流计算框架或通过stop 方法结束当前应用程序的流计算框架。


二、DStream功能及源码剖析:

1、DStreamRDD的模板,RDD是抽象的,DStream也是抽象的。

2、DStream的具体实现子类如下图所示:

3、以StreamingContext实例的socketTextSteam方法为例,其执行完的结果返回DStream对象实例,其源码调用过程如下图:

注意:socket.getInputStream用来获取数据,while循环用来存储数据(到内存、磁盘)

三、Receiver功能及源码剖析:

1、Receiver代表数据的输入,接收外部输入的数据,如从Kafka上抓取数据;

2、Receiver运行在Worker节点上;

3、ReceiverWorker节点上抓取Kafka分布式消息框架上的数据时,具体实现类是KafkaReceiver

4、Receiver是抽象类,其抓取数据的实现子类如下图所示;

5、如果上述实现类都满足不了您的要求,您自己可以定义Receiver类,只需要继承Receiver抽象类来实现自己子类的业务需求。 


四、StreamingContextDStreamReceiver结合流程分析:

1inputStream代表了数据输入流(如:SocketKafkaFlume)

2Transformation代表了对数据的一系列操作,如flatMapmap

3outputStream代表了数据的输出,例如wordCount中的println方法

  


数据数据在流进来之后最终会生成Job,最终还是基于Spark CoreRDD进行执行:在处理流进来的数据时是DStream进行Transformation由于是StreamingContext所以根本不会去运行,StreamingContext会根据Transformation生成”DStream的链条”及DStreamGraph,而DStreamGraph就是DAG的模板,这个模板是被框架托管的。当我们指定时间间隔的时候,Driver端就会根据这个时间间隔来触发Job而触发Job的方法就是根据OutputDStream中指定的具体的function,例如wordcountprint,这个函数一定会传给ForEachDStream,它会把函数交给最后一个DStream产生的RDD,也就是RDDprint操作,而这个操作就是RDD触发Action

 

总结:

使用Spark Streaming可以处理各种数据来源类型,如:数据库、HDFS,服务器log日志、网络流,其强大超越了你想象不到的场景,只是很多时候大家不会用,其真正原因是对Sparksparkstreaming本身不了解。

 

 

 

 

 

课程笔记来源

DT大数据梦工厂IMF传奇行动课程学员整理。YY直播永久课堂频道68917580每晚8点准时开课。

Life is short, you need spark!

 

 

### Spark Streaming 的优雅关闭实现方式 为了实现 Spark Streaming 的优雅关闭,可以利用 `spark.streaming.stopGracefullyOnShutdown` 配置项并结合特定的操作流程完成。以下是详细的说明: #### 1. 配置选项 通过设置配置项 `spark.streaming.stopGracefullyOnShutdown=true` 可以启用优雅关闭功能[^1]。此配置的作用是在应用程序接收到终止信号(如 SIGTERM)时,允许 Spark Streaming 应用程序在完全处理完当前批次后再退出。 #### 2. 发送终止信号 当需要停止 Spark Streaming 程序时,需向 Driver 进程发送 SIGTERM 信号。这可以通过操作系统命令或者自动化工具完成。一旦 Driver 收到该信号,它会启动优雅关闭过程[^2]。 #### 3. 关闭流程概述 在优雅关闭过程中,Driver 节点会等待所有正在运行的任务完成后才真正结束应用。这意味着不会丢失任何未处理的数据,并且能够确保所有的输入数据都被正确消费和存储[^4]。 #### 4. 示例代码 以下是一个简单的示例代码片段展示如何配置以及捕获外部中断信号来进行优雅关闭操作: ```scala import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, StreamingContext} object GracefulShutdownExample { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("Graceful Shutdown Example").setMaster("local[*]") .set("spark.streaming.stopGracefullyOnShutdown", "true") // 启动优雅关闭模式 val ssc = new StreamingContext(conf, Seconds(5)) try { // 定义 DStream 和其他逻辑... ssc.start() ssc.awaitTermination() // 此方法会在接收到SIGTERM后自动调用stop(true)进行优雅关闭 } catch { case e: Exception => println(s"Exception occurred: ${e.getMessage}") ssc.stop(stopSparkContext = true, stopGracefully = true) } } } ``` #### 5. 注意事项 尽管上述机制提供了基本保障,但在某些情况下仍需要注意额外因素: - 如果 Producer 数据生成速度远超设定的最大接收率 (`spark.streaming.receiver.maxRate`) ,即使启用了优雅关闭也可能因为积压过多而无法及时清理全部缓冲区中的消息[^3]。 - 对于高吞吐量场景下建议调整合适的 batch interval 来平衡延迟与性能之间的关系。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值