本次学习学习了spark的流计算相干概念
静态数据和流计算
静态数据:
很多企业为了支持决策分析而构建的数据仓库系统,其中存放的大量历史数据就是静态数据,技术人员可以利用数据挖掘和OLAP(On-Line Analytical Processing)分析工具从静态数据中找到对企业有价值的信息
流数据:
近年来,在Web应用、网络监控、传感监测等领域,兴起了一种新的数据密集型应用——流数据,即数据以大量、快速、时变的流形式持续到达
流数据具有如下特征:数据快速持续到达,潜在大小也许是无穷无尽的数据来源众多,格式复杂数据量大,但是不十分关注存储,一旦经过处理,要么被丢弃,要么被归档存储注重数据的整体价值,不过分关注个别数据数据顺序颠倒,或者不完整,系统无法控制将要处理的新到达的数据元素的顺序
对静态数据和流数据的处理,对应着两种截然不同的计算模式:批量计算和实时计算
流计算概念
流计算:实时获取来自不同数据源的海量数据,经过实时分析处理,获得有价值的信息
数据的价值随着时间的流逝而降低
Hadoop和Spark都是面向批处理,但是Spark由于他的机制可以进行实时计算
流计算处理流程
流计算的处理流程一般包含三个阶段:数据实时采集、数据实时计算、实时查询服务
流处理系统与传统的数据处理系统有如下不同:
流处理系统处理的是实时的数据,而传统的数据处理系统处理的是预先存储好的静态数据
用户通过流处理系统获取的是实时结果,而通过传统的数据处理系统,获取的是过去某一时刻的结果
流处理系统无需用户主动发出查询,实时查询服务可以主动将实时结果推送给用户
Spark Streaming
概述:
Spark Streaming可整合多种输入数据源,如Kafka、Flume、HDFS,甚至是普通的TCP套接字。经处理后的数据可存储至文件系统、数据库,或显示在仪表盘里
基本原理
Spark Streaming的基本原理是将实时输入数据流以时间片(秒级)为单位进行拆分,然后经Spark引擎以类似批处理的方式处理每个时间片数据
Spark Streaming最主要的抽象是DStream(Discretized Stream,离散化数据流),表示连续不断的数据流。在内部实现上,Spark Streaming的输入数据按照时间片(如1秒)分成一段一段,每一段数据转换为Spark中的RDD,这些分段就是Dstream,并且对DStream的操作都最终转变为对相应的RDD的操作
Spark Streaming采用的小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法,因此,方便了一些需要历史数据和实时数据联合分析的特定应用场合
Spark Streaming工作机制
在Spark Streaming中,会有一个组件Receiver,作为一个长期运行的task跑在一个Executor上
每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字流,或者从Kafka中读取的一个输入流等等)
Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据
编写Spark Streaming程序的基本步骤是:
1.通过创建输入DStream来定义输入源
2.通过对DStream应用转换操作和输出操作来定义流计算
3.用streamingContext.start()来开始接收数据和处理流程
4.通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误而结束)
5.可以通过streamingContext.stop()来手动结束流计算进程
创建StreamingContext对象
spark-shell创建
如果要运行一个Spark Streaming程序,就需要首先生成一个StreamingContext对象,它是Spark Streaming程序的主入口
可以从一个SparkConf对象创建一个StreamingContext对象登录Linux系统后,启动spark-shell。
进入spark-shell以后,就已经获得了一个默认的SparkConext,也就是sc。因此,可以采用如下方式来创建StreamingContext对象:
scala> import org.apache.spark.streaming._ scala> val ssc = new StreamingContext(sc, Seconds(1))
代码进行创建
如果是编写一个独立的Spark Streaming程序,而不是在spark-shell中运行,则需要通过如下方式创建StreamingContext对象:
import org.apache.spark._ import org.apache.spark.streaming._ val conf = new SparkConf().setAppName("TestDStream").setMaster("local[2]") val ssc = new StreamingContext(conf, Seconds(1))