1. 程式人生 > >Stream Processing:Apache Flink快照(snapshot)原理

Stream Processing:Apache Flink快照(snapshot)原理

本文將要講解的是Apache Flink分散式流處理的輕量非同步的快照原理。網上已經有幾篇相關的博文,而本文的不同之處在於,它不是論文的純粹翻譯(論文地址),而是用自己的語言結合自己的理解對其原理的闡述。

本文將同下面幾個方面講解:

  1. 什麼是快照?為什麼需要快照?
  2. 跟其他系統的快照相比,Apache Flink快照的原理有哪些優點?
  3. Apache Flink的快照原理是什麼?

1. 什麼是快照?為什麼需要快照?

快照,英文名字叫snapshot,是指對系統當前執行狀態的儲存,以便在系統故障宕機的時候恢復之前某一個時間點的狀態資訊,從而繼續執行。快照是系統實現可用性的必要功能,是分散式系統實現容錯性的常規方法。

一般將快照儲存在本機硬碟上,或者暫時其他機器的記憶體或者直接儲存在其他機器硬碟上面。對於暫時儲存在其他機器的記憶體上面的情況,應當以批量的方式定時將記憶體中的快照刷的硬碟中,實現持久化。批量的方式的優點是減少硬碟的訪問量,缺點是有很小的丟失快照的可能性。

2. 跟其他系統的快照相比,Apache Flink快照的原理有哪些優點?

這裡我們將對比Apache Spark、Apache Hadoop和Apache Flink三個系統的快照功能。

下面是Spark的運算元運算圖,該圖是有向無環的。資料從左邊輸入(A和C),最終以G為結束點。我們知道Spark採用批處理的方式來處理大資料,批處理區別於流處理。在Spark中,通過上游節點重新計算來恢復在宕機之前的資料。比如,如果B宕機了,那麼重新計算A生成輸入B的資料。這樣做的優點是不需要儲存運算元的當前的狀態資訊,節省空間。缺點是增加了計算量以及計算所需要的時間。
在這裡插入圖片描述

Apache Hadoop,這裡具體指HDFS,它採用的是備份資料到不同的(機架)機器硬碟上面來實現。預設為複製三分。優點是乾脆利落,能夠同時支援HDFS作為儲存系統的時候的資料容錯備份,也可以作為Mapreduce計算的中間結果的容錯備份。缺點是在速度方面有點慢。

Apache Flink採用了上面兩種不同的快照功能。其優點是非同步的(即使是單機)輕量級的,所需要儲存的快照資訊也相對較少。

3. Apache Flink的快照原理是什麼?

Flink的快照功能針對兩種計算網路分別闡述,第一種是有向無環計算網路,第二種是有向有環的計算網路。

下面第一張圖是有向無環的計算網路,一個節點的計算結果沒有出現返回倒流的情況。圖中的表示分別表示為:
圓圈表示流中的資料,黃圈和紫圈表示屏障傳送之前的資料,他們分別來自兩個不同的資料來源,白圈表示屏障傳送之後的資料。圖中的資料之間的黑色線段表示一個屏障。屏障也沒有什麼特別的地方,它只是流中有著特殊標誌的資料。圖中箭頭表示一個數據流,紅色箭頭表示暫時停止接收該流中的資料(停止接收不等於丟棄)。
現在系統要生成一個快照,

  1. 首先在所有的資料來源注入屏障資料,然後向所有的輸出節點廣播屏障資料
  2. 如果一個非資料來源的節點收到屏障,就阻塞該屏障所在的輸入流,也就是暫時不接受這一個輸入流的資料,直到接收到其他輸入流的所有屏障。所以,如果該節點只有一個輸入流,不用阻塞等待。
  3. 當這個節點接收到了跟其連線的輸入流的所有屏障,便開始生成一個當前節點的一個快照。
    在這裡插入圖片描述
    分析:
  • 可中斷性分析:因為它是有向無環圖,所以只要節點沒有宕掉,屏障肯定能夠被每一個節點接收到,然後生成一個快照。
  • 可行性分析:整個資料的處理過程滿足先進先出的原則,所以,在屏障前面的資料和狀態都為歷史狀態,不存在後到的資料先於屏障被處理。也就是上圖中白圈的資料總是後於屏障被處理。

下面這張圖表示有向有環圖,相比於上面的圖片,多了環。
如果要生成一個快照,同樣地,
1 首先向每一個數據源傳送屏障,
2 如果節點有多條輸入流,在接收到某一條流的屏障之後需要暫時停止對該流的接收,直到接收到該節點所有輸入流中的屏障。
3 對於某一個有倒向輸入流的節點,記錄下每一個倒向流動的資料,直到收到一個倒向的屏障(比如下圖圖c)。收到倒向的屏障之後,生成當前快照。

當前快照的內容包括當前節點的執行狀態資訊(這個跟有向無環圖一樣),還包含所有所記錄的倒向的資料。在下圖中,倒向的資料是被長方形圈住的三個紅點。

在這裡插入圖片描述

這種情況下的可中斷性和可行性跟上面差不多。對於倒向流的可中斷性也容易理解,因為一個有倒向流的節點總能收到一個倒向的屏障資料。

整個快照生成的過程基本上都是非同步的,除了在本節點的其他輸入流的屏障到來之前需要同步等待。

對於快照的儲存,對於有向無環圖,只需要儲存每一個計算節點的狀態資訊,對於有向有環圖,需要儲存節點的狀態資訊以及倒向的資料資訊。兩者都不需要儲存其他流管道中的資料。所謂的狀態資訊,舉一個例子,一個節點執行count統計計算,那麼它的狀態資訊就是一個int或者long型別的變數。

對於快照的恢復,需要考慮一些問題,比如重複的資料應避免重複計算。這個本文不重點講解,可以參考論文 Pietzuch. Making state explicit for imperative big data processing.

謝謝