劉 丹,李志軍,高榮鑫
(吉林大學(xué)通信工程學(xué)院,長(zhǎng)春130012)
天文學(xué)、醫(yī)學(xué)等領(lǐng)域每天產(chǎn)生的數(shù)據(jù)已達(dá)到EB(Exabyte)字節(jié)以上[1-2],這些海量數(shù)據(jù)的收集、存儲(chǔ)和處理問(wèn)題亟待解決。分布式技術(shù)不僅能縮短數(shù)據(jù)處理時(shí)間,還能使多個(gè)用戶同時(shí)使用。Hadoop框架是應(yīng)用最廣泛的開(kāi)源分布式計(jì)算框架,其對(duì)計(jì)算機(jī)硬件要求不高,可靠性強(qiáng),容錯(cuò)率高,擴(kuò)展性好,理論上該系統(tǒng)可以布置在成百上千臺(tái)的低成本計(jì)算機(jī)上。目前,針對(duì)醫(yī)療大數(shù)據(jù)面臨的問(wèn)題和挑戰(zhàn),各種實(shí)用性強(qiáng)的醫(yī)療大數(shù)據(jù)平臺(tái)架構(gòu)方案被提出[3-6],但醫(yī)療大數(shù)據(jù)平臺(tái)網(wǎng)站的建設(shè)和相應(yīng)功能的實(shí)現(xiàn)還沒(méi)得到有效解決。
筆者開(kāi)發(fā)了采用搭建Hadoop計(jì)算機(jī)集群方式實(shí)現(xiàn)的Hadoop平臺(tái),其功能包括:針對(duì)大量已知的醫(yī)療數(shù)據(jù)的存儲(chǔ)、下載以及數(shù)據(jù)的共享,并為不同權(quán)限的用戶給予不同的功能選項(xiàng);用分析處理數(shù)據(jù)效率較高的Python腳本完成對(duì)數(shù)據(jù)的可視化展示。
平臺(tái)的設(shè)計(jì)從實(shí)用性與功能性的角度出發(fā),采用分布式文件系統(tǒng)解決大量醫(yī)療數(shù)據(jù)文件的存儲(chǔ)問(wèn)題,以搭建網(wǎng)站平臺(tái)的方式實(shí)現(xiàn)數(shù)據(jù)文件的共享、下載和可視化展示。
該平臺(tái)包含兩個(gè)核心部分:一部分是基于Hadoop搭建的分布式文件系統(tǒng),另一部分是基于Tomcat服務(wù)器搭建的網(wǎng)站平臺(tái),使用Hadoop Web API將二者連結(jié)起來(lái)(見(jiàn)圖1)。本平臺(tái)既擁有可靠存儲(chǔ)大量數(shù)據(jù)文件的優(yōu)勢(shì),又擁有網(wǎng)站平臺(tái)的輕量化以及功能多樣化的優(yōu)勢(shì)。其中分布式文件系統(tǒng)可運(yùn)行在普通的多臺(tái)計(jì)算機(jī)中,而用于運(yùn)行網(wǎng)站的服務(wù)器主機(jī)則需滿足有較高的網(wǎng)絡(luò)配置以及較大內(nèi)存、硬盤(pán)等性能要求。
圖1 醫(yī)療大數(shù)據(jù)平臺(tái)總體架構(gòu)示意圖Fig.1 General architecture of medical big data platform
分布式文件系統(tǒng)(HDFS:Hadoop Distributed File System)是Hadoop系統(tǒng)基本核心架構(gòu)之一,主要由主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)兩部分構(gòu)成[7-9]。主節(jié)點(diǎn)(NameNode)負(fù)責(zé)提供元數(shù)據(jù)服務(wù),針對(duì)整個(gè)文件系統(tǒng)的存儲(chǔ)空間、文件名稱和路徑、文件分塊信息、備份信息及其存儲(chǔ)位置進(jìn)行管理,并對(duì)外部用戶訪問(wèn)整個(gè)系統(tǒng)中的文件資源、文件操作進(jìn)行控制。系統(tǒng)中通常存在多個(gè)數(shù)據(jù)節(jié)點(diǎn)(DataNode),數(shù)據(jù)節(jié)點(diǎn)的功能除了對(duì)已經(jīng)分塊的數(shù)據(jù)進(jìn)行存儲(chǔ)外,數(shù)據(jù)節(jié)點(diǎn)還可以接收主節(jié)點(diǎn)的指令,包括對(duì)數(shù)據(jù)塊的創(chuàng)建、復(fù)制、刪除和讀取等命令。
此框架主要用于解決平臺(tái)的數(shù)據(jù)管理以及系統(tǒng)一致性問(wèn)題,同時(shí)也是Hadoop的重要組件。主要功能包括:數(shù)據(jù)的發(fā)布和訂閱,資源的ID分配,分布式系統(tǒng)調(diào)度,用分布式鎖以保證不同系統(tǒng)訪問(wèn)同一資源的一致性,分布式工作匯報(bào),心跳檢測(cè),分布式隊(duì)列。此框架的計(jì)算機(jī)集群是一個(gè)基于主從架構(gòu)的高可用集群,包含領(lǐng)導(dǎo)者(Leader)和學(xué)習(xí)者(Learner)兩部分,學(xué)習(xí)者又包含追隨者(Follower)和觀察者(Observer)。領(lǐng)導(dǎo)者負(fù)責(zé)檢測(cè)和維護(hù)心跳機(jī)制,追隨者可以直接處理讀請(qǐng)求,擁有投票權(quán),觀察者的功能與追隨者類似,但無(wú)投票權(quán)。此框架還有一個(gè)選舉機(jī)制,在整個(gè)服務(wù)器啟動(dòng)或領(lǐng)導(dǎo)者宕機(jī)時(shí),由各部分投票選舉出領(lǐng)導(dǎo)者。
Hadoop平臺(tái)基于Java語(yǔ)言開(kāi)發(fā),HDFS文件系統(tǒng)的操作基于Java編程實(shí)現(xiàn),筆者使用版本為2018.2.2的編程軟件IntelliJ IDEA。首先新建一個(gè)Maven工程,然后在src文件夾中的main文件夾中新建一個(gè)類,之后導(dǎo)入編寫(xiě)Hadoop API需要的依賴,其寫(xiě)法如下所示。需要導(dǎo)入的依賴名分別為:組名org.apache.hadoop,項(xiàng)目名hadoop-common、hadoop-client、hadoop-hdfs、hadoop-mapreduce-client-core,版本均為2.7.5;組名junit和項(xiàng)目名junit,版本為RELEASE。將依賴導(dǎo)入完成后,便可以進(jìn)行代碼的編寫(xiě)。
上傳功能的代碼中定義了一個(gè)有返回值的靜態(tài)函數(shù)以方便使用時(shí)調(diào)用,函數(shù)名為HdfsUploadFiles,調(diào)用此函數(shù)時(shí)需要傳入3個(gè)參數(shù):1)HdfsPort為HDFS文件系統(tǒng)的IP地址和端口號(hào)(“hdfs:∥192.168.1.1:8020”);2)LocalFilePath是將要上傳的文件在本地文件系統(tǒng)中的路徑:(D:/Lenovo/test.txt);3)HdfsFilePath為用戶想要上傳到HDFS文件系統(tǒng)的目錄(“/text”),“/”代表HDFS文件系統(tǒng)的根目錄,按此方法填寫(xiě)路徑,文件將上傳到HDFS文件系統(tǒng)的text文件夾下,假如文件系統(tǒng)中沒(méi)有此文件夾,系統(tǒng)將會(huì)自動(dòng)創(chuàng)建此文件夾。在程序執(zhí)行成功后將會(huì)返回true。
文件下載代碼的函數(shù)名為HdfsDownloadFile,調(diào)用此函數(shù)同樣需要3個(gè)參數(shù)。假如HDFS中不存在字符串中包含的文件,系統(tǒng)會(huì)輸出錯(cuò)誤信息,此外通過(guò)此函數(shù)下載文件時(shí),在文件下載目錄還會(huì)生成一個(gè)后綴為.crc的校驗(yàn)文件,執(zhí)行成功后返回true。
文件刪除代碼用于刪除HDFS文件系統(tǒng)上的文件,函數(shù)名為DeletHdfsFile,調(diào)用此函數(shù)需要傳入HDFS端口號(hào)和HDFS上的文件路徑,在刪除成功后函數(shù)返回true。
創(chuàng)建文件夾代碼用于在HDFS文件系統(tǒng)中創(chuàng)建文件夾,并且可遞歸創(chuàng)建,函數(shù)名為MkdirHdfs,調(diào)用此函數(shù)需要傳入HDFS端口號(hào)以及想要在HDFS上創(chuàng)建的文件夾的路徑,在創(chuàng)建成功后函數(shù)返回true。
用瀏覽文件代碼可以瀏覽HDFS目錄下所有文件及文件夾,同時(shí)將這些路徑用“!”連接成字符串,以便之后將字符串解析成文件路徑。
為方便對(duì)以上各函數(shù)的調(diào)用,使用軟件將本工程導(dǎo)出為jar包,稱之為HDFS API包。對(duì)于HDFS文件系統(tǒng)的操作均可通過(guò)調(diào)用該jar包中的方法實(shí)現(xiàn)。
本項(xiàng)目中所使用的服務(wù)器為湯姆貓服務(wù)器(Tomcat),該服務(wù)器具有以下特點(diǎn)[10-11]:占用各種資源都很小,部署及使用十分方便;支持Servlet和JSP(Java Server Pages);既能提供靜態(tài)資源的訪問(wèn)服務(wù),又能提供動(dòng)態(tài)技術(shù)的服務(wù);安全性較高,外部通過(guò)網(wǎng)絡(luò)無(wú)法直接訪問(wèn)到后臺(tái)代碼內(nèi)容;兼容性較好,許多制作Web項(xiàng)目的軟件都為該服務(wù)器提供接口,并且可在軟件內(nèi)直接運(yùn)行,十分方便高效。
為實(shí)現(xiàn)一個(gè)動(dòng)態(tài)的網(wǎng)站,常用的技術(shù)包括Servlet和JSP兩種。Servlet技術(shù)是在服務(wù)器上用Java編寫(xiě)并運(yùn)行的程序,編寫(xiě)程序時(shí)需要導(dǎo)入所需接口的JAR包??蛻舳说挠脩粽?qǐng)求信息通過(guò)服務(wù)器,發(fā)送給servlet程序,程序運(yùn)行后得到結(jié)果,經(jīng)服務(wù)器再發(fā)回給客戶端;JSP技術(shù)指的是以.jsp為結(jié)尾的一類文件,在該文件中既可使用超文本標(biāo)記語(yǔ)言(HTML:HyperText Markup Language),同時(shí)也能加入Java語(yǔ)言所編寫(xiě)的代碼,本質(zhì)上也是一種Servlet程序[12]。JSP文件必須運(yùn)行在服務(wù)器上才能被解析為網(wǎng)頁(yè)顯示出來(lái),不同于HTML文件,直接使用瀏覽器打開(kāi)是無(wú)法顯示JSP文件所想要顯示的內(nèi)容的。通過(guò)MVC(Model View Controller)模式[13]可使Servlet和JSP技術(shù)結(jié)合,Servlet實(shí)現(xiàn)控制與模型部分,JSP實(shí)現(xiàn)結(jié)果展示部分。
從Tomcat官網(wǎng)上下載最新的8.0.5版本服務(wù)器,下載完成后解壓在一定位置。配置好所需的服務(wù)器后就可以開(kāi)始創(chuàng)建動(dòng)態(tài)網(wǎng)頁(yè)工程了。
制作網(wǎng)頁(yè)使用軟件Eclipse,版本:4.4.2。首先在軟件中新建一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)工程,該軟件會(huì)自動(dòng)創(chuàng)建該工程所需要的文件路徑以及依賴等相關(guān)資源。在WebContent文件夾下主要存放有關(guān)HTML和JSP頁(yè)面相關(guān)內(nèi)容的資源文件。Java代碼放在src文件夾下,根據(jù)Java代碼實(shí)現(xiàn)的功能類別不同可以創(chuàng)建不同的文件夾,以便于后期的調(diào)整和維護(hù)。
新建Servlet程序只需在新建的文件夾上點(diǎn)擊右鍵,在New選項(xiàng)中可以找到Servelt選項(xiàng),在新建時(shí)根據(jù)需求選擇使用doGet方法或doPost方法。
要完成文件瀏覽功能,不需要前端頁(yè)面向后端程序傳入?yún)?shù),利用HDFS API包即可完成讀取文件目錄。代碼導(dǎo)入后,就可以直接在代碼中調(diào)用各種函數(shù),在程序中調(diào)用函數(shù)并傳入?yún)?shù),會(huì)返回一個(gè)包含所有文件路徑的字符串,對(duì)字符串進(jìn)行簡(jiǎn)單的處理,便可將文件路徑直接打印在前端頁(yè)面進(jìn)行展示。
對(duì)完成文件下載功能的Servlet程序,只需接收來(lái)自前端或其他程序的一個(gè)字符串變量,該字符串變量所包含的是文件在HDFS文件系統(tǒng)上的路徑信息,便可以直接從HDFS文件系統(tǒng)將文件下載到服務(wù)器,之后文件再由服務(wù)器傳輸?shù)娇蛻舳藶g覽器,瀏覽器便會(huì)自動(dòng)接收文件并進(jìn)行下載。
本項(xiàng)目中使用的前端框架主要為Bootstrap,包含各種快捷可用的網(wǎng)頁(yè)頁(yè)面設(shè)計(jì),極大節(jié)省了設(shè)計(jì)制作前端頁(yè)面所需的時(shí)間。與此同時(shí),制作的前端網(wǎng)頁(yè)包含部分驗(yàn)證功能以降低后端代碼的復(fù)雜度,比如在前端動(dòng)態(tài)驗(yàn)證用戶注冊(cè)的用戶名是否存在,已存在則不可用,無(wú)法提交注冊(cè)信息,此功能主要由JavaScript語(yǔ)言編寫(xiě)的腳本完成。HTML用于編輯網(wǎng)頁(yè)的主要內(nèi)容;CSS用于對(duì)主要內(nèi)容編輯動(dòng)畫(huà)或其他視覺(jué)效果;JavaScript用于實(shí)現(xiàn)輔助功能。
本項(xiàng)目中數(shù)據(jù)可視化的實(shí)現(xiàn)主要過(guò)程:首先由Java程序運(yùn)行python腳本進(jìn)行文件數(shù)據(jù)分析,傳出參數(shù),由Java程序接收,經(jīng)過(guò)轉(zhuǎn)發(fā)將參數(shù)傳遞給前端,最后,通過(guò)前端插件echarts進(jìn)行數(shù)據(jù)可視化展示。對(duì)python腳本的編寫(xiě),需要讀取并進(jìn)行可視化展示的是Excel文件,使用Pandas庫(kù)讀取Excel文件中的內(nèi)容,使用一定方法進(jìn)行統(tǒng)計(jì)從而得出需要的表格信息,最后將數(shù)據(jù)通過(guò)插件顯示。
本平臺(tái)還設(shè)計(jì)了其他功能模塊以便于功能的擴(kuò)展。比如常用軟件的下載模塊:可將常用的功能軟件放在服務(wù)器中,用戶通過(guò)網(wǎng)頁(yè)便可以直接下載并使用該程序;本平臺(tái)還提供python腳本的運(yùn)行環(huán)境,故可以在網(wǎng)站直接命令服務(wù)器主機(jī)運(yùn)行指定的python程序并將結(jié)果返回給瀏覽器頁(yè)面,使用服務(wù)器的計(jì)算資源而不占用客戶端的資源。另外,該模塊還提供了按照條件篩選數(shù)據(jù)的網(wǎng)頁(yè)程序,該程序使用了Streamlit庫(kù),用于給出python程序一個(gè)可視化的網(wǎng)頁(yè),不同于其他Web工程,此程序在運(yùn)行時(shí)只占用一個(gè)端口,不需要運(yùn)行在網(wǎng)絡(luò)服務(wù)器中,直接將數(shù)據(jù)展示在網(wǎng)頁(yè)上,不需要配置路由等信息。
Linux系統(tǒng)是安裝Hadoop平臺(tái)的最佳選擇。由于實(shí)驗(yàn)室條件下可利用的計(jì)算機(jī)資源有限,故選擇在1臺(tái)計(jì)算機(jī)(后面稱為試驗(yàn)機(jī))上安裝3臺(tái)虛擬機(jī)模擬多臺(tái)計(jì)算機(jī)的情況。
測(cè)試計(jì)算機(jī)系統(tǒng)為Windows 10家庭中文版,系統(tǒng)版本號(hào)1909。第1步,安裝VMware;第2步,安裝Linux系統(tǒng):下載CentOS的鏡像文件,使用CentOS 6.5的64位版本。本實(shí)驗(yàn)中,試驗(yàn)機(jī)的內(nèi)存為16 GByte,所以給每臺(tái)虛擬機(jī)的運(yùn)行內(nèi)存設(shè)置為1~4 GByte。將已經(jīng)安裝好的虛擬機(jī)再?gòu)?fù)制兩份,給這3臺(tái)虛擬機(jī)分別命名node01、node02以及node03。
配置Linux環(huán)境:首先查看Windows系統(tǒng)內(nèi)所有正在運(yùn)行的服務(wù),確認(rèn)與VMware相關(guān)的服務(wù)已經(jīng)全部開(kāi)啟。其次,在VMware的虛擬網(wǎng)絡(luò)編輯器中查看NAT(Network Address Translation)設(shè)置,確認(rèn)VmNet網(wǎng)卡已經(jīng)配置好IP地址以及DNS(Domain Name System)服務(wù)器。最后,按照集群規(guī)劃分別配置3臺(tái)虛擬機(jī)的環(huán)境。啟動(dòng)虛擬機(jī),開(kāi)機(jī)完成后在命令行完成以下修改操作:修改每臺(tái)機(jī)器的MAC地址、IP地址、主機(jī)名和域名映射。
所有內(nèi)容修改成功后重啟Linux系統(tǒng),將3臺(tái)機(jī)器配置為關(guān)閉防火墻,禁止開(kāi)機(jī)啟動(dòng),關(guān)閉Selinux,設(shè)置虛擬機(jī)的免密登錄,最后設(shè)置3臺(tái)虛擬機(jī)的時(shí)鐘同步。
配置環(huán)境。首先查看3臺(tái)機(jī)器自帶的Openjdk并卸載,將從Java官方網(wǎng)站下載的以.tar.gz為結(jié)尾的Java環(huán)境安裝包,上傳到虛擬機(jī)中并分別在3臺(tái)虛擬機(jī)中解壓縮,之后再分別給3臺(tái)及其配置Java的環(huán)境變量。
配置好Java環(huán)境變量后,再給3臺(tái)虛擬機(jī)安裝MySQL數(shù)據(jù)庫(kù)。將從Apache官網(wǎng)下載的以.tar.gz為結(jié)尾的zookeeper安裝包,本實(shí)驗(yàn)中所下載版本為3.4.9版本,之后解壓此壓縮包,修改其中配置文件并且分別給3臺(tái)虛擬機(jī)添加myid配置文件。
最后分別在3臺(tái)虛擬機(jī)命令行啟動(dòng)Zookeeper服務(wù),使用以下命令運(yùn)行服務(wù)和查看狀態(tài):
將Hadoop安裝包上傳到虛擬機(jī),之后解壓并修改配置文件,配置hadoop相關(guān)的環(huán)境變量。在各個(gè)虛擬機(jī)上啟動(dòng)集群服務(wù),命令行輸入jps,Hadoop運(yùn)行成功。在命令行輸入“sbin/start-dfs.sh”,便可以成功啟動(dòng)HDFS文件系統(tǒng)。
下載Tomcat服務(wù)器的壓縮版本,之后將其解壓在工程指定文件夾。解壓后,進(jìn)入到其bin文件夾下,在此文件目錄中打開(kāi)Windows命令行窗口并運(yùn)行startup文件啟動(dòng)服務(wù)器。
關(guān)于網(wǎng)站工程的部署,筆者通過(guò)eclipse軟件將工程導(dǎo)出成以war為結(jié)尾的文件包,之后將此文件放入服務(wù)器文件目錄的webapps文件夾。這種方式比較方便,可節(jié)省服務(wù)器存儲(chǔ)空間。
由于從外部網(wǎng)絡(luò)訪問(wèn)網(wǎng)站需要專有域名或公網(wǎng)IP,在實(shí)驗(yàn)室為方便測(cè)試,使用內(nèi)網(wǎng)穿透工具,此工具將本地端口映射到外部網(wǎng)絡(luò)可以訪問(wèn)的域名。實(shí)驗(yàn)中使用釘釘內(nèi)網(wǎng)穿透工具,進(jìn)入到ding.exe存在的目錄,在此目錄下打開(kāi)命令行,輸入命令:ding.exe-config=./ding.cfg-subdomain=mbdp 8080。
之后該軟件便將本機(jī)8080端口映射到mbdp.vaiwan.com域名地址,此時(shí)在網(wǎng)絡(luò)任意一臺(tái)設(shè)備的瀏覽器中輸入以上域名便可訪問(wèn)到本機(jī)對(duì)應(yīng)端口所共享的內(nèi)容。
經(jīng)過(guò)運(yùn)行與測(cè)試,該網(wǎng)站能成功運(yùn)行并完成相關(guān)功能。其用戶注冊(cè)頁(yè)面如圖2所示;經(jīng)過(guò)實(shí)際測(cè)試文件的上傳與下載等功能均能正常使用,其上傳與下載速度取決于當(dāng)時(shí)所處的網(wǎng)絡(luò)環(huán)境,文件下載和上傳頁(yè)面如圖3、圖4所示;導(dǎo)入大量的醫(yī)療數(shù)據(jù),經(jīng)統(tǒng)計(jì)后可輸出圖形化顯示,如圖5、圖6所示。
圖2 用戶注冊(cè)頁(yè)面示意圖Fig.2 Schematic diagram of user registration page
圖3 文件下載頁(yè)面Fig.3 File download page
圖4 文件上傳頁(yè)面Fig.4 File upload page
圖5 顯示數(shù)據(jù)關(guān)系的條形圖Fig.5 Bar chart of data relationships
圖6 顯示數(shù)據(jù)關(guān)系的餅形圖Fig.6 Pie chart of data relationships
筆者使用Hadoop分布文件系統(tǒng)、Web服務(wù)器開(kāi)發(fā)設(shè)計(jì)了針對(duì)醫(yī)療大數(shù)據(jù)的平臺(tái),給出了本平臺(tái)的總體設(shè)計(jì)方案、網(wǎng)站服務(wù)器及相應(yīng)軟件安裝配置方法。通過(guò)平臺(tái)的搭建部署以及測(cè)試運(yùn)行,實(shí)現(xiàn)了數(shù)據(jù)存儲(chǔ)、下載、數(shù)據(jù)的可視化展示以及運(yùn)行腳本完成對(duì)數(shù)據(jù)的統(tǒng)計(jì)與分析等功能。
吉林大學(xué)學(xué)報(bào)(信息科學(xué)版)2022年1期