本發(fā)明提出了一種基于Spark Streaming的溫度異常報(bào)警方法,主要針對(duì)物聯(lián)網(wǎng)傳來的海量溫度數(shù)據(jù)進(jìn)行處理,提高處理效率。本方法領(lǐng)域?qū)儆诨谠朴?jì)算平臺(tái)下的大數(shù)據(jù)處理領(lǐng)域。
背景技術(shù):
隨著數(shù)據(jù)源產(chǎn)生的數(shù)據(jù)越來越多,處理數(shù)據(jù)的實(shí)時(shí)性需求越來越大,如實(shí)時(shí)分析和實(shí)時(shí)處理傳感器生產(chǎn)的數(shù)據(jù)或者網(wǎng)絡(luò)系統(tǒng)產(chǎn)生的日志數(shù)據(jù)。再比如,早期的在網(wǎng)上產(chǎn)生的股市震蕩數(shù)據(jù)或者地震預(yù)測(cè)消息是有價(jià)值,時(shí)間長消息的價(jià)值就降低了。通常,數(shù)據(jù)分析是存在依賴關(guān)系的,這些依賴關(guān)系指明原始數(shù)據(jù)是來自同一組數(shù)據(jù)流。常用的數(shù)據(jù)流并行處理系統(tǒng)有Comet,Spark Streaming,SEEP,Storm和Naiad,這些處理系統(tǒng)都可以用于接收和處理實(shí)時(shí)傳來的數(shù)據(jù)流。
Hadoop兩大核心組件分別為HDFS(Hadoop Distributed Filesystem)和MapReduce。
Hadoop把數(shù)據(jù)存放在集群節(jié)點(diǎn)上,是根據(jù)數(shù)據(jù)節(jié)點(diǎn)空間利用率而不是節(jié)點(diǎn)的CPU處理能力來進(jìn)行存取數(shù)據(jù)。
一個(gè)大的hadoop集群可以跨越多個(gè)機(jī)架甚至數(shù)據(jù)中心。與傳統(tǒng)的并行處理數(shù)據(jù)流一樣,Hadoop的MapReduce組件是非內(nèi)存和離線分析的數(shù)據(jù)處理引擎,無法滿足大規(guī)模數(shù)據(jù)實(shí)時(shí)分析和統(tǒng)計(jì)的要求。
Apache Storm是一個(gè)免費(fèi)開源的實(shí)時(shí)分布式計(jì)算系統(tǒng),但是Storm只適用于處理小規(guī)模、低速的數(shù)據(jù)流。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種能夠?qū)崟r(shí)處理來自物聯(lián)網(wǎng)的溫度信息的方法,該方法主要利用Spark Streaming的高并發(fā)特性,從kafka服務(wù)器隊(duì)列中并行讀取數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行整合,篩選出異常溫度信息,從而完成對(duì)異常溫度數(shù)據(jù)報(bào)警的功能。
為了實(shí)現(xiàn)上述技術(shù)目的:本發(fā)明采用如下的具體技術(shù)方案:
一種基于Spark平臺(tái)的Spark Streaming異常溫度數(shù)據(jù)報(bào)警方法,利用kafka作為消息隊(duì)列服務(wù)器,不斷地接受物聯(lián)網(wǎng)傳感器傳遞來的數(shù)據(jù)流,SparkStreaming把接收的數(shù)據(jù)流分成數(shù)據(jù)塊存放在Spark Streaming的數(shù)據(jù)塊隊(duì)列中,并且在一定的批處理時(shí)間間隔對(duì)數(shù)據(jù)塊隊(duì)列中的數(shù)據(jù)進(jìn)行批處理,Spark通過任務(wù)調(diào)度器對(duì)批處理的數(shù)據(jù)塊進(jìn)行計(jì)算,篩選出異常溫度數(shù)據(jù),并把計(jì)算結(jié)果存入數(shù)據(jù)庫中;
其處理數(shù)據(jù)具體流程如下:
步驟1:初始化——?jiǎng)?chuàng)建一個(gè)StreamingContext對(duì)象,該對(duì)象中的參數(shù)包括:SparkContext和批處理時(shí)間兩個(gè),對(duì)批處理時(shí)間這個(gè)參數(shù)進(jìn)行設(shè)置,具體包括:
1)StreamingContext中的批處理時(shí)間設(shè)置為8s;
2)如果提交的數(shù)據(jù)流未被快速處理,數(shù)據(jù)滯留,減少批處理時(shí)間;
3)如果提交的數(shù)據(jù)流很快被處理,當(dāng)前又沒有數(shù)據(jù)流進(jìn)入,處理時(shí)間過快,增加批處理時(shí)間;
4)重復(fù)步驟2)和步驟3)操作,直到數(shù)據(jù)流進(jìn)入Spark中,Spark剛好處理結(jié)束上一個(gè)作業(yè),從而找出合理的批處理時(shí)間;
步驟2:加載溫度數(shù)據(jù);
創(chuàng)建createStream,Receiver被調(diào)起執(zhí)行;
連接ZooKeeper,讀取相應(yīng)的Consumer、Topic配置信息,通過consumerConnector連接到kafka集群,收取kafka隊(duì)列中相應(yīng)topic的數(shù)據(jù);
創(chuàng)建KafkaMessageHandler線程池來對(duì)溫度數(shù)據(jù)進(jìn)行處理,通過ReceiverInputDStream中的方法,將數(shù)據(jù)轉(zhuǎn)換成BlockRDD,供后續(xù)計(jì)算;
步驟3:異常溫度數(shù)據(jù)檢測(cè):
Spark Streaming把從kafka隊(duì)列中的topic數(shù)據(jù)的每行字符串解析出的溫度數(shù)據(jù),轉(zhuǎn)換為Double型,分而治之,將同一個(gè)topic中的溫度放入一個(gè)組中,設(shè)定一個(gè)溫度閾值,統(tǒng)計(jì)每組出現(xiàn)的大于和小于溫度閾值的異常溫度數(shù)據(jù)的次數(shù),如果出現(xiàn)異常數(shù)據(jù),就向外發(fā)出異常警報(bào);
步驟4:數(shù)據(jù)存儲(chǔ):
使用創(chuàng)建的SparkContext對(duì)象中的saveAstextFile()函數(shù)將獲取的異常溫度數(shù)據(jù)和次數(shù)存入到Orancle數(shù)據(jù)庫中,以方便web端的查詢和訪問。
所述溫度閾值設(shè)置為25~40攝氏度。
本發(fā)明的有益效果是:
本發(fā)明提出了一種基于Spark平臺(tái)的Spark Streaming異常溫度數(shù)據(jù)報(bào)警方法,能夠?qū)崟r(shí)地處理來自物聯(lián)網(wǎng)的大批數(shù)據(jù),具有高強(qiáng)度的容錯(cuò)性和可擴(kuò)展性,能夠準(zhǔn)確的實(shí)時(shí)地進(jìn)行溫度異常報(bào)警。下面進(jìn)行具體說明。
高容錯(cuò)性:在Strom中,每個(gè)單獨(dú)的記錄當(dāng)它通過系統(tǒng)時(shí)必須被跟蹤,所以Storm能夠至少保證每個(gè)記錄將被處理一次,但是在從錯(cuò)誤中恢復(fù)過來時(shí)候允許出現(xiàn)重復(fù)記錄。這意味著可變狀態(tài)可能不正確地被更新兩次。然而在Spark Streaming只需要在批級(jí)別進(jìn)行跟蹤處理,因此可以有效地保證每個(gè)mini-batch將完全被處理一次,即便一個(gè)節(jié)點(diǎn)發(fā)生故障。
因?yàn)镾park Streaming中RDD的容錯(cuò)機(jī)制是每個(gè)RDD都是一個(gè)不可變的分布式可重復(fù)的數(shù)據(jù)集,它記錄著確定性的操作繼承關(guān)系,只要源數(shù)據(jù)丟失或者失真,或者任意一個(gè)RDD分區(qū)出錯(cuò)或不可用,都是可以利用原始輸入數(shù)據(jù)通過轉(zhuǎn)換操作而重新算出的。
實(shí)時(shí)性:Spark Streaming將流式計(jì)算分解成多個(gè)Spark Job,對(duì)于每一段數(shù)據(jù)的處理都會(huì)經(jīng)過Spark DAG圖分解,以及Spark的任務(wù)集的調(diào)度過程。對(duì)于目前版本的Spark Streaming而言,其最小的Batch Size的選取在0.5~2秒鐘之間,所以能夠高實(shí)時(shí)的對(duì)溫度數(shù)據(jù)進(jìn)行處理。
高擴(kuò)展性和高吞吐量:Spark目前在EC2上已能夠線性擴(kuò)展到100個(gè)節(jié)點(diǎn)(每個(gè)節(jié)點(diǎn)4Core),可以以數(shù)秒的延遲處理6GB/s的數(shù)據(jù)量(60M records/s),其吞吐量比一般的流速度高2~5倍。
附圖說明
圖1是集群系統(tǒng)架構(gòu)圖;
圖2是Spark Streaming中RDD的lineage關(guān)系圖;
圖3是系統(tǒng)的工作流程圖;
圖4是kafka生產(chǎn)者/消費(fèi)者模型;
圖5是數(shù)據(jù)處理流程圖。
具體實(shí)施方式
本發(fā)明采用Spark Streaming是因?yàn)樵摂?shù)據(jù)處理引擎具有高可靠、數(shù)據(jù)分析延遲低、處理數(shù)據(jù)能力強(qiáng)等優(yōu)點(diǎn),避免了數(shù)據(jù)堆積。
Apache Spark Streaming,Apache Storm和Yahoo S4是三大典型的支持在線實(shí)時(shí)流式計(jì)算的平臺(tái)模型。
數(shù)據(jù)處理引擎Spark Streaming,它把數(shù)據(jù)流分成數(shù)據(jù)塊存放在數(shù)據(jù)塊隊(duì)列中,然后在一定的批處理間隔對(duì)數(shù)據(jù)隊(duì)列中的數(shù)據(jù)塊進(jìn)行統(tǒng)一處理,并可以通過調(diào)整批處理間隔從而達(dá)到對(duì)高速數(shù)據(jù)流和低速數(shù)據(jù)流的實(shí)時(shí)處理,因此在這里選取Spark平臺(tái)作為分布式計(jì)算框架。
kafka是一個(gè)分布式的、高吞吐量、易于擴(kuò)展的基于主題發(fā)布/訂閱的消息系統(tǒng),最早是由Linkedin開發(fā),并于2011年開源并貢獻(xiàn)給Apache軟件基金會(huì)。作為消息隊(duì)列, kafka由于擁有高吞吐量,并且內(nèi)置消息主題分區(qū)、備份、容錯(cuò)等特性,更適合使用在大規(guī)模,高強(qiáng)度的消息數(shù)據(jù)處理的系統(tǒng)中。
數(shù)據(jù)處理引擎Spark Streaming提供了一個(gè)叫做DStream(Discretized Stream)的高級(jí)抽象,DStream表示一個(gè)持續(xù)不斷輸入的數(shù)據(jù)流,可以基于Kafka、TCP Socket、Flume等輸入數(shù)據(jù)流創(chuàng)建。在內(nèi)部,一個(gè)DStream實(shí)際上是由一個(gè)RDD序列組成的。數(shù)據(jù)處理引擎Sparking Streaming是基于Spark平臺(tái)的,也就繼承了Spark平臺(tái)的各種特性,如容錯(cuò)(Fault-tolerant)、可擴(kuò)展(Scalable)、高吞吐(High-throughput)等。
本發(fā)明提出了一種基于Spark Streaming的溫度報(bào)警方法,其特色主要體現(xiàn)在對(duì)海量數(shù)據(jù)處理和實(shí)時(shí)分析兩個(gè)方面。本方法基于如下三點(diǎn):
(1)傳感器收集物聯(lián)網(wǎng)傳來的溫度數(shù)據(jù),并上傳到服務(wù)器,在這里數(shù)據(jù)全部進(jìn)入kafka隊(duì)列。
(2)Spark Streaming會(huì)實(shí)時(shí)消費(fèi)kafka隊(duì)列的數(shù)據(jù),將數(shù)據(jù)讀出來并進(jìn)行實(shí)時(shí)的分析,并對(duì)異常數(shù)據(jù)發(fā)出報(bào)警信號(hào)。
(3)經(jīng)過Spark Streaming實(shí)時(shí)計(jì)算程序分析,將結(jié)果寫入Oracle數(shù)據(jù)庫,可以實(shí)時(shí)獲取溫度數(shù)據(jù),并可以導(dǎo)出來進(jìn)行離線綜合統(tǒng)計(jì)分析。
本發(fā)明處理圖如圖1所示,利用kafka作為消息隊(duì)列服務(wù)器,不斷地接受物聯(lián)網(wǎng)傳感器傳遞來的數(shù)據(jù)流,SparkStreaming把接收的數(shù)據(jù)流分成數(shù)據(jù)塊存放在Spark Streaming的數(shù)據(jù)塊隊(duì)列中,并且在一定的批處理間隔對(duì)數(shù)據(jù)塊隊(duì)列中的數(shù)據(jù)進(jìn)行批處理,Spark通過任務(wù)調(diào)度器對(duì)批處理數(shù)據(jù)塊進(jìn)行計(jì)算,篩選出異常溫度數(shù)據(jù),并把計(jì)算結(jié)果存入數(shù)據(jù)庫中,
一.體系結(jié)構(gòu)
分布流式(數(shù)據(jù)處理框架)分為Storm和Spark Streaming,Apache Storm是一個(gè)免費(fèi)開源的實(shí)時(shí)分布式計(jì)算系統(tǒng)。但是Storm只適用于處理小規(guī)模低速的數(shù)據(jù)流。與Strom不一樣的Spark Streaming,它把數(shù)據(jù)流分成數(shù)據(jù)塊存放在數(shù)據(jù)塊隊(duì)列中,然后在一定的批處理間隔對(duì)數(shù)據(jù)隊(duì)列中的數(shù)據(jù)塊進(jìn)行統(tǒng)一處理。可以通過調(diào)整批處理間隔從而達(dá)到對(duì)高速數(shù)據(jù)流和低速數(shù)據(jù)流的實(shí)時(shí)處理。
本發(fā)明提出的方法選擇Spark Streaming進(jìn)行溫度異常檢測(cè),Spark Streaming將物聯(lián)網(wǎng)傳來的溫度數(shù)據(jù)流按批處理間隔切分為一段段批處理作業(yè)來處理。
Spark針對(duì)持續(xù)性數(shù)據(jù)流的抽象稱為DStream,一個(gè)DStream是一個(gè)微批處理的RDD(彈性分布式數(shù)據(jù)集Resilient Distributed Datasets),其彈性分布式數(shù)據(jù)集的傳承關(guān)系如圖2所示,圖中的長方形表示一個(gè)彈性分布式數(shù)據(jù)集,長方形中的圓形表示一個(gè)彈性分布式數(shù)據(jù)集中的一個(gè)塊(Partition),圖中的每一列的多個(gè)彈性分布式數(shù)據(jù)集表示一個(gè)DStream(圖中有三個(gè)DStream),而每行最后一個(gè)彈性分布式數(shù)據(jù)集則表示每一個(gè)Batch Size所產(chǎn)生的中間結(jié)果彈性分布式數(shù)據(jù)集。
圖中的每一個(gè)彈性分布式數(shù)據(jù)集都是通過lineage相連接的,由于Spark Streaming輸入數(shù)據(jù)來自kafka隊(duì)列能夠保證容錯(cuò)性,所以彈性分布式數(shù)據(jù)集中任意的塊出錯(cuò),都可以并行地在其他機(jī)器上將缺失的塊計(jì)算出來。
該方法具體實(shí)現(xiàn)步驟如下:
1)啟動(dòng)Hadoop集群,Zookeeper集群,Spark集群和kafka集群(接受來自物聯(lián)網(wǎng)傳來的數(shù)據(jù)),初始化調(diào)度器。
2)將輸入流的接收器轉(zhuǎn)化為RDD(Resilient Distributed Datasets)在集群打散,然后啟動(dòng)接收器集合中的每個(gè)接收器,初始化SocketInputDStream,觸發(fā)StreamingContext中的Start()方法,啟動(dòng)調(diào)度器,啟動(dòng)集群分布式接收器。
3)Receiver的receive()函數(shù)從kafka接受的流數(shù)據(jù)源源不斷地放入BlockGenerator的currentBuffer(緩沖區(qū)),將緩沖區(qū)中的溫度數(shù)據(jù)流以一定的時(shí)間間隔轉(zhuǎn)化為數(shù)據(jù)塊放入BlockGenerator的blockForPush隊(duì)列中。
4)將blockForPush中的數(shù)據(jù)塊轉(zhuǎn)化為Spark中的數(shù)據(jù)塊,通過BlockGenerator中的BlockPushingThread線程,不斷地將blocksForPush隊(duì)列中的塊傳給BlockManger(負(fù)責(zé)Spark中的塊管理),讓BlockManger將數(shù)據(jù)存儲(chǔ)為塊。
5)pushArrayBuffer()方法將已經(jīng)由BlockManger存儲(chǔ)的元數(shù)據(jù)信息(如BlockId)傳遞給ReceiverTracker,并將存儲(chǔ)的BlockId放到對(duì)應(yīng)的StreamId的隊(duì)列中。
6)Spark Streaming根據(jù)時(shí)間段,將數(shù)據(jù)切分為RDD,然后觸發(fā)RDD的Action提交Job到JobManager中的Job Queue中,調(diào)度器JobScheduler將Job提交到Spark的Job調(diào)度器,然后將Job轉(zhuǎn)換為大量的任務(wù)分發(fā)給Spark集群執(zhí)行(每個(gè)數(shù)據(jù)段都在執(zhí)行溫度異常檢測(cè)Job),從而找出所有數(shù)據(jù)段的異常溫度數(shù)據(jù),并進(jìn)行匯總報(bào)警。
本發(fā)明提出了一種基于Spark平臺(tái)的Spark Streaming異常溫度數(shù)據(jù)報(bào)警方法,能夠?qū)崟r(shí)地處理來自物聯(lián)網(wǎng)的大批數(shù)據(jù),具有高強(qiáng)度的容錯(cuò)性和可擴(kuò)展性,能夠準(zhǔn)確的實(shí)時(shí)地進(jìn)行溫度異常報(bào)警。下面進(jìn)行具體說明。
高容錯(cuò)性:在Strom中,每個(gè)單獨(dú)的記錄當(dāng)它通過系統(tǒng)時(shí)必須被跟蹤,所以Storm能夠至少保證每個(gè)記錄將被處理一次,但是在從錯(cuò)誤中恢復(fù)過來時(shí)候允許出現(xiàn)重復(fù)記錄。這意味著可變狀態(tài)可能不正確地被更新兩次。然而在Spark Streaming只需要在批級(jí)別進(jìn)行跟蹤處理,因此可以有效地保證每個(gè)mini-batch將完全被處理一次,即便一個(gè)節(jié)點(diǎn)發(fā)生故障。
因?yàn)镾park Streaming中RDD的容錯(cuò)機(jī)制是每個(gè)RDD都是一個(gè)不可變的分布式可重復(fù)的數(shù)據(jù)集,它記錄著確定性的操作繼承關(guān)系,操作繼承關(guān)系如圖2所示,所以只要源數(shù)據(jù)丟失或者失真,或者任意一個(gè)RDD分區(qū)出錯(cuò)或不可用,都是可以利用原始輸入數(shù)據(jù)通過轉(zhuǎn)換操作而重新算出的。
實(shí)時(shí)性:Spark Streaming將流式計(jì)算分解成多個(gè)Spark Job,對(duì)于每一段數(shù)據(jù)的處理都會(huì)經(jīng)過Spark DAG圖分解,以及Spark的任務(wù)集的調(diào)度過程。對(duì)于目前版本的Spark Streaming而言,其最小的Batch Size的選取在0.5~2秒鐘之間,所以能夠高實(shí)時(shí)的對(duì)溫度數(shù)據(jù)進(jìn)行處理。
高擴(kuò)展性和高吞吐量:Spark目前在EC2上已能夠線性擴(kuò)展到100個(gè)節(jié)點(diǎn)(每個(gè)節(jié)點(diǎn)4Core),可以以數(shù)秒的延遲處理6GB/s的數(shù)據(jù)量(60M records/s),其吞吐量比一般的流速度高2~5倍。