Spark Streaming使用Kafka保證數據零丟失

源文件放在github,隨着理解的深刻,不斷更新,若有謬誤之處,歡迎指正。原文連接https://github.com/jacksu/utils4s/blob/master/spark-knowledge/md/spark_streaming使用kafka保證數據零丟失.mdgit

spark streaming從1.2開始提供了數據的零丟失,想享受這個特性,須要知足以下條件:github

1.數據輸入須要可靠的sources和可靠的receivers分佈式

2.應用metadata必須經過應用driver checkpointoop

3.WAL(write ahead log)post

##可靠的sources和receivers性能

spark streaming能夠經過多種方式做爲數據sources(包括kafka),輸入數據經過receivers接收,經過replication存儲於spark中(爲了faultolerance,默認複製到兩個spark executors),若是數據複製完成,receivers能夠知道(例如kafka中更新offsets到zookeeper中)。這樣當receivers在接收數據過程當中crash掉,不會有數據丟失,receivers沒有複製的數據,當receiver恢復後從新接收。spa

image

##metadata checkpointcode

可靠的sources和receivers,可使數據在receivers失敗後恢復,然而在driver失敗後恢復是比較複雜的,一種方法是經過checkpoint metadata到HDFS或者S3。metadata包括:blog

  • configuration
  • code
  • 一些排隊等待處理但沒有完成的RDD(僅僅是metadata,而不是data) image

這樣當driver失敗時,能夠經過metadata checkpoint,重構應用程序並知道執行到那個地方。內存

##數據可能丟失的場景

可靠的sources和receivers,以及metadata checkpoint也不能夠保證數據的不丟失,例如:

  • 兩個executor獲得計算數據,並保存在他們的內存中
  • receivers知道數據已經輸入
  • executors開始計算數據
  • driver忽然失敗
  • driver失敗,那麼executors都會被kill掉
  • 由於executor被kill掉,那麼他們內存中得數據都會丟失,可是這些數據再也不被處理
  • executor中的數據不可恢復

##WAL

爲了不上面情景的出現,spark streaming 1.2引入了WAL。全部接收的數據經過receivers寫入HDFS或者S3中checkpoint目錄,這樣當driver失敗後,executor中數據丟失後,能夠經過checkpoint恢復。 image

##At-Least-Once 儘管WAL能夠保證數據零丟失,可是不能保證exactly-once,例以下面場景:

  • Receivers接收完數據並保存到HDFS或S3

  • 在更新offset前,receivers失敗了 image

  • Spark Streaming覺得數據接收成功,可是Kafka覺得數據沒有接收成功,由於offset沒有更新到zookeeper

  • 隨後receiver恢復了

  • 從WAL能夠讀取的數據從新消費一次,由於使用的kafka High-Level消費API,從zookeeper中保存的offsets開始消費

##WAL的缺點 經過上面描述,WAL有兩個缺點:

  • 下降了receivers的性能,由於數據還要存儲到HDFS等分佈式文件系統
  • 對於一些resources,可能存在重複的數據,好比Kafka,在Kafka中存在一份數據,在Spark Streaming也存在一份(以WAL的形式存儲在hadoop API兼容的文件系統中)

##Kafka direct API 爲了WAL的性能損失和exactly-once,spark streaming1.3中使用Kafka direct API。很是巧妙,Spark driver計算下個batch的offsets,指導executor消費對應的topics和partitions。消費Kafka消息,就像消費文件系統文件同樣。 image

1.再也不須要kafka receivers,executor直接經過Kafka API消費數據

2.WAL再也不須要,若是從失敗恢復,能夠從新消費

3.exactly-once獲得了保證,不會再從WAL中重複讀取數據

##總結

主要說的是spark streaming經過各類方式來保證數據不丟失,並保證exactly-once,每一個版本都是spark streaming愈來愈穩定,愈來愈向生產環境使用發展。

##參考 spark-streaming Recent Evolution of Zero Data Loss Guarantee in Spark Streaming With Kafka

相關文章
相關標籤/搜索