用实例讲解Spark Sreaming
作者: 侠天
本篇文章用Spark Streaming +Hbase为列,Spark Streaming专为流式数据处理,对Spark核心API进行了相应的扩展。什么是Spark Streaming?首先,什么是流式处理呢?数据流是一个数据持续不断到达的无边界序列集。流式处理是把连续不断的数据输入分割成单元数据块来处理。流式处理是一个低延迟的处理和流式数据分析。Spark Streaming对Spark核心API进行了相应的扩展,支持高吞吐、低延迟、可扩展的流式数据处理。实时数据处理应用的场景有下面几个:
- 网站监控和网络监控;
- 异常监测;
- 网页点击;
- 广告数据;
物联网(IOT)
![sreaming](http://www.36dsj.com/wp-content/uploads/2016/05/8871.jpg)
Spark Streaming
支持的数据源包括HDFS文件,TCP socket,Kafka,Flume,Twitter等,数据流可以通过Spark核心API、DataFrame SQL或者机器学习API处理,并可以持久化到本地文件、HDFS、数据库或者其它任意支持Hadoop输出格式的形式。Spark Streaming如何工作?Spark Streaming以X秒(batch size)为时间间隔把数据流分割成Dstream,组成一个RDD序列。你的Spark应用处理RDD,并把处理的结果批量返回。
![RDD](http://www.36dsj.com/wp-content/uploads/2016/05/888.jpg)
Spark Streaming例子的架构图
![例子](http://www.36dsj.com/wp-content/uploads/2016/05/8901.jpg)
- - 读取流式数据;
- - 处理流式数据;
- - 写处理结果倒Hbase表。
Spark处理部分的代码涉及到如下内容:
- 读取Hbase表的数据;
- 按天计算数据统计;
- 写统计结果到Hbase表,列簇:stats。
数据集数据集来自油泵信号数据,以CSV格式存储在指定目录下。Spark Streaming监控此目录,CSV文件的格式如上图。
![CSV](http://www.36dsj.com/wp-content/uploads/2016/05/8911.jpg)
Hbase表结构
流式处理的Hbase表结构如下:
- 油泵名字 + 日期 + 时间戳 组合成row key;
- 列簇是由输入数据列、报警数据列等组成,并设置过期时间。
- 每天等统计数据表结构如下:
- 油泵名和日期组成row key;
列簇为stats,包含列有最大值、最小值和平均值;
![平均值](http://www.36dsj.com/wp-content/uploads/2016/05/8921.jpg)
Spark直接用TableOutputFormat类写数据到Hbase里,跟在MapReduce中写数据到Hbase表一样,下面就直接用TableOutputFormat类了。Spark Streaming代码
Spark Streaming的基本步骤:
- 初始化Spark StreamingContext对象;
- 在DStream上进行transformation操作和输出操作;
- 开始接收数据并用streamingContext.start();
- 等待处理停止,streamingContext.awaitTermination()。
初始化Spark StreamingContext
对象创建 StreamingContext对象,StreamingContext是Spark Streaming处理的入口,这里设置2秒的时间间隔。
接下来用StreamingContext的textFileStream(directory)创建输入流跟踪Hadoop文件系统的新文件,并处理此目录下的所有文件,这里directory指文件目录。
linesDStream是数据流,每条记录是按行记录的text格式。
![数据流](http://www.36dsj.com/wp-content/uploads/2016/05/8951.jpg)
![解析](http://www.36dsj.com/wp-content/uploads/2016/05/8971.jpg)
对DStream的每个RDD执行foreachRDD 方法,使用filter过滤Sensor中低psi值来创建报警,使用Hbase的Put对象转换sensor和alter数据以便能写入到Hbase。然后使用PairRDDFunctions的saveAsHadoopDataset方法将最终结果写入到任何Hadoop兼容到存储系统。
sensorRDD经过Put对象转换,然后写入到Hbase。
![对象转换](http://www.36dsj.com/wp-content/uploads/2016/05/8991.jpg)
![计算](http://www.36dsj.com/wp-content/uploads/2016/05/9001.jpg)
Spark读写Hbase
现在开始读取Hbase的sensor表,计算每条的统计指标并把对应的数据写入stats列簇。
![stats](http://www.36dsj.com/wp-content/uploads/2016/05/9011.jpg)
![统计数据](http://www.36dsj.com/wp-content/uploads/2016/05/9021.jpg)
下面的流程图显示newAPIHadoopRDD输出,(row key,result)的键值对。PairRDDFunctions 的saveAsHadoopDataset方法把Put对象存入到Hbase。
![流程图](http://www.36dsj.com/wp-content/uploads/2016/05/9031.jpg)
via:infoQ