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