Spark Streaming使用Kafka保證資料零丟失
spark streaming從1.2開始提供了資料的零丟失,想享受這個特性,需要滿足如下條件:
資料輸入需要可靠的sources和可靠的receivers
應用metadata必須通過應用driver checkpoint
WAL(write ahead log)
可靠的sources和receivers
spark streaming可以通過多種方式作為資料sources(包括kafka),輸入資料通過receivers接收,通過replication儲存於spark中(為了faultolerance,預設複製到兩個spark executors),如果資料複製完成,receivers可以知道(例如kafka中更新offsets到zookeeper中)。這樣當receivers在接收資料過程中crash掉,不會有資料丟失,receivers沒有複製的資料,當receiver恢復後重新接收。
metadata checkpoint
可靠的sources和receivers,可以使資料在receivers失敗後恢復,然而在driver失敗後恢復是比較複雜的,一種方法是通過checkpoint metadata到HDFS或者S3。metadata包括:
configuration
code
一些排隊等待處理但沒有完成的RDD(僅僅是metadata,而不是data)
這樣當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恢復。
At-Least-Once
儘管WAL可以保證資料零丟失,但是不能保證exactly-once,例如下面場景:
Receivers接收完資料並儲存到HDFS或S3
在更新offset前,receivers失敗了
- 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訊息,就像消費檔案系統檔案一樣。
- 不再需要kafka receivers,executor直接通過Kafka API消費資料
- WAL不再需要,如果從失敗恢復,可以重新消費
- exactly-once得到了保證,不會再從WAL中重複讀取資料
總結
主要說的是spark streaming通過各種方式來保證資料不丟失,並保證exactly-once,每個版本都是spark streaming越來越穩定,越來越向生產環境使用發展。
相關文章
- Spark Streaming和Kafka整合是如何保證資料零丟失SparkKafka
- kafka 如何保證不重複消費又不丟失資料?Kafka
- Kafka零資料丟失的配置方案Kafka
- Elasticsearch如何保證資料不丟失?Elasticsearch
- Redis能保證資料不丟失嗎?Redis
- spark streaming執行kafka資料來源SparkKafka
- Spark Streaming讀取Kafka資料兩種方式SparkKafka
- Oracle Goldengate是如何保證資料有序和確保資料不丟失的?OracleGo
- 優步是如何用Kafka構建可靠的重試處理保證資料不丟失Kafka
- Elasticsearch 如何保證寫入過程中不丟失資料的Elasticsearch
- Kafka重複消費和丟失資料研究Kafka
- Spark Streaming 之 Kafka 偏移量管理SparkKafka
- RabbitMQ-如何保證訊息不丟失MQ
- spark-streaming-kafka透過KafkaUtils.createDirectStream的方式處理資料SparkKafka
- 雲小課|MRS資料分析-透過Spark Streaming作業消費Kafka資料SparkKafka
- Kafka如何保證訊息不丟之無訊息丟失配置Kafka
- Spark Streaming和Kafka整合開發指南(一)SparkKafka
- Spark Streaming和Kafka整合開發指南(二)SparkKafka
- 服務重啟了,如何保證執行緒池中的資料不丟失?執行緒
- Spark streaming消費Kafka的正確姿勢SparkKafka
- BigDecimal為什麼能保證精度不丟失?Decimal
- kafka 消費組功能驗證以及消費者資料重複資料丟失問題說明 3Kafka
- 整合Kafka到Spark Streaming——程式碼示例和挑戰KafkaSpark
- 非同步流複製模式如何保證不丟資料?非同步模式
- Spark CommitCoordinator 保證資料一致性SparkMIT
- Redis 中如何保證資料的不丟失,Redis 中的持久化是如何進行的Redis持久化
- 使用 ES-Hadoop 將 Spark Streaming 流資料寫入 ESHadoopSpark
- Spark streaming + Kafka 流式資料處理,結果儲存至MongoDB、Solr、Neo4j(自用)SparkKafkaMongoDBSolr
- 訊息推送平臺有沒有保證資料不丟?
- Spark-Streaming的學習使用Spark
- RabbitMQ使用教程(四)如何通過持久化保證訊息99.99%不丟失?MQ持久化
- 為什麼使用Socket接收時丟失資料?
- Kafka+Spark Streaming+Redis實時計算整合實踐KafkaSparkRedis
- 在 Flink 運算元中使用多執行緒如何保證不丟資料?執行緒
- rman恢復:資料檔案丟失,控制檔案丟失,聯機日誌檔案丟失(非當前使用與當前使用)
- 實戰|使用Spark Streaming寫入HudiSpark
- Spark學習進度11-Spark Streaming&Structured StreamingSparkStruct
- 關於MQ的幾件小事(四)如何保證訊息不丟失MQ