文/李曉煬
大數(shù)據(jù)時(shí)代,隨著存儲(chǔ)與計(jì)算集群規(guī)模的不斷擴(kuò)大,氣象部門(mén)業(yè)務(wù)系統(tǒng)的分布式環(huán)境也已普遍。然而現(xiàn)在的分布式系統(tǒng)不僅限于解決性能、可靠、可擴(kuò)展性等層面上,更重要的是具有易操作性和內(nèi)部數(shù)據(jù)共享性等。傳統(tǒng)的數(shù)據(jù)共享方式在多用戶(hù)、高并發(fā)的情況下已經(jīng)出現(xiàn)了較大的局限性,需要綜合考慮性能、安全以及容錯(cuò)的分布式文件系統(tǒng)為現(xiàn)代數(shù)據(jù)處理提供極大的資源靈活性。
大規(guī)模的氣象數(shù)據(jù)被分散存儲(chǔ)在不同的設(shè)備上,傳統(tǒng)使用數(shù)據(jù)湖的方式需要很高的永久數(shù)據(jù)拷貝并且在數(shù)據(jù)創(chuàng)建和分析之間造成了延遲,無(wú)法滿(mǎn)足要求較高的場(chǎng)景,并且在越來(lái)越多的應(yīng)用都是在私有云、混合云的情況下,特別是數(shù)據(jù)和計(jì)算資源分離的場(chǎng)景,異構(gòu)的數(shù)據(jù)存儲(chǔ)帶來(lái)的系統(tǒng)耦合,都可以通過(guò)Alluxio來(lái)解耦。結(jié)合Docker技術(shù)的應(yīng)用,使環(huán)境搭建、移植、彈性收縮變得簡(jiǎn)單易用,極大的降低運(yùn)維難度。
Alluxio(之前名為T(mén)achyon)是第一個(gè)以?xún)?nèi)存為中心的虛擬的分布式系統(tǒng)。它統(tǒng)一了數(shù)據(jù)訪問(wèn)的方式,為上層計(jì)算框架和底層存儲(chǔ)系統(tǒng)構(gòu)建了橋梁。 應(yīng)用只需要連接Alluxio即可訪問(wèn)存儲(chǔ)在底層任意存儲(chǔ)系統(tǒng)中的數(shù)據(jù)。此外,Alluxio的以?xún)?nèi)存為中心的架構(gòu)使得數(shù)據(jù)的訪問(wèn)速度能比現(xiàn)有常規(guī)方案快幾個(gè)數(shù)量級(jí)。
在大數(shù)據(jù)生態(tài)系統(tǒng)中,Alluxio位于計(jì)算和存儲(chǔ)中間。它可以為生態(tài)系統(tǒng)帶來(lái)顯著的性能提升,尤其是跨數(shù)據(jù)中心和可用性區(qū)域。Alluxio是Hadoop和對(duì)象存儲(chǔ)兼容的,并且支持對(duì)底層存儲(chǔ)進(jìn)行讀寫(xiě)?,F(xiàn)有的數(shù)據(jù)分析應(yīng)用程序,如Hive、HBASE和Spark SQL,可以在不更改任何代碼的情況下運(yùn)行在Alluxio上。
容器技術(shù)是實(shí)現(xiàn)操作系統(tǒng)虛擬化的一種途徑,可以讓資源受到隔離的進(jìn)程中運(yùn)行應(yīng)用程序及其依賴(lài)關(guān)系。通過(guò)使用容器,可以輕松打包應(yīng)用程序的代碼、配置和依賴(lài)關(guān)系,將其變成容易使用的構(gòu)建塊,從而實(shí)現(xiàn)環(huán)境一致性、運(yùn)營(yíng)效率、開(kāi)發(fā)人員生產(chǎn)力和版本控制等諸多目標(biāo)。容器可以幫助保證應(yīng)用程序快速、可靠、一致地部署,其間不受部署環(huán)境的影響。容器還賦予對(duì)資源更多的精細(xì)化控制能力,讓基礎(chǔ)設(shè)施效率更高。
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的 Linux或Windows 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。相比傳統(tǒng)的虛擬化方式,Docker具有啟動(dòng)秒級(jí)、需要的資源更少、更輕量、高可用等優(yōu)勢(shì)。
Alluxio由master、worker組 成, 其中master如果有多個(gè),只有一個(gè)是leading master,其他為standby master,leading master負(fù)責(zé)管理所有的元數(shù)據(jù),包括文件系統(tǒng)元數(shù)據(jù)、block元數(shù)據(jù)和worker元數(shù)據(jù);worker會(huì)定期向leading master發(fā)送心跳;leading master會(huì)記錄所有的文件操作到日志中;worker負(fù)責(zé)管理資源,比如內(nèi)存、ssd等,負(fù)責(zé)將數(shù)據(jù)存儲(chǔ)為block同時(shí)響應(yīng)client的讀寫(xiě)請(qǐng)求;實(shí)際的file和block的映射關(guān)系保存在master中。
Alluxio由于均在Docker容器中,相互通信需要實(shí)現(xiàn)容器的跨主機(jī)通信。Docker默認(rèn)的網(wǎng)絡(luò)環(huán)境下,單臺(tái)主機(jī)上的Docker容器可以通過(guò)docker0網(wǎng)橋直接通信,而不同主機(jī)上的Docker容器之間只能通過(guò)在主機(jī)上做端口映射進(jìn)行通信。這種端口映射方式對(duì)很多集群應(yīng)用來(lái)說(shuō)操作較為繁復(fù)。Docker跨主機(jī)容器間網(wǎng)絡(luò)通信實(shí)現(xiàn)的工具有Flannel、Weave、Open vSwitch等,可根據(jù)實(shí)際需求進(jìn)行選擇部署。Flannel是CoreOS團(tuán)隊(duì)針對(duì)Kubernetes設(shè)計(jì)的一個(gè)網(wǎng)絡(luò)規(guī)劃服務(wù),它的功能是讓集群中的不同節(jié)點(diǎn)主機(jī)創(chuàng)建的Docker容器都具有全集群唯一的虛擬IP地址。Weave通過(guò)創(chuàng)建虛擬網(wǎng)絡(luò)使Docker容器能夠跨主機(jī)通信并能夠自動(dòng)相互發(fā)現(xiàn),部署相對(duì)簡(jiǎn)易。分布式文件系統(tǒng)框架如圖1所示。
4.2.1 Docker環(huán)境搭建
Docker安裝所需的依賴(lài)及安裝包均可通過(guò)yum等工具安裝,安裝成功后啟動(dòng)服務(wù)。按照需求配置Docker跨主機(jī)容器間網(wǎng)絡(luò)通信,并確認(rèn)容器間可以相互通信。如有需要可在本地搭建Docker倉(cāng)庫(kù),對(duì)后續(xù)的鏡像管理實(shí)現(xiàn)本地化。
4.2.2 Alluxio部署應(yīng)用
在Docker環(huán)境中,Alluxio鏡像可直接通過(guò)Docker Hub互聯(lián)網(wǎng)獲取或者本地Docker倉(cāng)庫(kù)獲取。啟動(dòng)Alluxio容器時(shí),使用Docker命令指定Docker容器的網(wǎng)絡(luò)環(huán)境及共享的存儲(chǔ),指定Alluxio的master及worker并設(shè)置虛擬內(nèi)存等相關(guān)參數(shù)即可。在啟動(dòng)的worker Docker容器中,可通過(guò)alluxio runTests測(cè)試該集群是否安裝成功,隨后測(cè)試訪問(wèn)Alluxio頁(yè)面或查看alluxio/logs文件夾下的日志。
圖1:分布式文件系統(tǒng)框架
圖2:Docker中的Alluxio集群跨存儲(chǔ)系統(tǒng)數(shù)據(jù)共享
Alluxio 中的掛載功能允許用戶(hù)掛載不同的存儲(chǔ)系統(tǒng)到 Alluxio 命名空間中并且通過(guò) Alluxio 命名空間無(wú)縫地跨存儲(chǔ)系統(tǒng)訪問(wèn)文件,并加速數(shù)據(jù)訪問(wèn)。如圖2所示為通過(guò)Docker中的Alluxio集群做跨存儲(chǔ)系統(tǒng)的數(shù)據(jù)共享。
大數(shù)據(jù)時(shí)代的高可用數(shù)據(jù)訪問(wèn)方式有著重要的意義,高效易用的基礎(chǔ)架構(gòu)對(duì)數(shù)據(jù)訪問(wèn)的性能以及運(yùn)維人員的維護(hù)成本均有極大的促進(jìn)作用。本文提出了基于Alluxio+Docker的分布式文件系統(tǒng),針對(duì)大量、多樣的氣象數(shù)據(jù),提供靈活的文件讀取方式,使任何應(yīng)用以?xún)?nèi)存級(jí)速度進(jìn)行文件系統(tǒng)上的數(shù)據(jù)交換,以高性能和成本有效的方式在這些系統(tǒng)中提供統(tǒng)一的、聚合的數(shù)據(jù)視圖,解決大數(shù)據(jù)訪問(wèn)性能的難題,支撐氣象數(shù)據(jù)的應(yīng)用。