天天看點

Facebook的實時流處理技術

随着雲計算大資料的發展,有越來越多的場景需要借助于實時資料處理技術,為此有很多公司開發了自己的實時處理系統,facebook就是其中的一員,他們建構的實時資料處理生态系統每秒鐘能夠處理數百gb的資料。本文介紹了facebook在設計該系統時從易用性、性能、容錯、可伸縮性以及正确性等方面考慮所做的重要設計決策,這些決策和系統如何滿足秒級的延遲需求,以及在建構該系統的過程中facebook所總結的經驗教訓。

易用性:處理需求有多複雜?sql是否足夠?是否必須要使用c++或者java這樣的程式設計語言?使用者編寫、測試和部署一個新的應用程式需要多長時間? 性能:允許多長時間的延遲,毫秒級,秒級,還是分鐘級?單機或者總體需要多大的吞吐量? 容錯能力:可以容忍哪些類型的錯誤?資料處理或輸出的次數通過什麼語義來保證?系統如何存儲和恢複記憶體狀态? 可伸縮性:資料是否支援分片進而進行并行處理?系統是否能夠容易地随着資料量的變化進行調整?是否可以重新處理之前的有價值的老資料? 正确性:是否需要acid特性?作為輸入的所有資料是否都需要被處理并在最終的結果中出現?

以及不同的流處理系統所做的設計決策:

語言範式決定了編寫應用程式的難易程度以及開發者對性能的操控程度。基本有三種選擇:聲明式,函數式以及過程式程式設計語言。對于facebook而言,單一的某種語言無法滿足所有的用例,是以他們開發了三種不同的流處理系統。 

資料傳輸對流處理系統的容錯性、性能和可伸縮性都有非常大的影響,傳統的資料傳輸方式包括:直接消息傳輸、基于代理的消息傳輸和基于持久化存儲的消息傳輸。facebook使用scribe,一種持久化的消息總線,來連接配接不同的處理節點。 

處理語義包括狀态語義(每一個輸入事件最少被計數一次、最多被計數一次還是隻被計數一次?)和輸出語義(給定的輸出值在輸出流中最少出現一次、最多出現一次還是隻出現一次?)。其中無狀态的處理器隻有輸出語義,而有狀态的處理器這兩種語義都有。facebook對不同的應用通常有不同的狀态和輸出語義需求,因而開發了puma、stylus和swift三個支援不同語義的系統。 

狀态儲存機制的實作方式有很多,包括複制副本、本地資料庫持久化、遠端資料庫持久化、上遊備份以及全局一緻性快照等。facebook實作了兩種狀态儲存機制,其中puma實作了遠端資料庫存儲,而stylus則實作了本地和遠端資料庫存儲。 

再處理的方式有三種:僅使用流處理;維護兩個單獨的系統,一個用于流處理,一個用于批處理;開發一個能夠在批處理環境中運作的流處理系統。facebook采用了一種與spark streaming以及flink都不同的處理方式,他們使用标準的mapreduce架構從hive中讀取資料并在批處理環境中運作流處理應用程式。puma應用可以運作在hive環境中,而stylus則提供了三種類型的處理器:無狀态的處理器,通用的有狀态的處理器和一個居中的流處理器。

在系統建設方面,facebook的主要設計目标是秒級的延遲,每秒鐘能夠處理幾百gb的資料,為此他們通過一個持久化消息總線将所有的處理元件連接配接起來進行資料傳輸,同時也将資料的處理和傳輸解耦,實作容錯、可伸縮、易用性和正确性。整個系統的架構圖如下:

該圖闡述了facebook實時處理系統的資料流,資料從左側的移動和web産品中産生,然後被送入scribe(一個分布式資料傳輸系統),而puma、stylus和swift等實時流處理系統則從scribe中讀取資料并将處理結果寫入scribe。puma、stylus和swift可以根據需要通過scribe連接配接成一個複雜的dag(有向無環圖)。

接下來是使用該實時處理系統的一個示例應用,該應用識别一個輸入事件流中的趨勢事件,以5分鐘為機關對這段時間内産生的話題按事件數排序。每個事件包含一個事件類型,一個次元id(用于擷取事件的次元資訊,例如使用的程式設計語言)和一個文本(用于分類事件主題,例如電影或者嬰兒)。該應用有4個處理節點,每一個都可以并行執行,整體流程圖如下:

在該圖中,filterer會根據事件類型過濾輸入流,然後将輸出按照次元id進行分片,這樣下一個節點就能夠并行處理分片資料了。joiner通過次元id從一個或者多個外部系統檢索資訊,然後根據事件的文本内容對其按照話題進行分類。scorer記錄着最近一段時間内每一個話題的事件數,同時還會跟蹤這些計數器的長期趨勢。ranker則計算每n分鐘每一個話題的前k個事件是什麼。

最後是facebook在建構該系統的過程總結的一些經驗教訓:首先,沒有一個單獨的流處理系統能夠适應所有場景,針對不同的點使用不同的系統才能更好地解決問題;其次易用性不僅包括使用,還包括開發、調試、部署、監控和運維等方面;最後,流處理和批處理并不是互斥的,組合使用這兩種系統能夠加速資料的處理速度。

====================================分割線================================

本文轉自d1net(轉載)