大資料-SparkStreaming(一)

海戀北斗星發表於2020-09-28

                               大資料-SparkStreaming(一)

SparkStreaming簡介

SparkStreaming是對於Spark核心API的擴充,從而支援對於實時資料流的可擴充,高吞吐量和容錯性流處理。資料可以由多個源取得,例如:Kafka,Flume,Twitter,ZeroMQ,Kinesis或者TCP介面,同時可以使用由如map,reduce,join和window這樣的高層介面描述的複雜演算法進行處理。最終,處理過的資料可以被推送到檔案系統,資料庫和HDFS。

Spark Streaming 是基於spark的流式批處理引擎,其基本原理是把輸入資料以某一時間間隔批量的處理,當批處理間隔縮短到秒級時,便可以用於處理實時資料流。  

SparkStreaming架構流程

SparkStreaming程式入口

val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))
//或者
val ssc = new StreamingContext(new SparkContext(conf), Seconds(1))

什麼是DStream

離散資料流或者DStream是SparkStreaming提供的基本抽象。其表現資料的連續流,這個輸入資料流可以來自於源,也可以來自於轉換輸入流產生的已處理資料流。內部而言,一個DStream以一系列連續的RDDs所展現,這些RDD是Spark對於不變的,分散式資料集的抽象。一個DStream中的每個RDD都包含來自一定間隔的資料,如下圖:

在DStream上使用的任何操作都會轉換為針對底層RDD的操作。例如:之前那個將行的流轉變為詞流的例子中,flatMap操作應用於行DStream的每個RDD上 從而產生words DStream的RDD。如下圖:  

DStream運算元操作

Transformations

  • 實現把一個DStream轉換生成一個新的DStream,延遲載入不會觸發任務的執行
TransformationMeaning
map(func)對DStream中的各個元素進行func函式操作,然後返回一個新的DStream
flatMap(func)與map方法類似,只不過各個輸入項可以被輸出為零個或多個輸出項
filter(func)過濾出所有函式func返回值為true的DStream元素並返回一個新的DStream
repartition(numPartitions)增加或減少DStream中的分割槽數,從而改變DStream的並行度
union(otherStream)將源DStream和輸入引數為otherDStream的元素合併,並返回一個新的DStream.
count()通過對DStream中的各個RDD中的元素進行計數,然後返回只有一個元素的RDD構成的DStream
reduce(func)對源DStream中的各個RDD中的元素利用func進行聚合操作,然後返回只有一個元素的RDD構成的新的DStream.
countByValue()對於元素型別為K的DStream,返回一個元素為(K,Long)鍵值對形式的新的DStream,Long對應的值為源DStream中各個RDD的key出現的次數
reduceByKey(func, [numTasks])利用func函式對源DStream中的key進行聚合操作,然後返回新的(K,V)對構成的DStream
join(otherStream, [numTasks])輸入為(K,V)、(K,W)型別的DStream,返回一個新的(K,(V,W))型別的DStream
cogroup(otherStream, [numTasks])輸入為(K,V)、(K,W)型別的DStream,返回一個新的 (K, Seq[V], Seq[W]) 元組型別的DStream
transform(func)通過RDD-to-RDD函式作用於DStream中的各個RDD,可以是任意的RDD操作,從而返回一個新的RDD
updateStateByKey(func)根據key的之前狀態值和key的新值,對key進行更新,返回一個新狀態的DStream
reduceByKeyAndWindow視窗函式操作,實現按照window視窗大小來進行計算

Output Operations

  • 輸出運算元操作,觸發任務的真正執行
Output OperationMeaning
print()列印到控制檯
saveAsTextFiles(prefix, [suffix])儲存流的內容為文字檔案,檔名為"prefix-TIME_IN_MS[.suffix]".
saveAsObjectFiles(prefix, [suffix])儲存流的內容為SequenceFile,檔名為 "prefix-TIME_IN_MS[.suffix]".
saveAsHadoopFiles(prefix, [suffix])儲存流的內容為hadoop檔案,檔名為 "prefix-TIME_IN_MS[.suffix]".
foreachRDD(func)對Dstream裡面的每個RDD執行func

 

相關文章