Spark Streaming

介紹

許多應(yīng)用需要處理及時(shí)收到的數(shù)據(jù),Spark Streaming是Spark為這些應(yīng)用而設(shè)計(jì)的模型祸穷。它允許用戶使用一套和批處理非常接近的 API 來(lái)編寫(xiě)流式計(jì)算應(yīng)用,這樣就可以大量重用批處理應(yīng)用的技術(shù)甚至代碼。

和Spark基于RDD的概念很相似搏屑,Spark Streaming使用離散化流(discretized stream)作為抽象表示溃肪,叫作 DStream免胃。DStream 是隨時(shí)間推移而收到的數(shù)據(jù)的序列。在內(nèi)部乍惊,每個(gè)時(shí)間區(qū)間收到的數(shù)據(jù)都作為 RDD 存在杜秸,而 DStream 是由這些 RDD 所組成的序列(因此得名“離散化”)。DStream 可以從各種輸入源創(chuàng)建润绎,比如 Flume撬碟、Kafka 或者 HDFS。創(chuàng)建出來(lái)的 DStream 支持兩種操作莉撇,一種是轉(zhuǎn)化操作(transformation)呢蛤,會(huì)生成一個(gè)新的DStream,另一種是輸出操作(output operation)棍郎,可以把數(shù)據(jù)寫(xiě)入外部系統(tǒng)中其障。DStream提供了許多與 RDD 所支持的操作相類似的操作支持,還增加了與時(shí)間相關(guān)的新操作涂佃,比如滑動(dòng)窗口励翼。

轉(zhuǎn)化操作

DStream 的轉(zhuǎn)化操作可以分為無(wú)狀態(tài)(stateless)和有狀態(tài)(stateful)兩種。

? 在無(wú)狀態(tài)轉(zhuǎn)化操作中辜荠,每個(gè)批次的處理不依賴于之前批次的數(shù)據(jù)汽抚。第3章和第4章中所講的常見(jiàn)的 RDD 轉(zhuǎn)化操作,例如 map()伯病、filter()造烁、reduceByKey() 等,都是無(wú)狀態(tài)轉(zhuǎn)化操作午笛。

? 相對(duì)地惭蟋,有狀態(tài)轉(zhuǎn)化操作需要使用之前批次的數(shù)據(jù)或者是中間結(jié)果來(lái)計(jì)算當(dāng)前批次的數(shù)據(jù)。有狀態(tài)轉(zhuǎn)化操作包括基于滑動(dòng)窗口的轉(zhuǎn)化操作和追蹤狀態(tài)變化的轉(zhuǎn)化操作药磺。

無(wú)狀態(tài)轉(zhuǎn)換的例子:

  • map
  • flatmap
  • filter
  • repartition
  • reducebykey
  • groupbykey

無(wú)狀態(tài)轉(zhuǎn)化操作也能在多個(gè) DStream 間整合數(shù)據(jù)告组,不過(guò)也是在各個(gè)時(shí)間區(qū)間內(nèi)。例如与涡,鍵值對(duì) DStream 擁有和 RDD 一樣的與連接相關(guān)的轉(zhuǎn)化操作惹谐,也就cogroup()持偏、join()、leftOuterJoin() 等

Transform(): 可以讓你直接操作其內(nèi)部的rdd氨肌。

val outlierDStream = accessLogsDStream.transform { rdd =>
       extractOutliers(rdd)
}

有狀態(tài)轉(zhuǎn)換

DStream 的有狀態(tài)轉(zhuǎn)化操作是跨時(shí)間區(qū)間跟蹤數(shù)據(jù)的操作;也就是說(shuō)鸿秆,一些先前批次的數(shù)據(jù)也被用來(lái)在新的批次中計(jì)算結(jié)果。主要的兩種類型是滑動(dòng)窗口和 updateStateByKey()怎囚,前者以一個(gè)時(shí)間階段為滑動(dòng)窗口進(jìn)行操作卿叽,后者則用來(lái)跟蹤每個(gè)鍵的狀態(tài)變化(例如構(gòu)建一個(gè)代表用戶會(huì)話的對(duì)象)。

基于窗口的轉(zhuǎn)化操作

所有基于窗口的操作都需要兩個(gè)參數(shù)恳守,分別為窗口時(shí)長(zhǎng)以及滑動(dòng)步長(zhǎng)考婴,兩者都必須是StreamContext 的批次間隔的整數(shù)倍。窗口時(shí)長(zhǎng)控制每次計(jì)算最近的多少個(gè)批次的數(shù)據(jù)催烘,其實(shí)就是最近的 windowDuration/batchInterval 個(gè)批次沥阱。如果有一個(gè)以 10 秒為批次間隔的源DStream,要?jiǎng)?chuàng)建一個(gè)最近 30 秒的時(shí)間窗口(即最近 3 個(gè)批次)伊群,就應(yīng)當(dāng)把 windowDuration設(shè)為 30 秒考杉。而滑動(dòng)步長(zhǎng)的默認(rèn)值與批次間隔相等,用來(lái)控制對(duì)新的 DStream 進(jìn)行計(jì)算的間隔舰始。如果源 DStream 批次間隔為 10 秒崇棠,并且我們只希望每?jī)蓚€(gè)批次計(jì)算一次窗口結(jié)果,就應(yīng)該把滑動(dòng)步長(zhǎng)設(shè)置為 20 秒丸卷。

val el=errerlines.window(Seconds(3), Seconds(3))
  el.count()

盡管可以使用window()寫(xiě)出所有的窗口操作枕稀,Spark Streaming還是提供了一些其他的窗口操作,讓用戶可以高效而方便地使用谜嫉。首先萎坷,reduceByWindow() 和 reduceByKeyAndWindow()讓我們可以對(duì)每個(gè)窗口更高效地進(jìn)行歸約操作。

