熊艷,陳宇,蔣文濤,王冠石,舒敬恒
(1.四川大學制造與工程學院,創新方法與創新設計實驗室,成都610065;2.四川大學工程力學系,生物力學工程實驗室,成都610065)
心血管疾病、傳染病和癌癥是當前人類死亡的三大主要原因,其中心血管疾病是人類死亡首要原因[1]。心臟疾病的快速檢測因此顯得尤為重要。目前心臟遠程檢測系統在國內外已經應用于臨床,對心臟病患者進行長時間心電監護是治療心臟病的重要手段,同時也是預防突發性心臟病導致嚴重后果的重要途徑[2]。隨著移動互聯網、物聯網等技術,大數據時代(Big Data)已經來臨,大數據有四個特點:規模性、多樣性、高速型和靈活性。大數據是繼云計算和物聯網之后IT行業的又一次顛覆性技術變革[3]。
Hadoop是大數據平臺的代名詞,具有分布性、高可靠、通用性、高效率、成本低等特點,是Apache下的一個項目,也是Google云計算模型的開源實現。Hadoop的文件系統[4]、MapReduce框架[5]和Bigtable[6]都是根據這些核心技術來實現,其中兩個非常重要部分就是HDFS(hadoop distributed file system,HDFS)和MapReduce并行計算框架。經過多年發展,已經形成了以Hadoop為核心的大數據生態系統,也是通用的大數據處理基礎構架平臺。Hadoop增加了數據管理和信息提取的困難性和復雜性,因此,對大數據的存儲管理非常重要。
考慮到安裝配置的方便,使用Linux作為Hadoop的開發測試環境,在Windows下安裝VMWare虛擬機,在虛擬機上安裝 Ubuntu/Linux環境,然后再依次安裝 Hadoop,NoSQL數據庫HBase,數據倉庫HIVE和分布式系統的協調服務Zookeeper,完成整個系統的搭建。
心電圖數據格式采用Philips公司的Trim II型心電圖機,記錄的心電信息數據和心電圖機測量的波形參數,存放為大小200~250 K的XML格式數據文件[7]。心電數據中,其中一部分數據格式和設備中導聯數量密切相關,另外包含數據量在200 K左右的一個波形文件[8]。
Hadoop采用HBase數據庫。HBase適用于存儲松散型非結構化數據,面向列的Key-value數據庫,表索引由行關鍵字、列關鍵字和時間戳組成,HBase只有字符串類型,以HDFS為底層框架[9],是Bigtable在Hadoop框架上的實現。
HBase二維表結構中,Column Family(CF)包含多個Column Key(CK),CK可以動態增加,CK是列標示,RowKey是行標示。在傳統數據庫一對多的處理上,可以以相同患者在一個時間點作為RowKey,達到一對多的效果。比如患者ID為ID00010的患者,在2015年10月10日上午10點正的采集數據的RowKey就是“ID00010-1444442400”,前面是患者ID,后面是timestamp,主表信息和12導聯的信息都采用相同的RowKey,實現一對多的主從關系表。
假設醫院有50名患者需要進行心電監控,遠程心電監控儀每分鐘發送一次數據,需要保存一個月的數據,同時需要及時呈現每天的實時數據。因此,針對每位患者每天1440次采集,需要記錄的數據量每月就是4.32萬次。50位患者的記錄數就是216萬次。如果采用12導聯的心電儀,以剛剛分析的數據庫設計來看,每一導聯需要一次記錄,這樣記錄數是兩千多萬個記錄。同樣,記錄一年的數據量將達到3億條。

圖1 JSON格式的心電數據[10]Fig 1 The format of JSON for ECG data[9]
如果同時記錄的患者人數再增加的話,那么每年將產生幾十億條記錄的心電數據,這樣海量的數據,將成為醫院極大的負擔。如何實時監控患者的信息,當患者心電數據出現問題如何報警?如何對海量數據進行預測?都將面臨極大的問題,這些問題,同時也是大數據普遍存在的問題。
本次測試在下面環境完成:
硬件環境:DELL XPS 8700-R38N6型主機,內存 16G,主頻3.6GHz。
系統環境:Windows8.1系統。
軟件環境:VMWare Workstation 8.0,Hadoop 2.5.0,HBase1.1.2,HIVE1.2.1,ZooKeeper3.4.6
3.4.1 數據存儲時間 向HBase數據庫寫入50位患者在一個月中以每分鐘采集一次的間隔,進行實時心電數據的收集。

圖2 Hadoop心電數據入庫時間Fig 2 Hadoop ECG data storage time
從測試結果來看,每10萬條記錄寫入的時間是1 000 s,完成也就是每秒可以寫入100位患者的心電數據,完成50位患者一個月的數據記錄的數據庫寫入時間是375 min。也就是說,平臺可支持的最大容量是每分鐘對六千位患者的心電數據進行實時記錄,即每分鐘采集一次的采樣頻率,可以達到支持6 000位患者的并發能力,完全滿足實際要求。
3.4.2 數據查詢時間 采用scan Rowkey的方式,從數據庫取得1 min,1 h,1 d的數據量,調查數據查詢的時間。

從上面測試結果可以看出,取得一位患者一天的心電數據需要4 s時間,數據庫的總記錄數是3千萬條,按此效率進行讀取可以滿足實際需求,能夠實時提取數據,對數據進行實時分析。
HIVE是基于Hadoop的數據倉庫平臺,HIVE定義了類似SQL的查詢語言,能夠將SQL轉化為相應的Mapreduce程序執行。下面是HIVE執行結果:

可以看出,對于一條記錄的查詢時間,HIVE都經歷了Map和Reduce階段,時間大約是2 min,比Hbase shell的執行時間慢了兩個數量級,并不適合實時查詢。因此,HIVE適合做離線分析,類似SQL的語法更便于分析。
3.4.3 數據存儲空間 HBase是Apache下Hadoop的子項目,是一個分布式、面向列的開源數據庫,Rowkey是HBase的主鍵,每次寫入Column的時候,都會帶上Rowkey和Timestamp,因此,HBase的存儲空間利用不及 MySQL等結構化數據庫,也不及MongoDB等文檔數據庫。
HDFS是Hadoop分布式文件系統,HDFS可以使用廉價的硬件搭建系統,并能提供可容錯的高性能服務和高吞吐量的數據訪問,非常適合在大規模數據集群上應用。HDFS為了保證高可靠性和高可用性,采用了冗余存儲的方式,一份數據至少保存3個以上的備份,所以存儲空間上,Hadoop和傳統數據庫相比,有很大的劣勢,但是保證了數據存儲的可靠,即使有數據節點壞掉,也不會造成數據的丟失。
從大數據的角度來看,Hadoop無疑是目前應用最為廣泛的大數據庫平臺,對海量數據存儲、數據挖掘和并發響應等,在處理心電大數據方面有自身的優勢。只有解決大數據存儲才能使實時采集心電監控數據成為可能。通過本文的研究,針對心電大數據的存儲,以Hadoop分布式集群技術,在存儲時間和訪問效率上都能很好滿足心電數據的存儲要求。