SparkStreaming教程
1 概述
1.1 SparkStreaming是什么
Spark Streaming 是个批处理的流式(实时)计算框架。其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流。
支持从多种数据源获取数据,包括Kafk、Flume、Twitter、ZeroMQ、Kinesis以及TCP sockets,从数据源获取数据之后,可以使用诸如map、reduce、join等高级函数进行复杂算法的处理。最后还可以将处理结果存储到文件系统,数据库等。
Spark Streaming处理的数据流图:
以上的连续4个图,分别对应以下4个段落的描述:
- Spark Streaming接收Kafka、Flume、HDFS和Kinesis等各种来源的实时输入数据,进行处理后,处理结果保存在HDFS、Databases等各种地方。
- Spark Streaming接收这些实时输入数据流,会将它们按批次划分,然后交给Spark引擎处理,生成按照批次划分的结果流。
- Spark Streaming提供了表示连续数据流的、高度抽象的被称为离散流的DStream。DStream本质上表示RDD的序列。任何对DStream的操作都会转变为对底层RDD的操作。
- Spark Streaming使用数据源产生的数据流创建DStream,也可以在已有的DStream上使用一些操作来创建新的DStream。
1.2 2. Spark Streaming能做什么
目前而言SparkStreaming 主要支持以下三种业务场景
- 无状态操作:只关注当前批次中的实时数据,例如:
- 商机标题分类,分类http请求端 -> kafka -> Spark Streaming -> http请求端Map -> 响应结果
- 网库Nginx访问日志收集,flume->kafka -> Spark Streaming -> hive/hdfs
- 数据同步,网库主站数据通过“主站”->kafka->Spark Streaming -> hive/hdfs
- 有状态操作:对有状态的DStream进行操作时,需要依赖之前的数据 除了当前新生成的小批次数据,但还需要用到以前所生成的所有的历史数据。新生成的数据与历史数据合并成一份流水表的全量数据例如:
- 实时统计网库各个站点总的访问量
- 实时统计网库每个商品的总浏览量,交易量,交易额。
- 窗口操作:定时对指定时间段范围内的DStream数据进行操作,例如:
- 网库主站的恶意访问、爬虫,每10分钟统计30分钟内访问次数最多的用户。
1.3 特性
1.3.1 优点:
- 吞吐量大、速度快。
- 容错:SparkStreaming在没有额外代码和配置的情况下可以恢复丢失的工作。checkpoint。
- 社区活跃度高。生态圈强大。
- 数据源广泛。
1.3.2 缺点:
- 延迟。500毫秒已经被广泛认为是最小批次大小,这个相对storm来说,还是大很多。所以实际场景中应注意该问题,就像标题分类场景,设定的0.5s一批次,加上处理时间,分类接口会占用1s的响应时间。实时要求高的可选择使用其他框架。
2 基础概念-开发
2.1 简单示例
2.1.1 Word count词频计算demo
- object NetworkWordCount {
- def main(args: Array[String]) {
- val sparkConf = new SparkConf()
- val ssc = new StreamingContext(sparkConf, Seconds(1))
- val lines = ssc.socketTextStream(hostname, port)
- val words = lines.flatMap(_.split(" "))
- val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
- wordCounts.print()
- ssc.start()
- ssc.awaitTermination()
- }
2.1.2 说明
1. 通过创建输入DStreams来定义输入源。
2. 通过将转换和输出操作应用于DStream来定义流式计算。
3. 开始接收数据并使用它进行处理streamingContext.start()
。
4. 等待处理停止(手动或由于任何错误)使用streamingContext.awaitTermination()
。
5. 可以手动停止处理streamingContext.stop()
。
2.1.3 注意
1. 一旦上下文开始,就不能设置或添加新的流计算。
2. 一旦上下文停止,它将无法重新启动。
3. 只有一个StreamingContext可以在JVM中同时处于活动状态。
2.2 输入源
Spark Streaming提供了两类输入源。
· 基本来源:StreamingContextAPI中直接提供的资源。示例:文件系统,套接字连接。
1.文件系统:streamingContext.fileStream(hdfsDataDirectory)
SparkStreaming将监听目录dataDirectory
并处理在该目录中创建的任何文件(不支持嵌套目录中写入的文件)
文件必须具有相同的数据格式。
必须dataDirectory通过将数据原子移动或重命名为数据目录来创建文件。
移动后,文件不能更改。因为,如果文件被不断附加,则不会读取新的数据。