SparkStream整合Kafka直連方式的自動提交和手動提交偏移量
阿新 • • 發佈:2022-04-05
SparkStream新版本中支援與Kafka直連的方式。下圖是預設自動提交偏移量的情況。executor中的task會直連kafka對應的分割槽,消費完資料會把偏移量寫回到kafka中特殊的__consumer_offset中
這種方式控制偏移量不夠精準,無法保證資料的一致性,也就是exactly once。所以一般會關閉自動提交方式,來手動提交偏移量。
注意這裡手動提交就要拿出來偏移量,因為是DSteam形式的,所以只在源頭的RDD中存在,在呼叫
createDirectStream
方法生成DStream後,因為偏移量只在RDD中存在,所以要把DStream轉換成RDD。DStream轉換成RDD有倆種方式,
foreachRDD
和transform。這倆種方式都是執行在driver端的,不是生成task被排程到executor中的。
倆種方式的區別是foreachRDD只是方法,沒有返回值,它對每一個批次的RDD進行處理,如果要在後續使用window類的DStream操作會做不到,一般用來開闢對外連線。transform方法有返回值,後續可以繼續使用DStream操作。
所以綜上,手動提交偏移量,是在driver端獲取和更新偏移量的,executor只是執行action之後被排程過去的task運算元操作。