背景
很多重要的应用要处理大量在线流式数据,并返回近似实时的结果,比如社交网络趋势追踪,网站指标统计,广告系统。所以需要具备分布式流式处理框架的基本特征,包括良好的扩展性(百级别节点)和低延迟(秒级别)。
批处理
MapReduce和Spark Core都是批处理:需要收集数据,然后分批处理,这样一般会有一定的延时。
流式处理
数据收集后,直接处理。
流式计算框架
Spark Streaming 是微批(微小批处理)处理,可以达到秒级延时。
Spark Streaming将Spark扩展为大规模流处理系统,可以扩展到100节点规模,达到秒级延迟,高效且具有良好的容错性,提供了类似批处理的API,可以很容易实现复杂算法。Spark Streaming可以和其他系统做很好的集成。
Spark Streaming运行原理
Spark Streaming将流式计算转化为一批很小的、确定的批处理作业(micro-batch)。它以X秒为单位将数据流切分成离散的作业,将每批数据看做RDD,使用RDD操作符处理,最终结果以RDD为单位返回(写入HDFS或者其他系统)。Spark Streaming仍然是运行在Driver Executor的环境里。
Hashtag是微博内容中的标签,可用于检索、建索引等,Twitter提供了流式获取Hashtag的API,Spark Streaming封装了Twitter的Hashtag API。
从Twitter中获取Hashtag
输入Twitter的用户名和密码,就会实时的查看关注的大V发的微博,大V发的微博会像流一样实时的推送过来,流式数据切分成一个个的Batch,以秒为单位定义成DStream,相当于一个RDD流。
// 构造一个StreamingContext对象,并将每秒产生的数据作为一批处理
val ssc = new StreamingContext(sparkConf, Seconds(1))
// 通过StreamingContext 中的twitterStream接口,创建DStream,DStream是一块代表流式数据的RDD序列
val tweets = ssc.twitterStream()
// Transformation: 从一个Dstream得到另一个Dstream
val hashTags = tweets.flatMap (status => getTags(status))
// Output Operation: 将数据写入外部存储设备
hashTags.saveAsHadoopFiles("hdfs://...")
Spark Stream:
DStream->Transformation->DStream
Spark SQL:
Dataframe/Dataset ->Transformation->Dataframe/Dataset
Spark:
RDD->Transformation->RDD
Spark Stream类似一个服务,永远不会运行结束,它跟着数据的流入运算,会产生很多小文件。如果没有数据流入就一直监听,看是否有新的数据进来。批处理会结束,它扫描完数据源后就开始运算,再写入数据源目录的数据文件不会被包含进来。
Spark Streaming程序设计
实例:NetworkWordCount
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.{Seconds, StreamingContext}
val sparkConf = new SparkConf().setAppName("NetworkWordCount")
val ssc =