Hadoop+Spark 大數(shù)據(jù)開發(fā)項(xiàng)目最佳實(shí)踐
一、前言
隨著IT技術(shù)的飛速發(fā)展,各行各業(yè)都已在廣泛嘗試使用大數(shù)據(jù)技術(shù)提供更穩(wěn)健和優(yōu)質(zhì)的服務(wù)。目前,醫(yī)療IT系統(tǒng)收集了大量***價值的數(shù)據(jù),但這些歷史醫(yī)療數(shù)據(jù)并沒有發(fā)揮出其應(yīng)有的價值。為此 ,本文擬利用醫(yī)院現(xiàn)有的歷史數(shù)據(jù),挖掘出有價值的基于統(tǒng)計學(xué)的醫(yī)學(xué)規(guī)則、知識,并 基于這些信息構(gòu)建專業(yè)的臨床知識庫,提供診斷、處方、用藥推薦功能,基于強(qiáng)大的關(guān)聯(lián)推薦能力,極大地提高醫(yī)療服務(wù)質(zhì)量,減輕醫(yī)療人員的工作強(qiáng)度。
二、Hadoop&Spark
目前大數(shù)據(jù)處理領(lǐng)域的框架有很多。
從計算的角度上看,主要有MapReduce框架(屬于Hadoop生態(tài)系統(tǒng))和Spark框架。 其中Spark是近兩年出現(xiàn)的新一代計算框架,基于內(nèi)存的特性使它在計算效率上大大優(yōu)于MapReduce框架; 從存儲角度來看,當(dāng)前主要還是在用Hadoop生態(tài)環(huán)境中的HDFS框架。 HDFS的一系列特性使得它非常適合大數(shù)據(jù)環(huán)境下的存儲。
1、Hadoop
Hadoop不是一個軟件,而是一個分布式系統(tǒng)基礎(chǔ)架構(gòu),是由Apache基金會主持開發(fā)的一個開源項(xiàng)目。Hadoop可以使用戶在不了解分布式底層實(shí)現(xiàn)的情況下,開發(fā)分布式程序,從而充分利用電腦集群的威力,實(shí)現(xiàn)高速運(yùn)算和大規(guī)模數(shù)據(jù)存儲。Hadoop主要有HDFS、MapReduce、Hbase等子項(xiàng)目組成。
Hadoop是一個能夠?qū)Υ罅繑?shù)據(jù)進(jìn)行分布式處理的軟件框架,并且使用可靠、高效、可伸縮的方式進(jìn)行數(shù)據(jù)處理。Hadoop假設(shè)數(shù)據(jù)處理和存儲會失敗,因此系統(tǒng)維護(hù)多個工作數(shù)據(jù)副本,確保能夠針對失敗的節(jié)點(diǎn)重新分布處理。Hadoop通過并行工作,提高數(shù)據(jù)處理速度。Hadoop能夠處理PB級數(shù)據(jù),這是常規(guī)數(shù)據(jù)服務(wù)器所不能實(shí)現(xiàn)的。此外,Hadoop依賴于開源社區(qū),任何問題都可以及時得到解決,這也是Hadoop的一大優(yōu)勢。Hadoop建立在Linux 集群上,因此成本低,并且任何人都可以使用。它主要具有以下優(yōu)點(diǎn):
高可靠性。Hadoop系統(tǒng)中數(shù)據(jù)默認(rèn)有三個備份,并且Hadoop有系統(tǒng)的數(shù)據(jù)檢查維護(hù)機(jī)制,因而提供了高可靠性的數(shù)據(jù)存儲。
擴(kuò)展性強(qiáng)。Hadoop在普通PC服務(wù)器集群上分配數(shù)據(jù),通過并行運(yùn)算完成計算任務(wù),可以很方便的為集群擴(kuò)展更多的節(jié)點(diǎn)。
高效性。Hadoop能夠在集群的不同節(jié)點(diǎn)之間動態(tài)的轉(zhuǎn)移數(shù)據(jù)。并且保證各個節(jié)點(diǎn)的動態(tài)平衡,因此處理速度非??臁?/p>
高容錯性。Hadoop能夠保存數(shù)據(jù)的多個副本,這樣就能夠保證失敗時,數(shù)據(jù)能夠重新分配。
Hadoop總體架構(gòu)如下圖所示, Hadoop架構(gòu)中核心的是MapReduce和HDFS兩大組件。
Google曾發(fā)表論文《Google File System》,系統(tǒng)闡述了Google的分布式文件系統(tǒng)的設(shè)計實(shí)現(xiàn),Apache針對GFS,進(jìn)行開源開發(fā),發(fā)布了Hadoop的分布式文件系統(tǒng):Hadoop Distributed File System,縮寫為HDFS。MapReduce的核心思想也由Google的一篇論文《MapReduce:Simplified Data Processing on Large Clusters》 提出,簡單解釋MapReduce的核心思想就是:任務(wù)分解執(zhí)行,執(zhí)行結(jié)果匯總。
2、Spark
Spark是UC Berkeley大學(xué)AMP實(shí)驗(yàn)室開源的類似MapReduce的計算框架,它是一個基于內(nèi)存的集群計算系統(tǒng),最初的目標(biāo)是解決MapReduce磁盤讀寫的開銷問題,當(dāng)前***的版本是1.5.0。Spark—經(jīng)推出,就以它的高性能和易用性吸引著很多大數(shù)據(jù)研究人員,在眾多愛好者的努力下,Spark逐漸形成了自己的生態(tài)系統(tǒng)( Spark為基礎(chǔ),上層包括Spark SQL,MLib,Spark Streaming和GraphX),并成為Apache的***項(xiàng)目。
Spark的核心概念是彈性分布式存儲 (Resilient Distributed Datasets, RDD)間,它是Spark對分布式內(nèi)存進(jìn)行的抽象,使用者可以像操作本地數(shù)據(jù)集一樣操作RDD,從而可以將精力集中于業(yè)務(wù)處理。在Spark程序中,數(shù)據(jù)的操作都是基于RDD的,例如經(jīng)典的WordCount程序,其在Spark編程模型下的操作方式如下圖所示:
可以看到Spark先從文件系統(tǒng)抽象出RDD1,然后由RDD1經(jīng)過flatMap算子轉(zhuǎn)換得到RDD2,RDD2再經(jīng)過reduceByKey算子得到RDD3,***RDD3中的數(shù)據(jù)重新寫回文件系統(tǒng),一切操作都是基于RDD的。
三、思路和架構(gòu)
經(jīng)過多方面的思考,最終決定基于Spark技術(shù)進(jìn)行構(gòu)建和實(shí)現(xiàn)醫(yī)院臨床知識庫系統(tǒng),采用MongoDB/Sequoiadb構(gòu)建大數(shù)據(jù)倉庫,做為大數(shù)據(jù)的存儲中心,采用Hadoop+Spark1構(gòu)建大數(shù)據(jù)分析平臺,基于AgileEAS.NET SOA中間件構(gòu)建ETL數(shù)據(jù)抽取轉(zhuǎn)換工具(后期部分換用了Pentaho Kettle),基于AgileEAS.NET SOA中間件構(gòu)建知識庫的服務(wù)門戶,通過WCF/WebService與HIS系統(tǒng)進(jìn)行業(yè)務(wù)整合集成,使用AgileEAS.NET SOA+FineUI構(gòu)建基礎(chǔ)字典管理以后分析結(jié)構(gòu)的圖像化展示功能。
最初我們選擇了SequoiaDB做為大數(shù)據(jù)存儲中心,為此我還特意的為SequoiaDB完成了C#驅(qū)動,參考本人為巨杉數(shù)據(jù)庫(開源NoSQL)寫的C#驅(qū)動,支持Linq,全部開源,已提交Github一文,但是一方面熟悉SequoiaDB的技術(shù)人員太少了,維護(hù)是個問題,***,在差不多8多個月這后我們換用了MongoDB 3.0做為大數(shù)據(jù)存儲中心。
最初我們選擇了Hadoop2.0+Spark1.3.1版本之上使用scala2.10開發(fā)完成了醫(yī)院臨床知識庫系統(tǒng),請參考centos+scala2.11.4+Hadoop2.3+Spark1.3.1環(huán)境搭建,但是在后期替換Sequoiadb為MongoDB的同時,我們把計算框架也由Hadoop2.0+Spark1.3.1升級到了Hadoop2.6+Spark1.6.2。
考慮到Spark都部署在Linux的情況,對于Spark分析的結(jié)果輸出存儲在MySQL5.6數(shù)據(jù)庫之中,系統(tǒng)所使用的各種字典信息也存儲在MySQL之中。
Spark數(shù)據(jù)分析部分的代碼使用IntelliJ IDEA 14.1.4工具進(jìn)行編寫,其他部分的代碼使用VS2010進(jìn)行編寫。
1、總體架構(gòu)
整個系統(tǒng)由數(shù)據(jù)采集層、存儲分析層和應(yīng)用邏輯層三大部分以及本系統(tǒng)所選所以來的外部數(shù)據(jù)源。
本系統(tǒng)的外部數(shù)據(jù)源目前主要是醫(yī)院信息系統(tǒng)所產(chǎn)生的臨床數(shù)據(jù),目前主要集中在HIS系統(tǒng)之中,后期將采依賴于EMR、LIS、PACS系統(tǒng)。
數(shù)據(jù)采集層 主要負(fù)責(zé)從臨床業(yè)務(wù)系統(tǒng)采集海量歷史臨床數(shù)據(jù)同,歷史記錄采集方式分為批采集和實(shí)時采集,在數(shù)據(jù)采集過程之中對原始數(shù)據(jù)進(jìn)行格工檢查,并對原始數(shù)據(jù)進(jìn)行清洗和轉(zhuǎn)換,并將處理后的數(shù)據(jù)存儲在大數(shù)據(jù)倉庫之中。
存儲分析層 主要負(fù)責(zé)數(shù)據(jù)存儲以及數(shù)據(jù)分析兩大部分業(yè)務(wù),經(jīng)過清洗轉(zhuǎn)換的合理有效數(shù)據(jù)被存儲在大數(shù)據(jù)集群之中,使用JSON格式,大數(shù)據(jù)存儲引用使用SequoiaDB數(shù)據(jù)庫,數(shù)據(jù)分析部分由Hadoop/Spark集群來完成,大數(shù)據(jù)存儲經(jīng)由Spark導(dǎo)入并進(jìn)行分析,分析結(jié)果寫入臨床知識數(shù)據(jù)庫,臨床知識數(shù)據(jù)庫使用MySQL數(shù)據(jù)庫進(jìn)行存儲。
應(yīng)用邏輯層 主要負(fù)責(zé)人機(jī)交互以及分析結(jié)構(gòu)回饋臨床系統(tǒng)的渠道,通過WebUI的方式向臨床醫(yī)生、業(yè)務(wù)管理人員提供列表式、圖像化的知識展示,也為臨床系統(tǒng)的業(yè)務(wù)輔助、推薦功能提供調(diào)用的集成API,目前API主要通過WebService、WebAPI兩種方式提供。
2、總體流程
整個系統(tǒng)經(jīng)由數(shù)據(jù)源數(shù)據(jù)采集,寫入大數(shù)據(jù)存儲SequoiaDB集群,然后由Spark進(jìn)行分析計算,分析生成的臨床知識寫入MySQL知識庫,經(jīng)由WebUI以及標(biāo)準(zhǔn)的API交由臨床使用。
3、數(shù)據(jù)導(dǎo)入流程
歷史數(shù)據(jù)的采集導(dǎo)入使用初期使用AgileEAS.NET SOA 的計劃任務(wù)配何C#腳本進(jìn)行實(shí)現(xiàn),由計劃任務(wù)進(jìn)行協(xié)調(diào)定時執(zhí)行,具體的數(shù)據(jù)導(dǎo)入代碼根據(jù)不同的臨床業(yè)務(wù)系統(tǒng)不同進(jìn)行腳本代碼的調(diào)整,也可以使用Pentaho Kettle進(jìn)行實(shí)現(xiàn),通過Pentaho Kettle可配置的實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入。
4、物理結(jié)構(gòu)設(shè)計
臨床數(shù)據(jù)源為本系統(tǒng)進(jìn)行分析的數(shù)據(jù)來源,源自于臨床HIS、EMR,目前醫(yī)院的HIS使用SQL Server 2008 R2數(shù)據(jù)庫,EMR使用ORACLE 11G數(shù)據(jù)庫,運(yùn)行于Windows2008操作系統(tǒng)之上。
SequoiaDB集群為大數(shù)據(jù)存儲數(shù)制庫集群,目前使用SequoiaDB v2.0,運(yùn)行于Centos6.5操作系統(tǒng)之上,根據(jù)業(yè)務(wù)來規(guī)模使用2-16節(jié)點(diǎn)集群,其用于存儲經(jīng)過清洗轉(zhuǎn)換處理的海量歷史臨床數(shù)據(jù),供Spark集群進(jìn)行分析,以及供應(yīng)SOA服務(wù)器進(jìn)行歷史數(shù)據(jù)查詢和歷史相關(guān)推薦使用。
Hadoop/Spark集群為本系統(tǒng)的分析計算核心節(jié)點(diǎn),用于對SequoiaDB集群之中的歷史數(shù)據(jù)進(jìn)行分析,生成輔助臨床醫(yī)生使用的醫(yī)學(xué)知識,本集群根據(jù)業(yè)務(wù)來規(guī)模使用2-16節(jié)點(diǎn)集群,使用Centos6.5操作系統(tǒng),安裝JAVA1.7.79運(yùn)行環(huán)境、scala2.11.4語言,使用Hadoop2.3,Spark1.3.1分析框架。
MySQL知識庫為本系統(tǒng)的知識庫存儲數(shù)據(jù)庫,Hadoop/Spark集群所生產(chǎn)的分析結(jié)構(gòu)寫入本數(shù)據(jù)庫,經(jīng)由SOA服務(wù)器和Web服務(wù)處理供臨床系統(tǒng)集成使用和WebGUI展現(xiàn),目前使用MySQL5.6版本,安裝于Windows2008/Centos6操作系統(tǒng)之上。
SOA Server為本系統(tǒng)的對外接口應(yīng)用服務(wù)器,向臨床業(yè)務(wù)系統(tǒng)和Web Server提供業(yè)務(wù)運(yùn)算邏輯,以及向臨床業(yè)務(wù)系統(tǒng)提供服務(wù)API,目前運(yùn)行于Windows2008操作系統(tǒng),部署有.NET Framework 4.0環(huán)境,運(yùn)行AgileEAS.NET SOA 中間件的SOA服務(wù),由AgileEAS.NET SOA 中間件SOA服務(wù)向外部系統(tǒng)提供標(biāo)準(zhǔn)的WebService以及WebAPI。
Web Server為系統(tǒng)提供基于標(biāo)準(zhǔn)的B/S瀏覽器用戶接口,供業(yè)務(wù)人員通過B/S網(wǎng)頁對系統(tǒng)進(jìn)行管理,查詢使用知識庫之中的醫(yī)學(xué)知識,目前運(yùn)行于Windows2008操作系統(tǒng),部署有.NET Framework 4.0環(huán)境,運(yùn)行于IIS7.0之中。
臨床工作站系統(tǒng)運(yùn)行HIS、EMR系統(tǒng),兩系統(tǒng)均使用C#語言SOA架構(gòu)思路進(jìn)行開發(fā),與本系統(tǒng)集成改造后,使用標(biāo)準(zhǔn)WebService接口本系統(tǒng),使用本系統(tǒng)所提供的API為臨床提供診療輔助。
四、環(huán)境、安裝、坑
目前系統(tǒng)跑在虛擬化環(huán)境之中,其中三臺Centos6組成大數(shù)據(jù)存儲、計算集群,每臺分配16CPU(核)16G內(nèi)存2T硬盤,3臺共48核48G,這三臺機(jī)器每臺都安裝了Java1.8.25+scala2.10+Hadoop2.6,Spark1.62,MongoDB3.0組合3節(jié)點(diǎn)的集群,Spark采用Standalone Cluster模式,單一master節(jié)點(diǎn),為每臺機(jī)器分配其中12核12G用于Worker,其余CPU內(nèi)存留給MongoDB集群使用,運(yùn)行截圖如下:
一臺Win2008做為SOA|應(yīng)用服務(wù)器,分配32核64G內(nèi)存,部署了MySQL5.6,IIS,AgileEAS.NET SOA 服務(wù),整個系統(tǒng)的SOA服務(wù)和Web管理界面由本服務(wù)器進(jìn)行承載,一方面提供Web方式的管理和查詢,另一方面以webservice、webAPI為臨床系統(tǒng)提供服務(wù)。
具體環(huán)境的安裝過程由于篇幅的原因在此就不在一一細(xì)說,我將會單獨(dú)寫一篇文章為大家進(jìn)行詳細(xì)的介紹。
***次使用Spark,又沒有多少資料可參考,所以在開發(fā)過程之中遇到不少的坑,特別是初期的時間,搭建環(huán)境就費(fèi)了一周,寫代碼過程之中坑也是一直發(fā)現(xiàn)一直填坑,有點(diǎn)坑也填不了,直好換思路繞了,記得在Spark sql的udf自定義函數(shù)上,并不是所有函數(shù)都有坑,偶爾自己寫的udf函數(shù)怎么都是過不去,找不到原因,看Spark的源代碼也沒看出個所以然,***不得改寫代碼,換思路搞。
感覺特別有愛的就是scala語言了, 我覺得使用.net 4.0(C#)的朋友們,特別是用熟Linq的兄弟們,scala語言太方便了,我感覺他基本上就是和linq一樣方便,更沒有節(jié)操的是,在函數(shù)之中可以定義類,不過,真的是很方便,我不是很喜歡Java,但是我喜歡scala。
五、效果展示
1、門診診斷排名
門診診斷排名是門診診斷知識的圖形化界面展示顯示,用于展示全院或者指定??频腡opN位常用診斷,也為每一個診斷與性別、年齡等人群相關(guān)性以及與節(jié)氣相關(guān)性圖表展示。
2、門診伴生診斷查詢
門診伴生診斷排名是門診診斷并發(fā)癥的知識展示界面,用于展示得某一種疾病另其他疾病的可能性。
3、門診自動組方查詢
門診自動組方查詢,用于展示臨床最常用的用藥、治療自動組方知識,即比如最常用的0.9%氯化鈉注射液100ml配注射用頭孢硫咪1g,常適用于扁桃體發(fā)炎、喘息性之氣管炎、上呼吸道感染等疾病,給以靜脈點(diǎn)滴方式每日一次使用。
4、門診診斷組方推斷
門診診斷組方推斷,用于展示臨床疾病診斷與常用藥品、治療給合方案的相關(guān)性關(guān)聯(lián),即如上圖展示上呼吸道感染常使用氨酚麻美干混懸劑1包、四季抗病毒合劑、0.9%氯化鈉注射液100ml+注射用頭孢硫咪1g、滅菌注射用水2ml+注射用重組人干擾素a1b 10ug等這樣的組合治療方案。
5、醫(yī)療臨床系統(tǒng)整合
為了實(shí)現(xiàn)來源于臨床系統(tǒng),并且服務(wù)于臨床系統(tǒng)的總體系統(tǒng),我們聯(lián)動了本院的HIS系統(tǒng)之中的門診醫(yī)生站,與本系統(tǒng)進(jìn)行基于WebService的整合,如下圖所示的整合界面:
臨床醫(yī)生在完成基本的門診病歷之后,系統(tǒng)會自動為其體檢待選的門診疾病診斷,80%-90%的情況可以直接選擇,在少數(shù)情況下沒有推薦合適的時候大夫才會錄入,省去大夫錄入診斷的麻煩,也減少因大夫錄入的不規(guī)范而導(dǎo)致的數(shù)據(jù)的混亂。
在臨床醫(yī)生寫完門診病歷,進(jìn)行開立檢驗(yàn)、檢查、用藥、治療的時間,系統(tǒng)會根據(jù)當(dāng)有的診斷信息推薦合適的治療方案選擇,臨床醫(yī)生只需求在右邊的推薦組方上雙擊即可實(shí)現(xiàn)快速的處方開方,大大的方便的臨床醫(yī)生的工作。
針對中醫(yī)院,系統(tǒng)集成了3W多個經(jīng)典成方,根據(jù)歷史數(shù)據(jù)與成方字典的組合分析對比,極大的方便中醫(yī)大夫日常工作:
六、實(shí)現(xiàn)細(xì)節(jié)、后續(xù)文章
對于大數(shù)據(jù)技術(shù),以及大數(shù)據(jù)技術(shù)在醫(yī)療化信息行業(yè)的實(shí)踐,以及實(shí)現(xiàn)之中的思路和細(xì)節(jié),不是短短這么一點(diǎn)篇幅就能介紹完成的,此文也是在我實(shí)現(xiàn)需求,實(shí)踐之后所寫,所以總覺得東西都比較簡單,我只期望本文能達(dá)到拋轉(zhuǎn)引用的作用,能對同行做相關(guān)工作的朋友們有所參考,思路可以得到借鑒,然本文也實(shí)在沒有講清楚所有的細(xì)節(jié)。