点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (已更完)
- Kafka(已更完)
- Spark(正在更新!)
章节内容
上节我们完成了如下的内容:
- Spark SQL JOIN
- Boardcast JOIN
- Shuffle JOIN
- SQL解析过程
- SparkSQL 常见的优化逻辑
背景概述
随着大数据技术的不断发展,人们对于大数据的实时性处理要求也不断提高,传统的MapReduce等批处理框架在某些特定领域,例如实时用户推荐、用户行为分析这些应用场景上逐渐不能满足人们对实时性的需求,因为诞生了一批如 S3、Samza、Storm、Flink等流式分析、实时计算框架。
Spark Streaming 是 Spark 核心组件之一,用于实时数据处理。它能够将实时数据流分批处理,转换为可操作的分布式数据集 (RDDs),从而实现流数据的实时处理和分析。
基本概念
- DStream: DStream(离散流)是 Spark Streaming 中的核心抽象,代表一个连续的数据流。它可以来自 Kafka、Flume、HDFS、Socket 等数据源,或者由现有的 RDD 经过转换产生。
- Batch Interval: 数据流被划分为多个小批次,每个批次在指定的时间间隔(例如 1 秒或 10 秒)内进行处理,这个时间间隔称为 Batch Interval。
架构概念
Spark Streaming 的架构主要包括如下组件:
- 输入源: Spark Streaming 支持多种输入源,如 Kafka、Flume、HDFS、S3 等。
- 处理引擎: 核心是 Spark Core 的 RDD 处理引擎,利用它来执行批处理操作。
- 输出操作: 处理后的数据可以输出到文件系统、数据库、仪表板等。
编程模型
Spark Streaming 使用与 Spark 相同的编程模型,支持常见的 Map、Reduce、Join、Window 等操作。你可以通过在 DStream 上调用这些操作来进行实时数据处理。
- Transformation: 如 map、flatMap、filter 等。
- Window Operations: Spark Streaming 提供了基于时间窗口的操作,例如窗口化计算,通过 window 和 slide 函数实现。
容错性
- 检查点机制: 为了处理故障和保证数据一致性,Spark Streaming 提供了检查点机制,可以将中间状态保存到可靠的存储系统(如 HDFS),从而在故障恢复时重建这些状态。
- 数据重放: 在 Kafka 等消息队列中,消息是基于偏移量的,这使得 Spark Streaming 可以在故障发生时重新处理未处理的消息,确保数据的可靠性和一致性。
什么是 Spark Streaming
-
Spark Streaming 类似于 Apache Storm(来一条处理一条、延迟低、响应快、吞吐量低),用于流式数据的处理。
-
Spark Streaming 具有高吞吐量和容错能力强的特点。
-
Spark Streaming 支持的数据输入源很多,例如:Kafka(最重要的数据源)、Flume、TCP套接字等。
-
数据输入后可用高度抽象API:map reduce join window等进行运算
-
处理结果可存 HDFS、数据库等
-
Spark Streaming 可以与 MLib、GraphX融合
Spark Streaming 与 Spark 基于RDD的概念比较类似,Spark Streaming 使用离散化流(Discretized Stream)作为抽象表示,成为 DStream。
DStream是随着时间推移而收到的数据的序列,在内部,每个时间区间收到的数据都作为RDD存在,DStream是由这些RDD所组成的序列。
DStream 可以从各种输入源创建,比如 Flume、Kafka或者HDFS,创建出来的DStream支持两种操作:
- 转化操作,会生成一个新的DStream
- 输出操作(output operation),把数据写入外部系统中
DStream 提供了许多与RDD所支持的操作相类似的操作支持,还增加了与时间相关的的新操作,比如滑动窗口。
Spark Streaming 架构
Spark Streaming 使用 mini-batch 架构,把流式计算当作一系列连续的小规模批处理来对待。
Spark Streaming 从各种输入源中读取数据,并把数据分组小批次,新的批次按均匀的时间间隔创建出来。
在每个时间区间开始的时候,一个新的批次就创建出来,在该区间内收到的数据都会被添加到这个批次中,在时间区间结束时,批次停止增长。
时间区间的大小是由批次间隔这个参数决定的,批次间隔一般设置在500ms到几秒之间,由开发者配置。
每个输入批次都形成一个RDD,以Spark作业的方式处理并生成其他的RDD,处理的结果可以批处理的方式传给外部的系统。
Spark Streaming的编程抽象是离散化流,也就是DStream。它是一个RDD序列,每个RDD代表数据流中的一个时间片内的编程。
应用于DStream上的转换操作都会转换为底层RDD上的操作。如对行DStream中的每个RDD应用FlatMap操作以生成单词DStream的RDD。
这些底层RDD转换是Spark引擎完成的,DStream操作隐藏了大部分的细节,为开发人员提供了更高级的API以方便使用。
Spark Streaming为每个输入源启动对应的接收器,接收器运行在Executor中,从输入源收集数据并保存为RDD。
默认情况下接收到数据后会复制到另一个Executor中,进行容错。
Driver中的 StreamingContext 会周期性的运行 Spark作业来处理这些数据。
Spark Streaming运行流程
- 客户端提交Spark Streaming作业后启动Driver,Driver启动Receiver,Receiver接收数据源的数据
- 每个作业包含多个Executor,每个Executor以线程的方式运行Task,Spark Streaming至少包含一个Receive Task(一般情况下)
- Receive接收数据后生成Block,并把BlockId汇报给Driver,然后备份到另一个Executor上
- ReceiveTracker维护Receiver汇报的BlockId
- Driver定时启动JobGenerator,根据DStream的关系生成逻辑RDD,然后创建JobSet,交给JobScheduler。
- JobScheduler 负责调度JobSet,交给DAGScheduler,DAGScheduler根据逻辑RDD,生成Stages,每个Stage包含一到多个Task,将Task提交给TaskScheduler。
- TaskScheduler负责把Task调度到Executor上,并维护Task的运行状态
Spark Streaming 优缺点
与传统流式框架相比,Spark Streaming 最大的不同点在与它对待数据是粗粒度的处理方式,即一次处理一小批数据,而其他框架往往采用细粒度的处理模式,即依次处理一条数据,Spark Streaming这样的设计实现既为其带来了显而易见的优点,又引入了不少不可避免的缺点。
优点概括
- Spark Streaming 内部的实现和调度方式高度依赖Spark的DAG调度器和RDD,这就决定了Spark Streaming的设计初衷必须是粗粒度的方式的。同时,由于Spark内部调度器足够快速和高效,可以快速地处理小批量数据,这就获得准实时的特性
- Spark Streaming 的粗粒度执行方式使其确保 "处理且仅处理一次"的特性(EOS),同时也可以更方便地实现容错恢复机制
- 由于Spark Streaming的DStream本质上RDD在流式数据上的抽象,因为基于RDD的各种操作也有相应的基本DStream的版本,这样就大大降低了用户对于新框架的学习成本,在了解Spark的情况下用户将很容易使用Spark Streaming。
- 由于 DStream 是在RDD上的抽象,那么也就更容易与RDD进行交互操作,在需要将流式数据和批处理数据结合进行分析的情况下,将会变得方便。
缺点概括
- Spark Streaming 的粗粒度处理方式也造成了不可避免的延迟,在细粒度处理方式下,理想情况下每一条记录都会被实时处理,而在Spark Streaming中,数据需要汇总到一定量都再一次性处理,这么增加了数据处理的延迟,这种延迟是由框架设计引入的,并不是由网络或其他情况造成的。
Structured Streaming
Spark Streaming 计算逻辑是把数据按时间划分为DStream,存在以下问题:
- 框架自身只能根据BatchTime单元进行数据处理,很难处理基于EventTime(即时间戳)的数据,很难处理延迟,乱序的数据
- 流式和批量处理的API不完全一致,两种使用场景中,程序代码还是需要一定的转换
- 端到端的数据容错保障逻辑需要用户自己构建,难以处理增量更新和持久化存储等一致性问题
基于以上问题,提出了下一代 Structure Streaming。将数据源映射为一张无界长度的表,通过表的计算,输出结果映射为另一张表。
以结构化的方式去操作流式数据,简化了实时计算过程,同时还复用Catalyst引擎来优化SQL操作,此外还能支持增量计算和基于EventTime的计算。
与 Kafka 集成
Kafka 是 Spark Streaming 最常用的消息队列之一。通过 Kafka 与 Spark Streaming 的紧密集成,可以实现高吞吐量、低延迟的流数据处理。
- Direct Approach: 直接从 Kafka 读取数据,不需要中间的 Receiver,确保了精确一次的语义。
- Offset 管理: 可以手动管理 Kafka 的偏移量,保证在出错时可以继续处理上次未处理的消息。
应用场景
- 实时监控: 使用 Spark Streaming 可以实现系统和应用程序的实时监控与报警系统。
- 日志处理: 处理实时生成的日志数据,进行在线分析和异常检测。
- 金融分析: 用于实时处理股票交易、风险评估等金融数据。
-社交媒体分析: 实时分析社交媒体数据,监测舆情和用户行为。
性能调优
- 并行度: 通过增加并行度来提高吞吐量。
- 内存管理: 需要合理设置内存参数,防止 OOM 错误。
- 反压机制: Spark Streaming 提供了背压机制,可以动态调整数据处理速率,防止系统过载。