spark streaming初試之wordcount

本文來自於spark的官方文檔,在運行這個例子的時候遇到了一些問題,解決之後記錄下來這個spark streaming的wordcount例子的完整運行過程。算是spark streaming的一次初體驗吧。
Spark streaming是一個離散化的流數據處理工具,將數據按照時間窗口切分成一個個RDD然後再處理。所以和逐條處理記錄的storm比起來延遲稍大,在一些不需要秒內延遲的數據處理業務中,spark streaming的表現還是不錯的。
簡單介紹之後進入正題:
本例是創建一個實時的wordcount程序,程序監聽TCP套接字的數據服務器獲取文本數據,然後計算文本中包含的單詞數。本例是在spark-shell中實現的,如果想編寫獨立的應用程序會稍有不同。在編寫程序之前我們要先運行Netcat作爲數據服務器,比如你可以在master節點運行以下命令:
nc –lk 9999

運行結果如下:


這時下面會有一個光標在閃動。然後在spark-shell中輸入 :paste 回車,冒號也要輸入,進入粘貼模式。


然後將下面的代碼複製過去:

import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._
val ssc = new StreamingContext(sc, Seconds(1))
val lines = ssc.socketTextStream("master", 9999)

val words = lines.flatMap(_.split(" "))
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)
// Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.print()

ssc.start()             // Start the computation
ssc.awaitTermination()  // Wait for the computation to terminate

按下ctrl+D執行這段代碼。這時會不斷打印出處理結果,每1s打印一次:


這時我們在第二個終端輸入hello word,回車:


看到如下結果,說明測試成功:


下面解釋一下這段代碼:

在上面的代碼中,我們首先導入相關的類。然後創建一個StreamingContext對象,這個對象類似於sparkcontext,是spark所有流操作的主要入口。

這裏要注意一點,官方文檔中的ssc創建方式是這樣的:

val conf = newSparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = newStreamingContext(conf, Seconds(1))

這是在獨立應用中的創建方式,如果在spark-shell下這樣做會報異常,因爲在spark-shell中默認給我們創建好了一個sparkcontext對象sc,而上面這種方式則相當於又創建了一個匿名的sparkcontext,這樣就起了衝突。因爲在一個進程中只能有一個sparkcontext。

參數Second(1)表示數據流按照1s進行切分。接下來連接地址、端口。你可以將任何一個安裝了netcat的機器作爲這裏的測試數據服務器。只需要填寫對應的地址、端口就可以了。

這個lines變量是一個DStream,表示即將從數據服務器獲得的流數據。這個DStream的每條記錄都代表一行文本。下一步,我們需要將DStream中的每行文本都切分爲單詞。

flatMap是一個一對多的DStream操作,它通過把源DStream的每條記錄都生成多條新記錄來創建一個新的DStream。在這個例子中,每行文本都被切分成了多個單詞,我們把切分的單詞流用words這個DStream表示。

words這個DStream被mapper(一對一轉換操作)成了一個新的DStream,它由(word,1)對組成。然後,我們就可以用這個新的DStream計算每批數據的詞頻。最後,我們用wordCounts.print()打印每秒計算的詞頻。

需要注意的是,當以上這些代碼被執行時,SparkStreaming僅僅準備好了它要執行的計算,實際上並沒有真正開始執行。在這些轉換操作準備好之後,要真正執行計算,需要調用如下的方法:

ssc.start()             // Start the computation

ssc.awaitTermination()  // Wait for the computation to terminate


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章