石文昭
(山西職業(yè)技術(shù)學(xué)院 山西 太原 030006)
隨著自動(dòng)化設(shè)備在工業(yè)制造領(lǐng)域的規(guī)?;瘧?yīng)用,關(guān)于設(shè)備的安全管理問(wèn)題也越來(lái)越多,一旦設(shè)備出現(xiàn)故障未被及時(shí)發(fā)現(xiàn),就可能造成難以挽回的損失,因此構(gòu)建一個(gè)實(shí)時(shí)高效的設(shè)備監(jiān)測(cè)系統(tǒng),及時(shí)排查潛在的設(shè)備故障是十分必要的,同時(shí)考慮到工業(yè)級(jí)別自動(dòng)化設(shè)備監(jiān)測(cè)所存在的數(shù)據(jù)類型復(fù)雜、處理量級(jí)大、時(shí)延要求高等問(wèn)題,系統(tǒng)的數(shù)據(jù)處理部分引入了Hadoop 框架,采用分布式數(shù)據(jù)存儲(chǔ)模式有效提高了系統(tǒng)的數(shù)據(jù)吞吐性能和運(yùn)行可靠性。
Hadoop 平臺(tái)是一個(gè)集合了分布式文件存儲(chǔ)、數(shù)據(jù)并行處理等核心技術(shù)的高性能數(shù)據(jù)管理平臺(tái)[1],具有高效、可靠、易擴(kuò)展等技術(shù)優(yōu)勢(shì)。
分布式文件存儲(chǔ)系統(tǒng)(hadoop distributed file system,HDFS)是Hadoop 平臺(tái)的核心技術(shù)之一[2],通過(guò)構(gòu)建分布式服務(wù)器集群實(shí)現(xiàn)高效的文件存儲(chǔ)和管理,在保障數(shù)據(jù)處理性能的基礎(chǔ)上有效降低了硬件存儲(chǔ)設(shè)備的構(gòu)建成本。
HDFS 系統(tǒng)將服務(wù)器節(jié)點(diǎn)劃分為一個(gè)主節(jié)點(diǎn)Namenode 和若干從節(jié)點(diǎn)Datanode、SecondaryNamenode[3]。當(dāng)用戶訪問(wèn)HDFS 系統(tǒng)時(shí),會(huì)先向主節(jié)點(diǎn)Namenode 提交文件請(qǐng)求,主節(jié)點(diǎn)通過(guò)文件檢索定位到數(shù)據(jù)存儲(chǔ)地從節(jié)點(diǎn),再由從節(jié)點(diǎn)Datanode 響應(yīng)文件讀寫操作,如果同一文件備份在多個(gè)集群當(dāng)中,則選擇距離客戶端最近的集群進(jìn)行響應(yīng)。 如圖1 所示。
圖1 HDFS 系統(tǒng)邏輯架構(gòu)
Datanode 也稱為數(shù)據(jù)節(jié)點(diǎn),與服務(wù)器集群的物理存儲(chǔ)設(shè)備相映射,主要用于數(shù)據(jù)存儲(chǔ),可由大量成本低廉的服務(wù)器組建。 HDFS 系統(tǒng)存儲(chǔ)數(shù)據(jù)是以文件為單位,將批量數(shù)據(jù)分割為文件塊序列后分布存儲(chǔ)在不同的Datanode 當(dāng)中,Datanode 需要具備的基礎(chǔ)功能包括數(shù)據(jù)塊的存儲(chǔ)映射、客戶端文件讀寫指令的響應(yīng)、周期性向Namenode 上報(bào)信息等,向Namenode 上報(bào)的信息主要有Datanode 的心跳信息、本地文件塊信息、文件緩存信息等。
Namenode 稱為名字節(jié)點(diǎn),用于管理和協(xié)調(diào)全局的Datanode,將分布存儲(chǔ)在不同Datanode 的文件塊序列通過(guò)名字空間進(jìn)行地址的映射關(guān)聯(lián),最終以文件的形式面向用戶提供信息檢索和數(shù)據(jù)調(diào)度服務(wù)。 除此之外,Namenode還需要具備如下功能:
(1)元數(shù)據(jù)的存儲(chǔ)和維護(hù),元數(shù)據(jù)是對(duì)文件屬性的描述數(shù)據(jù),用于輔助Namenode 對(duì)存儲(chǔ)文件的屬性管理。
(2)心跳信息的監(jiān)聽(tīng)與預(yù)警,監(jiān)聽(tīng)Datanode 的心跳信息,以判斷其所管理的Datanode 是否在線和狀態(tài)是否正常,并進(jìn)行日志記錄。
(3)副本參數(shù)配置,為了加強(qiáng)HDFS 系統(tǒng)的容錯(cuò)性和健壯性,Namenode 可以通過(guò)副本參數(shù)配置,實(shí)現(xiàn)多個(gè)Datanode 上的文件副本備份,一旦某一Datanode 故障,即可從其他備份處獲取數(shù)據(jù)。
SecondaryNamenode,又稱為輔助名稱節(jié)點(diǎn),用于創(chuàng)建Namenode 元數(shù)據(jù)和日志檢查點(diǎn),并定時(shí)對(duì)其進(jìn)行合并,合并后再將Namenode 的歷史數(shù)據(jù)進(jìn)行清空和更新,一旦Namenode 發(fā)生故障, 可用 SecondaryNamenode 恢復(fù)Namenode 上的數(shù)據(jù)記錄。
分布式計(jì)算系統(tǒng)(MapReduce)是專用于Hadoop 平臺(tái)的分布式并行計(jì)算模型[4],通過(guò)軟件編程實(shí)現(xiàn)作業(yè)任務(wù)的分片和并行計(jì)算,再將結(jié)果保存至HDFS 系統(tǒng),實(shí)現(xiàn)軟件架構(gòu)與底層數(shù)據(jù)存儲(chǔ)的解耦,大大簡(jiǎn)化了軟件開發(fā)人員的編程難度。 MapReduce 同樣采用了主從式邏輯架構(gòu)[5],主節(jié)點(diǎn)JobTracker 負(fù)責(zé)作業(yè)分片和從節(jié)點(diǎn)的任務(wù)分配與調(diào)度;從節(jié)點(diǎn)TaskTracker 負(fù)責(zé)任務(wù)分片的具體運(yùn)算和指令執(zhí)行。 MapReduce 的執(zhí)行過(guò)程分為兩個(gè)階段:
(1)映射階段(Map),MapReduce 對(duì)作業(yè)進(jìn)行分片之后,JobTracker 以鍵值對(duì)的形式構(gòu)建映射列表,再由不同的TaskTracker 對(duì)列表中元素進(jìn)行相同操作的并行處理,并生成新的列表來(lái)記錄作業(yè)分片的運(yùn)算結(jié)果。
(2)歸約階段(Reduce),是將所有參與任務(wù)執(zhí)行的TaskTracker 上的列表進(jìn)行合并,也就是對(duì)各個(gè)從節(jié)點(diǎn)的結(jié)果進(jìn)行簡(jiǎn)化歸一,這一操作會(huì)由指定TaskTracker 來(lái)集中完成,相較于上一階段并行程度較低。
基于Hadoop 的自動(dòng)化設(shè)備監(jiān)管系統(tǒng)采用分層式架構(gòu)設(shè)計(jì),將系統(tǒng)劃分為應(yīng)用層、邏輯層、數(shù)據(jù)處理層和數(shù)據(jù)存儲(chǔ)層,如圖2 所示。
圖2 自動(dòng)化設(shè)備監(jiān)管系統(tǒng)架構(gòu)
應(yīng)用層是系統(tǒng)面向前端用戶提供綜合服務(wù)的交互平臺(tái),該層通過(guò)標(biāo)準(zhǔn)接口接入了設(shè)備管理系統(tǒng)、傳感器管理系統(tǒng)、其他數(shù)據(jù)管理系統(tǒng)3 類功能服務(wù)模塊。 設(shè)備管理系統(tǒng)主要用于提供設(shè)備監(jiān)測(cè)數(shù)據(jù)的讀寫服務(wù);傳感器管理系統(tǒng)是針對(duì)傳感器設(shè)備的監(jiān)測(cè)數(shù)據(jù)管理,由于自動(dòng)化設(shè)備的監(jiān)測(cè)數(shù)據(jù)采集主要是通過(guò)傳感器,因此設(shè)備監(jiān)管場(chǎng)景中需要部署大量的傳感器,這些傳感器一旦出現(xiàn)故障,也會(huì)對(duì)設(shè)備監(jiān)測(cè)造成嚴(yán)重影響;其他數(shù)據(jù)管理系統(tǒng)主要用于提供系統(tǒng)輔助數(shù)據(jù)的服務(wù)功能,例如系統(tǒng)日志、用戶信息等,這些數(shù)據(jù)信息只能由具有特定權(quán)限的用戶訪問(wèn),例如系統(tǒng)管理員。
邏輯層是針對(duì)應(yīng)用層部署服務(wù)的邏輯代碼實(shí)現(xiàn)層,邏輯層與應(yīng)用層之間采用JSON 格式進(jìn)行數(shù)據(jù)傳輸,具體的業(yè)務(wù)模型構(gòu)建對(duì)于應(yīng)用層是完全透明的。 當(dāng)應(yīng)用層接收到用戶請(qǐng)求后,下發(fā)至邏輯層,邏輯層對(duì)請(qǐng)求類型進(jìn)行識(shí)別,并分發(fā)至對(duì)應(yīng)的業(yè)務(wù)邏輯處理模塊,在各個(gè)業(yè)務(wù)邏輯模塊中再進(jìn)一步判斷事件類型,事件類型主要包括兩種:流程控制、數(shù)據(jù)處理。 如果事件類型為流程控制,僅局限于該層處理即可;如果事件類型為數(shù)據(jù)處理,再對(duì)數(shù)據(jù)處理類型做進(jìn)一步判斷,區(qū)分是否為實(shí)時(shí)數(shù)據(jù)處理事件,如果是實(shí)時(shí)數(shù)據(jù)處理事件,則需要與數(shù)據(jù)存儲(chǔ)層中的MySQL 數(shù)據(jù)庫(kù)進(jìn)行交互;如果是其他數(shù)據(jù)處理事件,則會(huì)通過(guò)數(shù)據(jù)處理層的Hadoop 平臺(tái)進(jìn)行數(shù)據(jù)處理。
數(shù)據(jù)處理層用于部署Hadoop 框架,以實(shí)現(xiàn)大規(guī)模、非實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)的分布式存儲(chǔ)和并行處理,具體實(shí)現(xiàn)過(guò)程如圖3 所示。
圖3 Hadoop 平臺(tái)的數(shù)據(jù)處理過(guò)程
Hadoop 平臺(tái)數(shù)據(jù)處理過(guò)程可以概括為3 個(gè)部分:
第一部分,將數(shù)據(jù)集上傳至HDFS 分布式文件系統(tǒng),主節(jié)點(diǎn)Namenode 對(duì)數(shù)據(jù)集進(jìn)行同等大小的文件塊分割,生成文件序列標(biāo)識(shí)并封裝至文件塊,同時(shí)創(chuàng)建相應(yīng)的元數(shù)據(jù)信息,建立目錄列表和初始化數(shù)據(jù)副本數(shù)量,將數(shù)據(jù)塊分發(fā)自從節(jié)點(diǎn)Datanode 進(jìn)行存儲(chǔ)和副本備份。 由于自動(dòng)化設(shè)備監(jiān)測(cè)的方式有很多,因此上傳的數(shù)據(jù)集多為非結(jié)構(gòu)化數(shù)據(jù),例如視頻、音頻、圖像等。
第二部分,創(chuàng)建MapReduce 任務(wù),從Namenode 處獲取元數(shù)據(jù)信息,以確定待處理文件塊的存儲(chǔ)位置,同時(shí)為計(jì)算程序生成所需的配置文件,文件格式為xml。
第三部分,通過(guò)Map、Reduce 操作實(shí)現(xiàn)批量數(shù)據(jù)的并行處理。 首先通過(guò)調(diào)用JobTracker 創(chuàng)建一個(gè)任務(wù)調(diào)度主線程,對(duì)作業(yè)任務(wù)進(jìn)行分片和分發(fā),這個(gè)過(guò)程即為Map;其次接收到指令的TaskTracker 啟動(dòng)計(jì)算程序進(jìn)行任務(wù)處理,同時(shí)周期性向JobTracker 匯報(bào)心跳,JobTracker 在此階段始終處于監(jiān)聽(tīng)狀態(tài),通過(guò)TaskTracker 的心跳反饋判斷TaskTracker 的工作狀態(tài)以及任務(wù)完成情況;最后由特定的TaskTracker 對(duì)任務(wù)計(jì)算結(jié)果進(jìn)行Reduce,將原始的映射列表與計(jì)算后的新列表進(jìn)行聚合化簡(jiǎn),并將最后的運(yùn)算結(jié)果以JSON 格式進(jìn)行輸出。
數(shù)據(jù)存儲(chǔ)層提供兩種數(shù)據(jù)庫(kù)接口,MySQL 是應(yīng)用最為廣泛的一種關(guān)系型數(shù)據(jù)庫(kù),具有執(zhí)行效率高、讀寫速度快等特點(diǎn),為了滿足系統(tǒng)實(shí)時(shí)性數(shù)據(jù)的訪問(wèn)需求,通常會(huì)將實(shí)時(shí)性數(shù)據(jù)先保存在MySQL 數(shù)據(jù)庫(kù),當(dāng)數(shù)據(jù)規(guī)模超過(guò)閾值設(shè)定之后,再遷移至Hadoop 平臺(tái)進(jìn)行存儲(chǔ);分布式存儲(chǔ)系統(tǒng)(hadoop database, HBase)是基于HDFS 實(shí)現(xiàn)的數(shù)據(jù)庫(kù)管理工具,根據(jù)列簇存儲(chǔ)數(shù)據(jù),可以有效提高數(shù)據(jù)的查詢效率,減少數(shù)據(jù)讀取量,用于實(shí)現(xiàn)非實(shí)時(shí)數(shù)據(jù)和MySQL 遷移數(shù)據(jù)的存儲(chǔ)和管理。
HDFS 文件數(shù)據(jù)的讀取功能實(shí)現(xiàn)需要4 個(gè)步驟:
步驟一:由客戶端實(shí)例化一個(gè)DistributedFileSystem 對(duì)象,調(diào)用Open 方法啟動(dòng)文件操作。 DistributedFileSystem是HDFS 封裝的類,封裝了文件讀取的方法以及通信的協(xié)議標(biāo)準(zhǔn)。
步驟二: 由 DistributedFileSystem 實(shí)例化對(duì)象向Namenode 請(qǐng)求文件塊讀取的地址,Namenode 會(huì)返回起始文件塊的多個(gè)備份Datanode,并按照節(jié)點(diǎn)與客戶端的通信距離進(jìn)行排序。
步驟三:DistributedFileSystem 返回一個(gè)輸入流對(duì)象DFSInputStream 至 客 戶 端, 客 戶 端 通 過(guò) 調(diào) 用DFSInputStream 對(duì)象的 Read 方法進(jìn)行文件讀取,DFSInputStream 將從距離客戶端最近的文件塊備份節(jié)點(diǎn)開始讀取數(shù)據(jù),同時(shí)獲取下一個(gè)文件塊的節(jié)點(diǎn)地址,重復(fù)調(diào)用Read 方法就可以完成所有文件塊節(jié)點(diǎn)的讀取。
步驟四:文件讀取完成后,調(diào)用DistributedFileSystem對(duì)象的Close 方法關(guān)閉連接。
該文件讀取模式,由客戶端實(shí)例化對(duì)象直接讀取數(shù)據(jù)節(jié)點(diǎn)上的數(shù)據(jù),可以有效減少Namenode 的工作負(fù)載,避免單點(diǎn)瓶頸問(wèn)題。
HDFS 文件數(shù)據(jù)的寫入功能實(shí)現(xiàn)步驟如下:
步驟一:由客戶端通過(guò)實(shí)例化DistributedFileSystem 對(duì)象,調(diào)用Create 方法創(chuàng)建一個(gè)文件,并將文件名請(qǐng)求加入Namenode 的文件目錄當(dāng)中。
步驟二:Namenode 對(duì)新文件驗(yàn)證通過(guò)后,會(huì)創(chuàng)建一個(gè)新的文件記錄,并向客戶端返回一個(gè)輸出流對(duì)象DFSOutputStream,DFSOutputStream 對(duì)象首先將寫入分割成文件塊加入傳輸隊(duì)列,再由Write 方法向Namenode 請(qǐng)求Datanode 分配,并按照Namenode 參數(shù)設(shè)置創(chuàng)建文件副本,以此向Datanode 寫入文件塊。
步驟三:被分配的Datanode 會(huì)按照存儲(chǔ)文件塊的序列形成管線,并封閉在同一管道當(dāng)中,當(dāng)所有Datanode 寫入成功后,都會(huì)通過(guò)管道返回確認(rèn)信息,DFSOutputStream則負(fù)責(zé)監(jiān)聽(tīng)這些信息。
步驟四: 完成文件寫入后, 仍由客戶端調(diào)用DistributedFileSystem 對(duì)象的Close 方法關(guān)閉連接。
綜上所述,為了滿足自動(dòng)化設(shè)備在工業(yè)應(yīng)用中的安全管理需求,本研究設(shè)計(jì)了一個(gè)自動(dòng)化設(shè)備監(jiān)管系統(tǒng),基于Hadoop 框架,通過(guò)HDFS、MapReduce 等核心技術(shù)實(shí)現(xiàn)了大規(guī)模設(shè)備監(jiān)測(cè)數(shù)據(jù)的分布式存儲(chǔ)和并行處理,大大提高了系統(tǒng)的數(shù)據(jù)吞吐量和處理效率。