謝 帆 彭玉濤
(井岡山大學(xué)網(wǎng)絡(luò)信息中心,江西 吉安 343009)
面對(duì)海量大文件、小文件存儲(chǔ)混亂的問題,引入基于Hadoop分布式架構(gòu)的云存儲(chǔ)系統(tǒng)、HBase數(shù)據(jù)庫,并提出海量小文件存儲(chǔ)的HPM優(yōu)化方案。根據(jù)小文件體積不均勻、數(shù)量多的特征,通過創(chuàng)建不同類別的小文件索引,將MDS鏡像文件與文件名拼接成字符串,完成多個(gè)小文件合并設(shè)置,并采用Ehcache緩存框架對(duì)需要訪問的特定數(shù)據(jù)文件,緩存至云存儲(chǔ)平臺(tái)的客戶端中,能夠充分保證用戶在與Hadoop集群交互、重復(fù)信息訪問的效率,以及分布式數(shù)據(jù)存儲(chǔ)的可靠性、容錯(cuò)性。
分布式存儲(chǔ)是將分布式文件系統(tǒng),部署于多個(gè)分散的云服務(wù)器中,并采用ScaleOut橫向擴(kuò)展架構(gòu),將不同的數(shù)據(jù)信息處理、存儲(chǔ)任務(wù),分布到多個(gè)低成本的網(wǎng)絡(luò)節(jié)點(diǎn),并可根據(jù)數(shù)據(jù)存儲(chǔ)的需求添加節(jié)點(diǎn),來擴(kuò)展云服務(wù)存儲(chǔ)容量、存儲(chǔ)功能。[1]外部客戶端可通過互聯(lián)網(wǎng),接入到分布式存儲(chǔ)的云服務(wù)平臺(tái)之中,對(duì)任意時(shí)間、任意地點(diǎn)、任意數(shù)據(jù)對(duì)象的存儲(chǔ)行為,進(jìn)行獨(dú)立存儲(chǔ)節(jié)點(diǎn)、數(shù)據(jù)存儲(chǔ)任務(wù)的配置,提供面向客戶端、按需的云存儲(chǔ)服務(wù)。
存儲(chǔ)虛擬化是指存儲(chǔ)設(shè)備虛擬化、存儲(chǔ)服務(wù)虛擬化、網(wǎng)絡(luò)虛擬化,目的在于通過硬件及應(yīng)用虛擬化、數(shù)據(jù)封裝技術(shù),解決不同計(jì)算機(jī)設(shè)備接口、存儲(chǔ)容量間的差異問題,使得用戶在數(shù)據(jù)信息處理、存儲(chǔ)過程中,無需考慮后臺(tái)的硬件配置、資源負(fù)載狀況。
在PC主機(jī)上設(shè)置虛擬化層,虛擬出應(yīng)用軟件、虛擬存儲(chǔ)管理設(shè)備,并通過映像技術(shù)虛擬出CPU、I/O通訊接口,以及NAS、SAN等虛擬網(wǎng)絡(luò)存儲(chǔ),在數(shù)據(jù)信息處理與存儲(chǔ)中共用同一傳輸信道,或者經(jīng)由數(shù)據(jù)通道直接訪問存儲(chǔ)設(shè)備,實(shí)現(xiàn)底層硬件、上層存儲(chǔ)業(yè)務(wù)的互相耦合。
數(shù)據(jù)容錯(cuò)技術(shù)為分布式云存儲(chǔ)的故障處理技術(shù),包括復(fù)制性數(shù)據(jù)容錯(cuò)、糾刪碼型數(shù)據(jù)容錯(cuò)等內(nèi)容。其中復(fù)制性數(shù)據(jù)容錯(cuò)技術(shù),是通過設(shè)置多個(gè)數(shù)據(jù)處理模塊,用于不同網(wǎng)絡(luò)節(jié)點(diǎn)的數(shù)據(jù)處理、存儲(chǔ)控制,當(dāng)某一模塊損壞后可斷開或隔離該模塊,內(nèi)部節(jié)點(diǎn)的其余模塊可正常運(yùn)行,但缺點(diǎn)是復(fù)制性數(shù)據(jù)容錯(cuò)技術(shù)需要建立副本,會(huì)占用大量的存儲(chǔ)硬件資源。糾刪碼型數(shù)據(jù)容錯(cuò)技術(shù)、數(shù)據(jù)加密技術(shù),則是采用存儲(chǔ)數(shù)據(jù)的編碼處理方式、TTL/SSL技術(shù)等進(jìn)行編碼加密、解碼控制,用于防控外部用戶攻擊、病毒入侵,其占用的存儲(chǔ)硬件資源較少,但缺陷是編解碼過程對(duì)服務(wù)器設(shè)備的性能要求更高。
HadoopArchives作為數(shù)據(jù)文檔或文件的合并工具,通常利用MapReduce模型編程、HAR文件元數(shù)據(jù)信息設(shè)置與合并,完成小的數(shù)據(jù)文件處理、歸檔存儲(chǔ)等操作,并將歸檔后的文件添加至系統(tǒng)索引中。[2]如針對(duì)_index、_masterindex形式的小數(shù)據(jù)文件,可由HAR打包工具設(shè)置*.har的文件擴(kuò)展名,其中包含了不同數(shù)據(jù)的文件名、位置等元數(shù)據(jù)信息,然后用part-*存放數(shù)據(jù)內(nèi)容、用masterindex存放hashcode指針,歸檔處理后的har文件可壓縮和解壓,這樣能夠最大程度減少磁盤容量的占用。
SequenceFile與HAR的數(shù)據(jù)文件合并方案類似,是以[key value]鍵值對(duì)的二進(jìn)制文件作為小文件合并的元數(shù)據(jù)信息處理方式,其中設(shè)置key為小文件名、value為小文件內(nèi)容,以數(shù)據(jù)塊為單位進(jìn)行序列化合并,將小文件數(shù)據(jù)切為split格式的片,作為MapReduce并行計(jì)算、存儲(chǔ)的輸入值,使小文件合并降低NameNode內(nèi)存開銷。但缺陷是該文件格式不能建立索引,讀取時(shí)需遍歷整個(gè)源文件。因而這一數(shù)據(jù)文件合并方案,即使采取Block組織方式對(duì)key、value都進(jìn)行壓縮,也難以滿足低延時(shí)隨機(jī)訪問的數(shù)據(jù)讀取需求。
為解決這一問題,本文給出HPM分級(jí)處理的小文件優(yōu)化方案,采用HPM方案改進(jìn)現(xiàn)有的HDFS分布式存儲(chǔ)架構(gòu),將其設(shè)置為包含用戶層、數(shù)據(jù)處理層、存儲(chǔ)層的多層結(jié)構(gòu),具體如圖1所示。
圖1 HPM方案改進(jìn)的HDFS分布式存儲(chǔ)架構(gòu)
其中HPM分級(jí)處理模塊位于數(shù)據(jù)處理層,該層級(jí)包含文件重復(fù)判定、文件大小判定、文件合并、緩存和預(yù)取等的子模塊,根據(jù)服務(wù)器/客戶機(jī)(C/S)模式傳輸?shù)奈募笮?,HPM通過以上多個(gè)處理模塊,完成不同文件名稱字符串、MD5值的數(shù)據(jù)檢索分析,判定文件大小、是否存在重復(fù),將小文件通過合并模塊的合并隊(duì)列、臨時(shí)隊(duì)列進(jìn)行合并,使合并文件大小滿足系統(tǒng)數(shù)據(jù)塊的閾值要求,降低NameNode的內(nèi)存開銷。同時(shí),在索引子模塊中創(chuàng)建索引文件,在HBase數(shù)據(jù)庫中記錄臨時(shí)索引信息,將檢索的同一類型的小文件合并;在緩存和預(yù)取子模塊中,掃描數(shù)據(jù)文件的訪問次數(shù),記錄訪問頻率更高的文件,并將該文件緩存于HDFS存儲(chǔ)端,以便于用戶端對(duì)數(shù)據(jù)文件的重復(fù)訪問和讀取。
在分布式存儲(chǔ)系統(tǒng)構(gòu)建之前,需要利用各節(jié)點(diǎn)主機(jī)、VMWare虛擬機(jī)、Hadoop集群,進(jìn)行完全分布式系統(tǒng)架構(gòu)的環(huán)境部署。選用6臺(tái)PC機(jī)作為NameNode節(jié)點(diǎn)、DataNode節(jié)點(diǎn)、SecondaryNameNode節(jié)點(diǎn)的主機(jī),分別命名為masterl、master2、slavel、……、slave4,各主機(jī)在不同節(jié)點(diǎn)上執(zhí)行主機(jī)名修改,以及network-scripts目錄的ifcfg-eth0文件修改、靜態(tài)IP地址配置等任務(wù),使Hadoop集群的多個(gè)節(jié)點(diǎn)名與節(jié)點(diǎn)IP地址相對(duì)應(yīng)[3]。
而后對(duì)Hadoop分布式架構(gòu)的Java編譯運(yùn)行環(huán)境進(jìn)行配置,設(shè)置由ssh管理的免密鑰登錄節(jié)點(diǎn),設(shè)定各節(jié)點(diǎn)的數(shù)據(jù)存放目錄/opt/software、解壓目錄/opt/module,ssh免密鑰配置的執(zhí)行流程為:$ssh-keygen-trsa;$cd/root/.ssh;$ssh-copy-idslavel~4,即輸入命令分別對(duì)應(yīng)id_rsa.pub(公鑰)、id_rsa(私鑰)等文件,在master節(jié)點(diǎn)進(jìn)入/root/.ssh目錄,將公鑰拷貝到可免密登錄的slavel、……、slave4節(jié)點(diǎn),由此只需通過sshroot@slavel~4命令驗(yàn)證,即可完成存儲(chǔ)節(jié)點(diǎn)設(shè)置。
Hadoop環(huán)境變量的配置需打開etc目錄,將profile文件的用戶名$LOGNAME/.profile、登錄目錄$HOME/.profile變量,添加到數(shù)據(jù)存儲(chǔ)的運(yùn)行環(huán)境中,在profile文件末尾添加Hadoop路徑vim/etc/profile,保存退出。而后對(duì)masterl節(jié)點(diǎn)、slaves節(jié)點(diǎn)的環(huán)境變量進(jìn)行設(shè)置,將jdk安裝路徑加入至masterl節(jié)點(diǎn),添加slave節(jié)點(diǎn)的IP地址,修改Hadoop核心配置文件來完成節(jié)點(diǎn)IP和端口設(shè)置。
基于Hadoop分布式集群環(huán)境,構(gòu)建用于數(shù)據(jù)處理、存儲(chǔ)的云服務(wù)管理系統(tǒng),對(duì)系統(tǒng)內(nèi)的文件大小、名稱、長度、合并偏移值等元數(shù)據(jù)信息,以及數(shù)據(jù)文件的存儲(chǔ)路徑進(jìn)行科學(xué)規(guī)范管理[4]。云存儲(chǔ)系統(tǒng)模型的層次化組成結(jié)構(gòu),包括存儲(chǔ)層、數(shù)據(jù)管理層、應(yīng)用接口層、用戶訪問層等層級(jí),具體如圖2所示。
圖2 分布式存儲(chǔ)系統(tǒng)的組成架構(gòu)
該分布式云存儲(chǔ)系統(tǒng)模型以B/S(瀏覽器/服務(wù)器)模式,作為用戶訪問、數(shù)據(jù)處理與存儲(chǔ)的功能實(shí)現(xiàn)方式,由應(yīng)用服務(wù)器響應(yīng)用戶登錄、文件上傳/下載的執(zhí)行命令,Hadoop集群節(jié)點(diǎn)存儲(chǔ)大文件、小文件、合并文件。
存儲(chǔ)層為系統(tǒng)最底層,通常包含HDFS存儲(chǔ)器、Web服務(wù)器、存儲(chǔ)硬盤等設(shè)備;數(shù)據(jù)管理層借助于Hadoop分布式集群、存儲(chǔ)器裝置,設(shè)置多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)、虛擬出NAS、SAN存儲(chǔ)裝置,可提供數(shù)據(jù)讀取、寫入、瀏覽、刪除的功能服務(wù)。
應(yīng)用接口層為系統(tǒng)的網(wǎng)絡(luò)連接層,包含API、webserver等接口,在數(shù)據(jù)接入、網(wǎng)絡(luò)信道傳輸過程中,由Web服務(wù)器控制用戶訪問請(qǐng)求、文件處理與存儲(chǔ)需求,安排Nginx反向代理向多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)分配負(fù)載,并將處理后的數(shù)據(jù)寫入至Hadoop集群、MySQL或HDFS存儲(chǔ)數(shù)據(jù)庫中。
用戶訪問層為系統(tǒng)最外層,由管理服務(wù)器分配與配置系統(tǒng)賬號(hào)、登錄密碼,展示用于用戶訪問控制的注冊(cè)、登錄等操作頁面。
網(wǎng)絡(luò)云平臺(tái)中的數(shù)據(jù)文件存儲(chǔ)設(shè)置,通常圍繞著用戶層、數(shù)據(jù)處理層、存儲(chǔ)層等系統(tǒng)層級(jí),設(shè)置用于數(shù)據(jù)文件存儲(chǔ)的大小判定模塊、重復(fù)判定模塊、合并模塊、緩存及預(yù)讀寫模塊,分級(jí)完成多個(gè)小文件數(shù)據(jù)的連續(xù)處理[5]。
(1)文件大小判定的功能模塊。當(dāng)前網(wǎng)絡(luò)傳輸、存儲(chǔ)數(shù)據(jù)文件大小的閾值設(shè)定,通常依照HDFS分布式文件存儲(chǔ)的標(biāo)準(zhǔn),默認(rèn)數(shù)據(jù)塊大小為64MB,小于64MB的存儲(chǔ)數(shù)據(jù)文件被稱為小文件,但這一文件閾值設(shè)定過高,將導(dǎo)致不必要的文件合并,過低又會(huì)增加合并后的小文件數(shù)量,因此本文設(shè)定小文件閾值為10MB。
(2)文件重復(fù)判定的功能模塊。數(shù)據(jù)文件傳輸?shù)闹貜?fù)性判定,通常使用MDS信息摘要算法,對(duì)不定長度數(shù)據(jù)信息,處理為具有固定字符串長度的數(shù)據(jù)元組,并輸出由MDS算法處理后的結(jié)果A。當(dāng)用戶客戶端上傳文數(shù)據(jù)件后,查看數(shù)據(jù)信息的MDS值是否存在于HBase數(shù)據(jù)庫中,若存在表明數(shù)據(jù)已被寫入、無需重復(fù)寫入,具體基于MDS算法的數(shù)據(jù)文件重復(fù)判定步驟如下:
第一,對(duì)數(shù)據(jù)長度為M的文件進(jìn)行二進(jìn)制數(shù)填充(包括1和n個(gè)0),直到字符串?dāng)U充為448+N*512(bit)的長度則停止填充。
第二,用64位字符串存儲(chǔ)填充前的數(shù)據(jù)信息長度,按照64位求余的結(jié)果,追加長度為448+N*512+64=(N+1)*512(bit)的數(shù)據(jù)序列。
第三,設(shè)置32位初始化鏈路變量A、B、C、D,對(duì)輸入數(shù)據(jù)分為字符串長度為512bit的信息塊,進(jìn)行多輪線性函數(shù)循環(huán)運(yùn)算,求解公式為lib=(ABC)T+(ABD)T+(ACD)T+(BCD)T,得到lib1、lib2……等的相加求和結(jié)果lib,作為MDS值。將MDS值與HBase數(shù)據(jù)庫中的文件名、文件內(nèi)容字符串作對(duì)比,進(jìn)行重復(fù)數(shù)據(jù)的篩除、過濾。
(3)文件合并的功能模塊。HDFS分布式存儲(chǔ)架構(gòu),可按照順序進(jìn)行大文件的存取、合并,但在大量小文件的處理、合并方面性能較差,而對(duì)緩存區(qū)隊(duì)列設(shè)定閾值、遍歷小文件的方式,雖然能完成大部分主流小文件的處理、合并存儲(chǔ)操作,但以“文件體積”控制為主的合并,將造成合并后的數(shù)據(jù)體積不均、NameNode內(nèi)存浪費(fèi)問題。
根據(jù)以上數(shù)據(jù)文件大小判定標(biāo)準(zhǔn),設(shè)定小文件閾值為10MB的體積最優(yōu)模式,也即當(dāng)傳輸文件體積大于10MB時(shí)不作處理,小于10MB時(shí)按照數(shù)據(jù)文件大小判定的要求,按照文件體積大小進(jìn)行均勻分布,執(zhí)行文件大小的判定算法(具體代碼如圖3所示)對(duì)其合并處理,并調(diào)用API接口上傳大文件至DataNode集群中存儲(chǔ)。這一基于體積最優(yōu)的小文件合并算法,可最大化利用數(shù)據(jù)塊的存儲(chǔ)空間,避免合并小文件被分割、跨越數(shù)據(jù)塊存儲(chǔ),降低NameNode節(jié)點(diǎn)的內(nèi)存開銷。
文件大小的判定算法如下:
(4)文件索引、緩存的功能模塊。在HPM多處理器架構(gòu)中,設(shè)置小文件讀取分級(jí)模塊、建立索引文件,使用HBase索引表、數(shù)據(jù)庫存儲(chǔ)臨時(shí)的索引文件信息,包括數(shù)據(jù)文件名、塊BlockID、存儲(chǔ)路徑、MDS值等的信息,以及合并后的小文件長度、偏移值信息。其中對(duì)不同類型的數(shù)據(jù)文件進(jìn)行標(biāo)記,大小數(shù)據(jù)文件分別記為flag=1、flag=0,合并文件記為flag=2,根據(jù)標(biāo)記選擇數(shù)據(jù)讀取、索引的執(zhí)行策略。
網(wǎng)絡(luò)數(shù)據(jù)小文件緩存的主要目的,在于方便HDFS分布式存儲(chǔ)系統(tǒng)的讀寫操作,也即“一次寫入、多次讀取”。依托于HBase索引表、HDFS分布式存儲(chǔ)器與I/O接口,可針對(duì)外部用戶客戶端訪問的NameNode請(qǐng)求,設(shè)置元數(shù)據(jù)文件的緩存機(jī)制、置換策略,響應(yīng)請(qǐng)求后將大文件、合并文件的元數(shù)據(jù)信息,以及將小文件的文件名、長度和偏移值等信息,緩存到HDFS存儲(chǔ)器之中,當(dāng)目標(biāo)文件被訪問時(shí),直接檢索HDFS存儲(chǔ)器的元數(shù)據(jù)信息即可[6]。這里小文件緩存信息與
分布式云存儲(chǔ)是基于多臺(tái)PC主機(jī)、服務(wù)器及數(shù)據(jù)庫,將網(wǎng)絡(luò)數(shù)據(jù)處理的任務(wù)程序,拆分為多個(gè)動(dòng)態(tài)資源分配的小程序,為不同用戶分配動(dòng)態(tài)的資源池,完成數(shù)據(jù)存儲(chǔ)的按需資源配置、功能擴(kuò)展。因而對(duì)于不同數(shù)據(jù)信息的分布式云存儲(chǔ),借助于Hadoop分布式架構(gòu)、HDFS存儲(chǔ)器、HBase數(shù)據(jù)庫、PC主機(jī)、VMWare虛擬機(jī)等軟硬件設(shè)備,搭建起虛擬化云存儲(chǔ)服務(wù)平臺(tái),提供分布式接入、全局訪問、虛擬化處理與存儲(chǔ)的服務(wù),可完成對(duì)大小數(shù)據(jù)文件的分布式存儲(chǔ)、存儲(chǔ)虛擬化及數(shù)據(jù)容錯(cuò)處理。