前言
老劉是一名即將找工作的研二學生,寫部落格一方面是複習總結大資料開發的知識點,一方面是希望幫助更多自學的小夥伴。由於老劉是自學大資料開發,肯定會存在一些不足,還希望大家能夠批評指正,讓我們一起進步!
今天講述的是SparkStreaming與Kafka的整合,這篇文章非常適合剛入門的小夥伴,也歡迎大家前來發表意見,老劉這次會用圖片的形式講述別人技術部落格沒有的一些細節,這些細節對剛入門的小夥伴是非常有用的!!!
正文
為什麼有SparkStreaming與Kafka的整合?
首先我們要知道為什麼會有SparkStreaming與Kafka的整合,任何事情的出現都不是無緣無故的!
我們要知道Spark作為實時計算框架,它僅僅涉及到計算,並沒有涉及到資料的儲存,所以我們後期需要使用spark對接外部的資料來源。SparkStreaming作為Spark的一個子模組,它有4個型別的資料來源:
- socket資料來源(測試的時候使用)
- HDFS資料來源(會用到,但是用得不多)
- 自定義資料來源(不重要,沒怎麼見過別人會自定義資料來源)
- 擴充套件的資料來源(比如kafka資料來源,它非常重要,面試中也會問到)
下面老劉圖解SparkStreaming與Kafka的整合,但只講原理,程式碼就不貼了,網上太多了,老劉寫一些自己理解的東西!
SparkStreaming整合Kafka-0.8
SparkStreaming與Kafka的整合要看Kafka的版本,首先要講的是SparkStreaming整合Kafka-0.8。
在SparkStreaming整合kafka-0.8中,要想保證資料不丟失,最簡單的就是靠checkpoint的機制,但是checkpoint機制有一個毛病,對程式碼進行升級後,checkpoint機制就失效了。所以如果想實現資料不丟失,那麼就需要自己管理offset。
大家對程式碼升級會不會感到陌生,老劉對它好好解釋一下!
我們在日常開發中常常會遇到兩個情況,程式碼一開始有問題,改一下,然後重新打包,重新提交;業務邏輯發生改變,我們也需要重新修改程式碼!
而我們checkpoint第一次持久化的時候會整個相關的jar給序列化成一個二進位制檔案,這是一個獨一無二的值做目錄,如果SparkStreaming想通過checkpoint恢復資料,但如果程式碼發生改變,哪怕一點點,就找不到之前打包的目錄,就會導致資料丟失!
所以我們需要自己管理偏移量!
用ZooKeeper叢集管理偏移量,程式啟動後,就會讀取上一次的偏移量,讀取到資料後,SparkStreaming就會根據偏移量從kafka中讀取資料,讀到資料後,程式會執行。執行完後,就會提交偏移量到ZooKeeper叢集,但有一個小問題,程式執行掛了,但偏移量未提交,結果已經部分到HBase,再次重新讀取的時候,會有資料重複,但隻影響一批次,對大資料來說,影響太小!
但是有個非常嚴重的問題,當有特別多消費者消費資料的時候,需要讀取偏移量,但ZooKeeper作為分散式協調框架,它不適合大量的讀寫操作,尤其是寫操作。所以高併發的請求ZooKeeper是不適合的,它只能作為輕量級的後設資料儲存,不能負責高併發讀寫作為資料儲存。
根據上述內容,就引出了SparkStreaming整合Kafka-1.0。
SparkStreaming整合Kafka-1.0
直接利用kafka儲存offset偏移量,可以避免利用ZooKeeper儲存offset偏移量帶來的風險,這裡也有一個注意的地方,kafka有一個自動提交偏移量的功能,但會導致資料丟失。
因為設定自動提交就會按照一定的頻率,比如每隔2秒自動提交一次偏移量。但我截獲一個資料後,還沒來得及處理,剛好到達2秒就把偏移量提交了,於是就導致資料丟失,所以我們一般手動提交偏移量!
如何設計監控告警方案?
在日常開發工作中,我們需要對實時任務設計一個監控方案,因為實時任務沒有監控,程式就在裸奔,任務是否有延遲等情況無法獲取,這是非常可怕的情況!
這個只是利用KafkaOffsetmonitor設計的一個方案,利用它對任務進行監控,接著利用爬蟲技術獲取監控的資訊,再把資料匯入到openfalcon裡面,在openfalcon里根據策略配置告警或者自己研發告警系統,最後把資訊利用企業微信或者簡訊傳送給開發人員!
總結
好啦!本篇主要講解了SparkStreaming和Kafka的整合過程,老劉花了很多心思講了很多細節,對大資料感興趣的夥伴記得給老劉點贊關注。最後,如果有疑問聯絡公眾號:努力的老劉,進行愉快的交流!