一、設置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"); |