前言

老劉是一名即將找工作的研二學生,寫博客一方面是復習總結大數(shù)據開發(fā)的知識點,一方面是希望幫助更多自學的小伙伴。由于老劉是自學大數(shù)據開發(fā),肯定會存在一些不足,還希望大家能夠批評指正,讓我們一起進步!
今天講述的是SparkStreaming與Kafka的整合,這篇文章非常適合剛入門的小伙伴,也歡迎大家前來發(fā)表意見,老劉這次會用圖片的形式講述別人技術博客沒有的一些細節(jié),這些細節(jié)對剛入門的小伙伴是非常有用的!??!
正文
為什么有SparkStreaming與Kafka的整合?
首先我們要知道為什么會有SparkStreaming與Kafka的整合,任何事情的出現(xiàn)都不是無緣無故的!
我們要知道Spark作為實時計算框架,它僅僅涉及到計算,并沒有涉及到數(shù)據的存儲,所以我們后期需要使用spark對接外部的數(shù)據源。SparkStreaming作為Spark的一個子模塊,它有4個類型的數(shù)據源:
1.socket數(shù)據源(測試的時候使用)
2.HDFS數(shù)據源(會用到,但是用得不多)
3.自定義數(shù)據源(不重要,沒怎么見過別人會自定義數(shù)據源)
4.擴展的數(shù)據源(比如kafka數(shù)據源,它非常重要,面試中也會問到)
下面老劉圖解SparkStreaming與Kafka的整合,但只講原理,代碼就不貼了,網上太多了,老劉寫一些自己理解的東西!
SparkStreaming整合Kafka-0.8
SparkStreaming與Kafka的整合要看Kafka的版本,首先要講的是SparkStreaming整合Kafka-0.8。
在SparkStreaming整合kafka-0.8中,要想保證數(shù)據不丟失,最簡單的就是靠checkpoint的機制,但是checkpoint機制有一個毛病,對代碼進行升級后,checkpoint機制就失效了。所以如果想實現(xiàn)數(shù)據不丟失,那么就需要自己管理offset。
大家對代碼升級會不會感到陌生,老劉對它好好解釋一下!
我們在日常開發(fā)中常常會遇到兩個情況,代碼一開始有問題,改一下,然后重新打包,重新提交;業(yè)務邏輯發(fā)生改變,我們也需要重新修改代碼!
而我們checkpoint第一次持久化的時候會整個相關的jar給序列化成一個二進制文件,這是一個獨一無二的值做目錄,如果SparkStreaming想通過checkpoint恢復數(shù)據,但如果代碼發(fā)生改變,哪怕一點點,就找不到之前打包的目錄,就會導致數(shù)據丟失!
所以我們需要自己管理偏移量!

用ZooKeeper集群管理偏移量,程序啟動后,就會讀取上一次的偏移量,讀取到數(shù)據后,SparkStreaming就會根據偏移量從kafka中讀取數(shù)據,讀到數(shù)據后,程序會運行。運行完后,就會提交偏移量到ZooKeeper集群,但有一個小問題,程序運行掛了,但偏移量未提交,結果已經部分到HBase,再次重新讀取的時候,會有數(shù)據重復,但只影響一批次,對大數(shù)據來說,影響太小!
但是有個非常嚴重的問題,當有特別多消費者消費數(shù)據的時候,需要讀取偏移量,但ZooKeeper作為分布式協(xié)調框架,它不適合大量的讀寫操作,尤其是寫操作。所以高并發(fā)的請求ZooKeeper是不適合的,它只能作為輕量級的元數(shù)據存儲,不能負責高并發(fā)讀寫作為數(shù)據存儲。
根據上述內容,就引出了SparkStreaming整合Kafka-1.0。
SparkStreaming整合Kafka-1.0

直接利用kafka保存offset偏移量,可以避免利用ZooKeeper存儲offset偏移量帶來的風險,這里也有一個注意的地方,kafka有一個自動提交偏移量的功能,但會導致數(shù)據丟失。
因為設置自動提交就會按照一定的頻率,比如每隔2秒自動提交一次偏移量。但我截獲一個數(shù)據后,還沒來得及處理,剛好到達2秒就把偏移量提交了,于是就導致數(shù)據丟失,所以我們一般手動提交偏移量!
如何設計告警方案?
在日常開發(fā)工作中,我們需要對實時任務設計一個監(jiān)控方案,因為實時任務沒有監(jiān)控,程序就在裸奔,任務是否有延遲等情況無法獲取,這是非??膳碌那闆r!

這個只是利用KafkaOffsetmonitor設計的一個方案,利用它對任務進行監(jiān)控,接著利用爬蟲技術獲取監(jiān)控的信息,再把數(shù)據導入到openfalcon里面,在openfalcon里根據策略配置告警或者自己研發(fā)告警系統(tǒng),最后把信息利用企業(yè)微信或者短信發(fā)送給開發(fā)人員!
總結
好啦!本篇主要講解了SparkStreaming和Kafka的整合過程,老劉花了很多心思講了很多細節(jié),對大數(shù)據感興趣的伙伴記得給老劉點贊關注。最后,如果有疑問聯(lián)系公眾號:努力的老劉,進行愉快的交流!