技術(shù)
導(dǎo)讀:在本文中,我們將圍繞物聯(lián)網(wǎng)或流處理系統(tǒng)的一些技術(shù)問題建立完整的基礎(chǔ)和多方面的理解,以便讀者在規(guī)劃物聯(lián)網(wǎng)系統(tǒng)時(shí)能夠做出明智的決策或是有根據(jù)地提出問題。我們的意圖是為開始考慮流處理和物聯(lián)網(wǎng)的人們建立多方面的基礎(chǔ),不管你是否真的需要一個(gè)流處理器,我們都將深入到流處理(物聯(lián)網(wǎng)的核心)里面,然后討論 Lambda 架構(gòu),并給出一些對(duì)傳感器可以做什么的大致上的思考。
在本文中,我們將圍繞物聯(lián)網(wǎng)或流處理系統(tǒng)的一些技術(shù)問題建立完整的基礎(chǔ)和多方面的理解,以便讀者在規(guī)劃物聯(lián)網(wǎng)系統(tǒng)時(shí)能夠做出明智的決策或是有根據(jù)地提出問題。我們的意圖是為開始考慮流處理和物聯(lián)網(wǎng)的人們建立多方面的基礎(chǔ),不管你是否真的需要一個(gè)流處理器,我們都將深入到流處理(物聯(lián)網(wǎng)的核心)里面,然后討論 Lambda 架構(gòu),并給出一些對(duì)傳感器可以做什么的大致上的思考。
流處理的開源框架
事件流處理平臺(tái)就像把瑞士軍刀,你可以讓在數(shù)據(jù)流里運(yùn)動(dòng)的數(shù)據(jù)(data-in-motion)做幾乎任何你想做的事情。
了解 ESP 體系結(jié)構(gòu)的最簡(jiǎn)單的方法是將其視為三個(gè)層面或三個(gè)功能 —— 輸入,處理和輸出。
輸入層會(huì)接受幾乎所有類型的基于時(shí)間的流數(shù)據(jù),并經(jīng)常有存在多個(gè)輸入流的情況。在主 ESP 處理器中會(huì)發(fā)生各種會(huì)被稱為程序或操作的動(dòng)作。這些程序的結(jié)果會(huì)傳遞給訂閱者的一些接口,后者可以通過人機(jī)界面發(fā)送警報(bào)或創(chuàng)建機(jī)器來進(jìn)行自動(dòng)操作,并將數(shù)據(jù)傳遞給像 Fast 和 Forever 這樣的數(shù)據(jù)存儲(chǔ)服務(wù)里。
流處理平臺(tái)確實(shí)可以直接接收數(shù)據(jù)流,但要注意他們并不善于保存一些會(huì)意外丟失的數(shù)據(jù),因此你仍然會(huì)需要像 Kafka 這樣的一個(gè)能夠回退并重放丟失的數(shù)據(jù)的數(shù)據(jù)采集端。在不久的將來,很多流處理器可能會(huì)解決這個(gè)問題,然后你就需要重新考慮 Kafka 端的必要性了。
流處理的要求
對(duì)流處理器常會(huì)有這些要求:
高速 :視具體具體業(yè)務(wù)需求而定,通常每秒要能采集并處理數(shù)百萬個(gè)事件。
易擴(kuò)展 :全部東西都要在分布式集群上運(yùn)行。
容錯(cuò) :這與保證不丟失數(shù)據(jù)不同。
確定處理 :這有兩種做法:每個(gè)事件至少處理一次,和每個(gè)事件正好處理一次。不過 “正好處理一次” 的標(biāo)準(zhǔn)很難保證。這是我們將放在稍后討論的一個(gè)深入的主題。
能執(zhí)行你的應(yīng)用程序運(yùn)行的必需程序
ESP 程序能做什么?
在采集端進(jìn)行數(shù)據(jù)清理的能力(類似于一種迷你 MDM)是其功能強(qiáng)大的真正體現(xiàn)。在數(shù)據(jù)清理之后會(huì)多次復(fù)制數(shù)據(jù)流,以便每個(gè)相同的數(shù)據(jù)流可以同時(shí)用于不同的分析程序中,而不用讓這些程序程序排隊(duì)等待前面的分析程序完成分析。下面是一個(gè)醫(yī)療業(yè)務(wù)示例的圖表,該示例描述了一種在上一章提到過的工作方式,說明了多個(gè)數(shù)據(jù)流會(huì)由靜態(tài)數(shù)據(jù)來擴(kuò)大,并會(huì)由不同類型的邏輯同時(shí)處理。每個(gè)塊都表示了在 ESP 中需要由你來編寫的單獨(dú)程序。
有很多不同類型的邏輯可以通過這些 ESP 程序來得到應(yīng)用,包括:
計(jì)算
復(fù)制,建立多個(gè)處理路徑 —— 每個(gè)處理路徑具有不同的保留時(shí)間,例如 5 - 15 分鐘。
統(tǒng)計(jì)
計(jì)數(shù)
過濾,它讓你能只從數(shù)據(jù)流中保留有用的數(shù)據(jù),并放棄其余數(shù)據(jù),從而大大減少存儲(chǔ)空間。
函數(shù)(用于變換)
合并多個(gè)流為一個(gè)
通知性質(zhì)的電子郵件,文字或多媒體形式
模式(特定關(guān)注事件的 EOI,用于檢測(cè))
流程(用于應(yīng)用高級(jí)的預(yù)測(cè)模型)
文本內(nèi)容,用于檢測(cè)例如受關(guān)注的推特模式這樣的信息。
文本情感,用于監(jiān)控社交媒體流中的積極或消極的情緒。
開源的和專有的軟件包在能做的工作上都有著一些區(qū)別,因此你應(yīng)該根據(jù)你所需要完成的東西來核對(duì)這些軟件包的內(nèi)容。
流處理的開源選項(xiàng)
主要的開源框架選項(xiàng)(全是 Apache 的)如下:
Samza: 一個(gè)分布式的流處理框架。它使用 Kafka 來進(jìn)行消息傳遞,由 YARN 來提供容錯(cuò)性、處理器隔離、安全性,以及資源管理。
NiFi:這是一個(gè)相當(dāng)新興的開源項(xiàng)目,仍處于完善之中。它與其他項(xiàng)目的區(qū)別在于它有用戶友好的拖曳式的圖形界面,以及我們可以輕松地根據(jù)特定需求來對(duì)它進(jìn)行定制。
Storm:一款經(jīng)過充分測(cè)試的基于事件的流處理器。它最初由推特開發(fā)。
SPARK Streaming: SPARK Streaming 是 SPARK 的四個(gè)組成部分之一,它是第一個(gè)能在單一企業(yè)級(jí)平臺(tái)上整合批量處理和流處理的組件。
SPARK 流媒體和 Storm:最常見的開源軟件包
SPARK 已被推出好幾年了,但在去年它的使用率有了驚人的增長(zhǎng),現(xiàn)已在大多數(shù)新項(xiàng)目中取代了 Hadoop / MapReduce 的地位,并且許多既有的 Hadoop / MapReduce 系統(tǒng)也都遷移到了 SPARK。SPARK 的開發(fā)工作正在朝著成為物聯(lián)網(wǎng)應(yīng)用所需的唯一技術(shù)棧發(fā)展。
SPARK 由五個(gè)組件組成,所有這些組件都支持 Scala,Java,Python 還有 R 語(yǔ)言。
SPARK :作為一個(gè)在系統(tǒng)中處于核心地位的應(yīng)用程序,它是一個(gè)與 HDFS 和其他 NoSQL DB 兼容的批處理引擎。它能比 Hadoop / MapReduce 快 10 倍到 100 倍,因此它十分流行。
ML.lib :一個(gè)自帶的功能強(qiáng)大的數(shù)據(jù)科學(xué)以及機(jī)器學(xué)習(xí)算法庫(kù)。
SPARK SQL :用于直接支持 SQL 查詢。
SPARK Streaming :SPARK 集成的流處理引擎。
GraphX :強(qiáng)大的圖形數(shù)據(jù)庫(kù)引擎,可用于流式應(yīng)用程序之外。
相比之下,Storm 就是一個(gè)純粹的事件流處理器。Storm 和 SPARK Streaming 之間的差異不大,不過它們?yōu)閭魅霐?shù)據(jù)分區(qū)的方式便截然不同了。這是后面討論的一個(gè)進(jìn)一步的話題。
如果你已經(jīng)熟悉了關(guān)于數(shù)據(jù)分區(qū)的知識(shí)并且確定這不會(huì)對(duì)你的應(yīng)用造成損害,那么開源的 SPARK / SPARK Streaming 便是最好的選擇。
Lambda 架構(gòu):速度加上安全
IoT 流處理應(yīng)用的標(biāo)準(zhǔn)參考體系結(jié)構(gòu)被稱為 Lambda 體系結(jié)構(gòu) ,該體系結(jié)構(gòu)包含一個(gè) 加速層(Speed Layer) 和一個(gè) 安全層(Safety Layer) 。
傳入數(shù)據(jù)流會(huì)由數(shù)據(jù)采集應(yīng)用(Kafka)復(fù)制,并朝兩個(gè)方向發(fā)送,一個(gè)是安全層,另一個(gè)是流處理平臺(tái)(SPARK Streaming 或 Storm)。這可以確保丟失的數(shù)據(jù)都得以找回,以確保所有數(shù)據(jù)都至少得到了一次處理。
對(duì)流處理端的查詢可能是提取靜態(tài)數(shù)據(jù)來加到流處理器中的數(shù)據(jù)流,或者可能用于通過任意數(shù)量的媒體(包括電子郵件,SMS,客戶的應(yīng)用程序,還有儀表板)向下游的事件消費(fèi)者發(fā)送消息、警報(bào)或數(shù)據(jù)。警報(bào)也是在流處理器中的本地環(huán)境生成的。
對(duì)安全層的存儲(chǔ)的查詢將被批量用于創(chuàng)建進(jìn)一步的分析過程并嵌入到流處理器中,或者用于響應(yīng)特殊查詢,例如開發(fā)新的預(yù)測(cè)模型。
你真的需要一個(gè)流處理器嗎?
你應(yīng)該在設(shè)計(jì)物聯(lián)網(wǎng)平臺(tái)時(shí)考慮到引入流處理器的必要性。對(duì)某些只需要很少數(shù)量或很少種類的傳感器的情況,省掉流處理器自身會(huì)帶來的系統(tǒng)復(fù)雜度可能會(huì)更好。
如果 “實(shí)時(shí)“ 這段時(shí)間很長(zhǎng)
當(dāng)實(shí)時(shí)交互的時(shí)間相當(dāng)長(zhǎng)的時(shí)候,例如在通知終端用戶任何新的發(fā)現(xiàn)只能每天發(fā)生一次或甚至更少時(shí),對(duì)傳感器的數(shù)據(jù)進(jìn)行批量處理在一些情況下是完全合理的。
從架構(gòu)的立場(chǎng)來看,傳感器數(shù)據(jù)將到達(dá)數(shù)據(jù)采集應(yīng)用(Kafka)并直接發(fā)送到存儲(chǔ)器里面。若使用常規(guī)的批處理程序,今天的數(shù)據(jù)會(huì)在夜里被分析,并且需要發(fā)送給用戶的任何重要信號(hào)會(huì)放到第二天才發(fā)送。
當(dāng) “實(shí)時(shí)” 會(huì)是 24 小時(shí)或更長(zhǎng)的時(shí)間,在某些情況下至多縮短至 12 小時(shí)左右時(shí),批處理會(huì)是一個(gè)可行的選擇。如果實(shí)時(shí)交互的時(shí)間需求比這更短,流處理會(huì)是一個(gè)更具吸引力的選擇。
其實(shí)配置流處理來評(píng)估任何時(shí)間段(包括數(shù)天,數(shù)周甚至數(shù)月)的數(shù)據(jù)也是可以的,但在某些時(shí)候簡(jiǎn)化系統(tǒng)的價(jià)值會(huì)超過引入流處理的價(jià)值。
傳感器數(shù)據(jù)的四種應(yīng)用
傳感器數(shù)據(jù)有四種范圍很廣的應(yīng)用。這也可以為你決定是否引入流處理提供參考。以下舉一些例子。
直接使用:例如,直接從傳感器讀取 GPS 坐標(biāo),然后把坐標(biāo)放到地圖上,就能輕松創(chuàng)建出一個(gè) “手機(jī)去哪里” 的小應(yīng)用。這一應(yīng)用可能還需要引入與用戶有關(guān)的靜態(tài)數(shù)據(jù)(比如,需要知道用戶的居住地址來限制顯示地圖的比例),而這可以通過標(biāo)準(zhǔn)表連接(standard table join)來在流處理器外部完成,也可以在流處理器里面完成。
專家規(guī)則:不用數(shù)據(jù)科學(xué),編寫能為傳入數(shù)據(jù)流賦予意義的規(guī)則也是可行的。例如,可以設(shè)計(jì)了一個(gè)專家規(guī)則來與患者的靜態(tài)數(shù)據(jù)相結(jié)合,讓這一規(guī)則在患者體溫達(dá)到 103° 的時(shí)候呼叫醫(yī)護(hù)幫助。
預(yù)測(cè)分析:接下來的兩個(gè)應(yīng)用程序都屬于數(shù)據(jù)科學(xué)領(lǐng)域。數(shù)據(jù)科學(xué)家會(huì)使用預(yù)測(cè)分析技術(shù)來在數(shù)據(jù)中找到有意義的信息。
無監(jiān)督學(xué)習(xí): 在預(yù)測(cè)分析中,無監(jiān)督學(xué)習(xí)意味著應(yīng)用像聚類(clustering)和細(xì)分(segementation)這樣的技術(shù),而這些技術(shù)不需要指示了特定的結(jié)果的歷史數(shù)據(jù)。例如,F(xiàn)itBit 里的加速度計(jì)可以很容易地了解到你現(xiàn)在的活動(dòng)比最近活躍還是不活躍,或者你比其他一些你拿來比較的 FitBit 用戶相對(duì)活躍還是不活躍。給閱讀這一過程賦予一些內(nèi)容就可能需要引入用戶的靜態(tài)數(shù)據(jù)。
無監(jiān)督學(xué)習(xí)的優(yōu)勢(shì)在于,它在放置傳感器之后幾乎就可以立即部署起來,畢竟它不需要花大量時(shí)間用訓(xùn)練數(shù)據(jù)來建立模型。
給定發(fā)送警報(bào)的閾值會(huì)需要一些無監(jiān)督建模方法的幫助。例如一個(gè)符合標(biāo)準(zhǔn)的消息的更改周期可以設(shè)為應(yīng)該超出每天 20% 或一個(gè)相似用戶組的標(biāo)準(zhǔn)差。
這些算法會(huì)由數(shù)據(jù)科學(xué)家根據(jù)批量處理數(shù)據(jù)進(jìn)行完善并導(dǎo)出到流處理器中,作為公式應(yīng)用于數(shù)據(jù)流。
監(jiān)督學(xué)習(xí):使用訓(xùn)練數(shù)據(jù)來開發(fā)預(yù)測(cè)模型,而在訓(xùn)練數(shù)據(jù)中結(jié)果是已知的。這又需要部分檢測(cè)到了行為和當(dāng)前狀態(tài)的樣例,還有一部分狀態(tài)未知的樣例。
例如,我們可以記錄電機(jī)的溫度,振動(dòng)和功耗,以及測(cè)量后 12 小時(shí)內(nèi)電機(jī)是否發(fā)生故障。如果有足夠多的訓(xùn)練數(shù)據(jù),我們就可以開發(fā)出一個(gè)預(yù)測(cè)模型,提前 12 小時(shí)預(yù)測(cè)可能發(fā)生的障礙。
然后將以代數(shù)公式(幾行 C,Java,Python 或 R 代碼)形式表示的模型導(dǎo)出到流處理器,以便在處理數(shù)據(jù)流時(shí)對(duì)數(shù)據(jù)進(jìn)行評(píng)分,當(dāng)分?jǐn)?shù)顯示即將發(fā)生故障時(shí)自動(dòng)發(fā)送警報(bào)。
在流處理中使用復(fù)雜的預(yù)測(cè)模型很有好處。不過如果想要預(yù)測(cè)的事件很罕見,比如這一事件占所有測(cè)量數(shù)據(jù)的比例很小,或者這一事件需要很長(zhǎng)時(shí)間才可能發(fā)生一次(收集足夠的訓(xùn)練數(shù)據(jù)要等上很長(zhǎng)時(shí)間),那么收集足夠的訓(xùn)練數(shù)據(jù)就會(huì)是個(gè)問題。