基于Spark通用计算平台,能够很好地扩展各类计算类型的应用,尤为是Spark提供了内建的计算库支持,像Spark Streaming、Spark SQL、MLlib、GraphX,这些内建库都提供了高级抽象,能够用很是简洁的代码实现复杂的计算逻辑、这也得益于Scala编程语言的简洁性。这里,咱们基于1.3.0版本的Spark搭建了计算平台,实现基于Spark Streaming的实时计算。
咱们的应用场景是分析用户使用手机App的行为。
手机客户端会收集用户的行为事件(咱们以点击事件为例),将数据发送到数据服务器,咱们假设这里直接进入到Kafka消息队列。
后端的实时服务会从Kafka消费数据,将数据读出来并进行实时分析,这里选择Spark Streaming,由于Spark Streaming提供了与Kafka整合的内置支持,通过Spark Streaming实时计算程序分析,将结果写入Redis,能够实时获取用户的行为数据,并能够导出进行离线综合统计分析。
Spark Streaming提供了一个叫作DStream(Discretized Stream)的高级抽象,DStream表示一个持续不断输入的数据流,能够基于Kafka、TCP Socket、Flume等输入数据流建立。在内部,一个DStream其实是由一个RDD序列组成的。Sparking Streaming是基于Spark平台的,也就继承了Spark平台的各类特性,如容错(Fault-tolerant)、可扩展(Scalable)、高吞吐(High-throughput)等。
在Spark Streaming中,每一个DStream包含了一个时间间隔以内的数据项的集合,咱们能够理解为指定时间间隔以内的一个batch,每个batch就构成一个RDD数据集,因此DStream就是一个个batch的有序序列,时间是连续的,按照时间间隔将数据流分割成一个个离散的RDD数据集。
咱们都知道,Spark支持两种类型操做:Transformations和Actions。Transformation从一个已知的RDD数据集通过转换获得一个新的RDD数据集,这些Transformation操做包括map、filter、flatMap、union、join等,并且Transformation具备lazy的特性,调用这些操做并无马上执行对已知RDD数据集的计算操做,而是在调用了另外一类型的Action操做才会真正地执行。Action执行,会真正地对RDD数据集进行操做,返回一个计算结果给Driver程序,或者没有返回结果,如将计算结果数据进行持久化,Action操做包括reduceByKey、count、foreach、collect等。关于Transformations和Actions更详细内容,能够查看官网文档。
一样、Spark Streaming提供了相似Spark的两种操做类型,分别为Transformations和Output操做,它们的操做对象是DStream,做用也和Spark相似:Transformation从一个已知的DStream通过转换获得一个新的DStream,并且Spark Streaming还额外增长了一类针对Window的操做,固然它也是Transformation,可是能够更灵活地控制DStream的大小(时间间隔大小、数据元素个数),例如window(windowLength, slideInterval)、countByWindow(windowLength, slideInterval)、reduceByWindow(func, windowLength, slideInterval)等。Spark Streaming的Output操做容许咱们将DStream数据输出到一个外部的存储系统,如数据库或文件系统等,执行Output操做相似执行Spark的Action操做,使得该操做以前lazy的Transformation操做序列真正地执行。
数据库