6 Structured Streaming
6.1 What is Spark Streaming?
Spark Streaming的核心是一个可扩展的容错流系统,它采用RDD批处理模式(即批量处理数据)并加快速度。
如下图所示,Spark Streaming接收输入数据流,并在内部将该数据流分成多个较小的批次(其大小基于批处理间隔)。 Spark引擎将这些批量的输入数据处理成批量的结果集。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQ3chVEa0V3bT9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwFeFpnT1sGVOVTT6hVdsdUZwZlMkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DNxgDMwATNwEjMyEDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
Spark Streaming的关键抽象是Discreteized Stream(DStream),它代表了前面提到的构成数据流的小批量。
DStreams建立在RDD之上,允许Spark开发人员在RDD和批处理的相同环境中工作,现在只可应用于流问题。另外一个重要的方面是,由于使用Apache Spark,Spark Streaming集成了MLlib, SQL,DataFrames和GraphX。
下面的图描述了Spark Streaming的基本组件:
Spark Streaming是一个高级API,为有状态操作提供了一次性的容错。 Spark Streaming内置了接收器,可以承担很多来源,最常见的是Apache Kafka,Flume,HDFS /S3,Kinesis和Twitter。
6.2 Why do we need Spark Streaming?
大规模的实时开发可操作能力为企业提供了竞争优势。无论是在检测欺诈性交易,提供传感器异常实时检测,还是对下一个病毒式推特做出反应,流数据分析在数据科学家和数据工程师的工具箱中变得越来越重要。 Spark Streaming能够以准实时的方式容易地实现较为复杂的统计需求。
Spark Streaming有四个广泛的用例:
- Streaming ETL:数据在被推入下游之前不断被清理和汇总。这通常是为了减少最终数据存储中的数据量。
- Triggers::实时检测异常行为或事件触发器下游行动。
- Data enrichment:加入其他数据集的实时数据可以进行更丰富的分析。例如,包括实时天气信息和航班信息,以建立更好的旅游警报。
- Complex sessions and continuous learning:利用多组与实时流相关的数据不断地分析或更新机器学习模型。例如,与在线游戏关联的用户活动流,使我们能够更好地细分用户。
6.3 What is the Spark Streaming application data flow?
下图提供了Spark的driver,workers,流源和目标之间的数据流:
这一切都以Spark Streaming Context开始,由上图中的ssc.start()表示:
- 当Spark Streaming Context启动时,driver将分配给executor(即workers )一个长期任务。
- Executor(本图中的Executor1)上的接收者从流式源接收数据流。随着输入的数据流,接收器将流分成块并将这些块保存在内存中。
- 这些数据块也被复制到另一个Executor,以避免数据丢失。
- 数据块的 ID 信息 被传送到 driver 中的 Block Management Master上。
- 对于Spark Streaming Context中配置的每个批处理间隔(通常这是每1秒),driver将启动Spark任务处理块。然后将这些块保存到任意数量的目标数据存储中,包括云存储(例如S3/WASB等),关系数据存储(例如MySQL,PostgreSQL等),以及NoSQL存储。