從storm到spark streaming,再到flink,流式計算得到長足發展, 依託於spark平臺的spark streaming走出了一條自己的路,其借鑑了spark批處理架構,通過批處理方式實現了實時處理框架。為進一步瞭解spark streaming的相關內容,飛馬網於3月20日晚邀請到歷任百度大資料的高階工程師—王富平,線上上直播中,王老師針對spark streaming高階特性以及ndcg計算實踐進行了分享。
以下是本次直播的主要內容:
一.Spark Streaming簡介
1.spark是什麼?
spark就是一個批處理框架,它具有高效能、生態豐富的優勢。
在沒有spark之前,我們是怎麼做大資料分析的呢?其實在沒有spark之前,我們用的是基於Hadoop的MapReduce框架來做資料分析。時至今日,傳統的MapReduce任務並沒有完全退出市場,在一些資料量非常大的場景下,MapReduce表現地還是相當穩定的。
2.spark streaming是什麼?
spark streaming是按時間對資料進行分批處理的框架,.spark平臺帶來的優勢,使得spark streaming開發簡單、廣泛使用。
spark streaming的實現方式是基於spark的批處理理念,因此它可以直接使用spark平臺提供的工具元件。
通過上面這張圖,我們可以把spark streaming的輸入當成一個資料流,通過時間將資料進行分批處理,分批時間根據我們自己的業務情況而定。
3.WordCount的例子:
下面舉一個WordCount的例子,我們可以看到,短短几行程式碼,就實現了一個WordCount。由於spark平臺與Hadoop是直接打通的,我們可以很方便地把資料儲存到HDFS或資料庫裡,只需要運維一套spark平臺,我們就可以既做實時任務,又做離線分析任務,比較方便。
二.Spark Streaming的高階特性
1.Window特性:
基於上面簡單的WordCount例子,我們升級一下,假設我們需要每十秒鐘統計一次單詞在前一分鐘內出現次數,這個需求不是簡單的WordCount能夠實現的,這時候,我們就要使用到spark streaming提供的Window機制。
關於spark streaming的Window特性,有三個引數需要注意:Batch Internal(分批時間間隔)、Window width(視窗長度)、Sliding Internal(視窗滑動間隔)。根據剛才的需求,視窗長度是60s,視窗滑動間隔是10s,分批時間間隔是1s,這裡需要注意,分批時間間隔必須能被視窗長度和視窗滑動間隔整除。
通過講述,或許你感覺Window特性有些複雜,但實際上,建立一個視窗的流是非常簡單的,下面的兩張圖,是關於建立Window資料流和Window相關計算函式的,可以簡單瞭解下。
下面這張圖片是計算30s視窗期內的請求失敗率。我們看一下它的引數,視窗時間設定為30s,滑動間隔是2s。整個程式碼非常簡單,只需要多加一行程式碼,就能實現視窗流,之後這個流就能做一些正常計算。
我們簡單讀一下這個函式,首先建立一個視窗流,之後在任務裡面計算失敗的條數,用它來除以總條數,就得到請求失敗率。
2.Sql特性:
spark streaming的第二個特性就是Sql特性,spark streaming把資料封裝成DataFrame之後,天然就可以使用spark sql特性。
想完整使用寫sql的方式,我們首先要註冊臨時表。我們註冊的臨時表還可以與我們建的多張臨時表做join關聯,比較實用。
使用sql,自定義函式會給我們帶來很多擴充套件性,定義UDF有兩種方式:載入jar包UDF和動態定義UDF。
4.CheckPoint機制:
Spark通過使用CheckPoint儲存處理狀態甚至當前處理資料,一旦任務失敗後,可以利用CheckPoint對資料進行恢復。我們做資料處理,資料可靠性是很重要的,必須保證資料不丟失,Spark的CheckPoint機制就是幫助我們保障資料安全的。
CheckPoint機制主要有兩種:
那麼怎麼去實現CheckPoint機制呢?
有以下三個條件:
我們來對比一下有WAL和無WAL的兩張圖。實際上有WAL,它首先會把資料先存到HDFS,然後對任務邏輯進行備份,再去執行處理,任務失敗時,它會根據CheckPoint的資料,去讀HDFS儲存的資料,進行任務恢復。但實際上,這樣會有缺點,一方面是降低了receivers的效能,另一方面它只能保證At-Least-Once,不能保證exactly-once。
針對WAL的缺點,spark streaming對kafka進行優化,提供了Kafka direct API,效能大大提升。
三.NDCG指標計算
1.NDCG是什麼?
下面兩張圖片,是NDCG計算的具體例子。
2.NDCG在spark streaming實現:
我們如何用spark streaming實現NDCG計算呢?首先我們做了一個資料調研。
開始進行NDCG計算。
3.NDCG效能保障:
我們開發一個資料任務,不是靜態工作,要保障資料的穩定性,根據資料的情況,做一個容量預估,以保證資料的效能。容量預估是一個必不可少的步驟。
我們最常見的容量調節。
在NDCG指標計算過程中,我們還會遇到一些問題,就是NDCG支援四個維度的組合計算,維度組合較多、較複雜。
這時候,多維分析就要藉助於我們的OLAP引擎,目前我們使用的是Druid。
以上三大部分,就是這次線上直播分享的主要內容,在最後,王老師還針對大家提出的問題進行了一一解答,都有些什麼問題呢?我們一起來看一下。
1.每間隔5s讀一批資料,需要遍歷每天資料進行各種計算分析,計算的結果還需要快取作為下一次計算的參考,怎麼實現?
王老師:這是一個實時任務,需要儲存狀態資料的話,有幾種實現方式,第一個是spark streaming有儲存狀態資料的機制,第二種方式是,你可以把狀態資料儲存在一些KV資料庫裡,比如說spark等,也可以通過這種方式自己實現,不管哪條路,關鍵在於怎麼實現。
2.學spark有推薦的上船方式麼?
王老師:大家不要把spark看得那麼神奇,java8裡面提供的stream處理方式相關知識,和寫spark沒有多大區別,原理都是一樣的,你理解了java8怎麼寫、stream處理的各種方法和計算邏輯,那麼你就能理解spark streaming裡的各種計算邏輯,spark streaming唯一高大上的就是它做的分散式。
3. spark streaming 將來最有可能被什麼技術取代?
王老師:每個平臺都有各自的優缺點,目前來看,雖然Flink比較火,但是Storm依然存在,Spark也有自己所適合的場景,Flink也有它本身先進的機制,所以說,各有優勢。
最後,王老師向大家推薦了關於scala最經典的一本書—《programming in scala》,本次針對 spark streaming的直播內容簡明且有針對性,相信你一定收穫頗多。想了解更多更詳細內容的小夥伴們,可以關注服務號:FMI飛馬網,點選選單欄飛馬直播,即可進行學習。