基於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操做序列真正地執行。
數據庫