Spark streaming實時計算程序的HA高可用

一、設置checkpoint目錄

在程序中,如果用到了updateStateByKey、window等有狀態的操作,自動進行checkpoint,必須設置checkpoint目錄。

checkpoint目錄:容錯的文件系統的目錄,比如說,HDFS

jssc.checkpoint("xxxxxxx");

設置完這個目錄之後,有些會自動進行checkpoint操作的DStream,就實現了HA高可用性;相當於吧數據保留一份在容錯文件系統中,一旦內存中的數據丟失,可以直接從文件系統中讀取數據,不需要重新計算。

 

二、Driver的高可用性

第一次在創建和啓動StreamingContext的時候,將持續不斷地將實時計算程序的元數據(比如,有些dstream或job執行到了哪個步驟),如果後面因爲某些原因導致driver節點掛掉,那麼可以讓spark集羣幫着我們自動重啓driver,然後繼續運行計算程序的時候,會接着之前的作業繼續執行,不會中斷,不會丟失數據。

第一次在創建和啓動StreamingContext的時候,將元數據寫入容錯的文件系統中(比如HDFS);spark-submit腳本中加一些參數;保證在driver掛掉之後,spark集羣可以自己將driver重新啓動起來;而且driver在啓動的時候,不會重新創建一個streaming context,而是從容錯文件系統中讀取之前的元數據信息,包括job的執行進度,接着之前的進度,繼續執行。

使用這種機制,必須使用cluster模式提交,確保driver運行在某個worker上面;

部分代碼參考如下:

JavaStreamingContextFactory contextFactory = new JavaStreamingContextFactory() {

  @Override

  public JavaStreamingContext create() {

    JavaStreamingContext jssc = new JavaStreamingContext(...); 

    JavaDStream<String> lines = jssc.socketTextStream(...);    

    jssc.checkpoint(checkpointDirectory);                      

    return jssc;

  }

};

 

JavaStreamingContext context = JavaStreamingContext.getOrCreate(checkpointDirectory, contextFactory);

context.start();

context.awaitTermination();

腳本部分參考代碼:

spark-submit

--deploy-mode cluster

--supervise

 

三、實現RDD高可用性:啓動WAL預寫日誌機制

spark streaming,從原理上來說,是通過receiver來進行數據接收的,接收到的數據會被劃分成一個一個的block;block會被組合成一個batch;針對一個batch,會創建一個rdd,啓動一個job來執行我們定義的算子操作;

receiver只要接收到數據,會立即將數據寫入一份到容錯文件系統上的checkpoint目錄中,一份到磁盤文件中,作爲數據的冗餘副本。所以,無論程序怎麼掛掉,或者數據丟失,數據都不可能會永久性地丟失。

WAL(Write-Ahead Log)預寫日誌機制

設置方法:

SparkConf.set("spark.streaming.receiver.writeAheadLog.enable ","true");

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章