輸出操作

輸出操作指定了對(duì)流數(shù)據(jù)經(jīng)轉(zhuǎn)化操作得到的數(shù)據(jù)所要執(zhí)行的操作(例如把結(jié)果推入外部數(shù)據(jù)庫(kù)或輸出到屏幕上)沐兰。

  1. print

  2. ipAddressRequestCount.saveAsTextFiles("outputDir", "txt")

  3. saveashadoopfiles

  4. Sequence file

    val writableIpAddressRequestCount = ipAddressRequestCount.map {
           (ip, count) => (new Text(ip), new LongWritable(count)) }
         writableIpAddressRequestCount.saveAsHadoopFiles[
           SequenceFileOutputFormat[Text, LongWritable]]("outputDir", "txt")
    
  5. foreachrdd

24/7不間斷運(yùn)行

檢查點(diǎn)機(jī)制

檢查點(diǎn)機(jī)制是我們?cè)赟park Streaming中用來(lái)保障容錯(cuò)性的主要機(jī)制食铐。它可以使SparkStreaming階段性地把應(yīng)用數(shù)據(jù)存儲(chǔ)到諸如HDFS或Amazon S3這樣的可靠存儲(chǔ)系統(tǒng)中,以供恢復(fù)時(shí)使用僧鲁。具體來(lái)說(shuō),檢查點(diǎn)機(jī)制主要為以下兩個(gè)目的服務(wù)象泵。

  • 控制發(fā)生失敗時(shí)需要重算的狀態(tài)數(shù)寞秃。SparkStreaming可以通過(guò)轉(zhuǎn)化圖的譜系圖來(lái)重算狀態(tài),檢查點(diǎn)機(jī)制則可以控制需要在轉(zhuǎn)化圖中回溯多遠(yuǎn)偶惠。
  • 提供驅(qū)動(dòng)器程序容錯(cuò)春寿。如果流計(jì)算應(yīng)用中的驅(qū)動(dòng)器程序崩潰了,你可以重啟驅(qū)動(dòng)器程序并讓驅(qū)動(dòng)器程序從檢查點(diǎn)恢復(fù)忽孽,這樣Spark Streaming就可以讀取之前運(yùn)行的程序處理數(shù)據(jù)的進(jìn)度绑改,并從那里繼續(xù)谢床。

驅(qū)動(dòng)器程序容錯(cuò)

驅(qū)動(dòng)器程序的容錯(cuò)要求我們以特殊的方式創(chuàng)建 StreamingContext。我們需要把檢查點(diǎn)目錄提供給 StreamingContext厘线。與直接調(diào)用 new StreamingContext 不同识腿,應(yīng)該使用StreamingContext.getOrCreate() 函數(shù)。

性能考量

批次和窗口大性熳场(500ms)

并行度

? 增加接收器數(shù)目有時(shí)如果記錄太多導(dǎo)致單臺(tái)機(jī)器來(lái)不及讀入并分發(fā)的話渡讼,接收器會(huì)成為系統(tǒng)瓶頸。這時(shí)你就需要通過(guò)創(chuàng)建多個(gè)輸入 DStream(這樣會(huì)創(chuàng)建多個(gè)接收器)來(lái)增加接收器數(shù)目耳璧,然后使用 union 來(lái)把數(shù)據(jù)合并為一個(gè)數(shù)據(jù)源成箫。

? 將收到的數(shù)據(jù)顯式地重新分區(qū)
如果接收器數(shù)目無(wú)法再增加,你可以通過(guò)使用 DStream.repartition 來(lái)顯式重新分區(qū)輸
入流(或者合并多個(gè)流得到的數(shù)據(jù)流)來(lái)重新分配收到的數(shù)據(jù)旨枯。

? 提高聚合計(jì)算的并行度
對(duì)于像 reduceByKey() 這樣的操作蹬昌,你可以在第二個(gè)參數(shù)中指定并行度。

?
?
?

?
?
?

?
?
?
?

?

?
?
?
?

?
?
?

?
?
?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攀隔,一起剝皮案震驚了整個(gè)濱河市皂贩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竞慢,老刑警劉巖先紫,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異筹煮,居然都是意外死亡遮精,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)败潦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)本冲,“玉大人,你說(shuō)我怎么就攤上這事劫扒∶识矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵沟饥,是天一觀的道長(zhǎng)添怔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贤旷,這世上最難降的妖魔是什么广料? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮幼驶,結(jié)果婚禮上艾杏,老公的妹妹穿的比我還像新娘。我一直安慰自己盅藻,他們只是感情好购桑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布畅铭。 她就那樣靜靜地躺著,像睡著了一般勃蜘。 火紅的嫁衣襯著肌膚如雪硕噩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天元旬,我揣著相機(jī)與錄音榴徐,去河邊找鬼。 笑死匀归,一個(gè)胖子當(dāng)著我的面吹牛坑资,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穆端,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袱贮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了体啰?” 一聲冷哼從身側(cè)響起攒巍,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荒勇,沒(méi)想到半個(gè)月后柒莉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沽翔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年兢孝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仅偎。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跨蟹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橘沥,到底是詐尸還是另有隱情窗轩,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布座咆,位于F島的核電站痢艺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏介陶。R本人自食惡果不足惜腹备,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斤蔓。 院中可真熱鬧,春花似錦镀岛、人聲如沸弦牡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驾锰。三九已至卸留,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椭豫,已是汗流浹背耻瑟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏酥,地道東北人喳整。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像裸扶,于是被迫代替她去往敵國(guó)和親框都。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容