我們的場景是通過spark-streaming讀取kafka數(shù)據(jù),實時持久化到hdfs上。并按day和hour分區(qū)。就像這種格式:

kafka:0.10.2.0
hdfs:2.7.3
spark:2.2.0
核心代碼如下:

repartition是由于生成文件數(shù)量過多,合理合并分區(qū)能減少。如果用coalesce會導(dǎo)致任務(wù)不能并行(如果是1, 就那就只有一個node運行)。
checkpoint能保證任務(wù)掛掉,在kafka數(shù)據(jù)沒有過期前重啟能繼續(xù)正確的運行。但是超過時間會報錯Kafka OffSetOutOfRange而導(dǎo)致失敗。如果此時你刪掉checkpoint dir,任務(wù)能正常執(zhí)行但是會發(fā)現(xiàn)它并不會去讀取kafka分區(qū)的數(shù)據(jù)。這是因為還有一個地方記錄著你的流式處理元信息。

它記錄著你流式批次信息,如果不刪除,spark-streaming會認(rèn)為你一直在提交過期的job,導(dǎo)致數(shù)據(jù)不被處理。
當(dāng)然,這只是結(jié)構(gòu)化流一點使用心得。更多的文檔信息在https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html