文章目录
流计算概述
SparkStreaming是用来做流计算的,在使用前我们要先了解一下流计算和流数据
静态数据,动态数据
在数据当中有两种典型的数据类型
- 静态数据
例如数据仓库中存放的大量历史数据就是静态数据,(这些数据是从oltp系统当中通过ETL工具周期性地加载到数据仓库中),技术人员可以通过数据挖掘和OLAP分析工具从这些数据中找到有价值的信息 - 动态数据(流数据)
随着web页面流量监控,传感器等领域的兴起,出现了一种数据密集型的应用–流数据,即数据以大量,快速,时变的流形式持续到达
流数据的特点:
- 数据快速持续到达
- 数据来源众多,格式复杂
- 数据量大,一旦经过处理,要么丢弃要么存储
- 注重数据的整体价值,不过分关注个别数据
- 数据顺序颠倒,或不完整,系统无法控制将要处理的xin到达的数据的顺序
批量计算,实时计算
对于静态数据和流数据就有不同的处理模式
-
批量计算
对时间的要求不高,可以有充分的时间来处理静态数据 -
实时计算
流数据必须采用实时计算,响应时间为秒级;例如推荐商品
流计算
随着流数据的不断增大,其对实时计算提出了巨大挑战,因此,针对流数据的实时计算–流计算应运而生
流计算分为3个阶段
- 数据采集
- 实时分析处理
- 结果反馈
这些过程都是实时的,而且流计算的基本理念就是:数据的价值随着时间的流逝而降低;
例如用户点击流的数据(商品推荐)
流计算框架
因为数据是源源不断的,所以就要求处理引擎具有以下几个特征
- 高性能:每秒处理几十万条数据
- 实时性:低延迟,能达到秒级甚至毫秒级别的响应
- 分布式:支持大数据基本架构,平滑扩展,在流量高峰期能调用多台机器加如集群,减少每台机器的负担
- 易用性:快速进行开发和部署
- 可靠性:可靠地处理流数据(不管数据是否颠倒)
商业级的流计算平台
- IBM InfoSphere Streams
- IBM StreamBase
开源流计算框架
- Twitter Storm
- Yahoo!S4
数据处理流程
传统数据处理流程
先采集数据,然后存储至数据仓库,当需要决策分析的时候再用工具进行查询分析
弊端:存储的数据没有时效性;需要用户主动进行查询
流计算处理流程
- 数据实时采集
应用较多的是日志采集系统,主要的产品
facebook Scribe
linkedin Kafka
hadoop Flume - 数据实时计算
在进行计算的时候会选择是否将数据进行保存,用于日后的再次分析处理
对于时效性较高的就将数据处理完后直接丢弃,节省时间 - 实时将结果推送给用户
与传统的处理不同,是直接推送给用户,也可以用户自行查询
SparkStreaming
sparkstreaming支持多种数据源的输入输出
概述
Spark Sreaming不是严格意义上的流计算框架的设计模式
它是以微小批处理的方式来模拟流计算
Spark Streaming的基本原理是将实时输入的数据流以时间片(秒级)为单位进行拆分,然后经过Spark引擎以类似批处理的方式处理每个时间片数据
每个时间片的数据被称为Dstream,Dstream本质上是一些RDD的集合
Spark的响应级别只能到达秒,而一些列的微量批处理都是由Spark Core来完成的,Spark Streaming是构建在Spark Core之上的
与Strome框架对比
- Spark Streaming无法实现秒毫秒级的流计算,而Strome可以
- Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行(100ms+)引擎可以用于实时计算,另一方面,相比于Strome,RDD数据集更容易做高效的容错处理
- Spark Streaming采用的微小批处理方式使得它可以同时兼容批量和实时数据处理的逻辑和算法,因此,方便了一些需要历史数据合实时数据结合分析的应用场景
优点
- 实现一键式安装和配置、线程级别的任务监控和告警
- 降低硬件集群构建、软件维护、任务监控和应用开发的难度
- 便于做成统一的硬件、计算平台资源池
Dstream
Discretized Streaming简称DStream
DStream是Spark Streaming的数据抽象
Dstream本质上是一些RDD的集合,我们对DStream的操作会转换成对每个RDD的转换操作
SparkStreaming工作机制
Spark Streaming程序的编写步骤
- 创建StreamingContext对象
- 创建DStream定义输入源
- 通过对DStream应用转换操作和输出操作定义流计算
- 用streamingContext.start()来开始接收和处理流程
- 通过streamingContext.awaitTermination()方法来等待处理结束
- 可以通过streamingContext.stop()来手动结束流计算进程
from pyspark import SparkContext,SparkConf
from pyspark.streaming import StreamingContext
conf = SparkConf().setMaster("local[2]").setAppName("testStreaming")
sc = SparkContext(conf=conf)
ssc = StreamingContext(sc,1)
# ssc->StreamingContext对象,sc:配置内容,1:数据流进来的间隔单位为秒