李 碩,盧華明
(北京信息科技大學(xué) 信息管理學(xué)院,北京 100192)
環(huán)境大數(shù)據(jù)的應(yīng)用目前還處于起步的階段[1],面臨著一系列挑戰(zhàn):環(huán)境管理信息系統(tǒng)已經(jīng)積累了一定數(shù)量的環(huán)境數(shù)據(jù),但數(shù)據(jù)往往分散地存儲(chǔ)在多個(gè)信息系統(tǒng),存在數(shù)據(jù)孤島現(xiàn)象;在物聯(lián)網(wǎng)技術(shù)的發(fā)展下,資源環(huán)境大數(shù)據(jù)的類型不再僅僅局限于傳統(tǒng)的結(jié)構(gòu)化形式,更多的是以文本、項(xiàng)目報(bào)告等半結(jié)構(gòu)化與非結(jié)構(gòu)化的形式來呈現(xiàn);多種數(shù)據(jù)來源的存儲(chǔ)沒有統(tǒng)一的技術(shù)規(guī)范,存儲(chǔ)同一種數(shù)據(jù)的格式不盡相同,存在大量的異構(gòu)化數(shù)據(jù)[2]。
針對(duì)相關(guān)領(lǐng)域結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化等異構(gòu)數(shù)據(jù)增加,數(shù)據(jù)來源越來越多元化的現(xiàn)狀,James Dixon提出數(shù)據(jù)湖作為一種大數(shù)據(jù)存儲(chǔ)處理和共享服務(wù)機(jī)制[3]。數(shù)據(jù)湖是一種能夠保存數(shù)據(jù)原始格式的新型存儲(chǔ)架構(gòu)[4-6],它將所有結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在一個(gè)集中式存儲(chǔ)庫(kù)中,支持分布式地存儲(chǔ)海量的結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。Sawadogo P.等[7]總結(jié)了一種數(shù)據(jù)湖的3層存儲(chǔ)治理模型,數(shù)據(jù)湖設(shè)計(jì)成原始數(shù)據(jù)層、處理層和訪問層。針對(duì)相關(guān)領(lǐng)域大數(shù)據(jù)多源異構(gòu)特性,Joseph Mesterhazy等[8]搭建了數(shù)據(jù)湖用于存儲(chǔ)醫(yī)學(xué)影像,使得研究可以快速周轉(zhuǎn)。Chao-Tung Yang等[9]提出將Spark應(yīng)用于搭建電量使用數(shù)據(jù)湖。劉志勇等[10]構(gòu)建了電信數(shù)據(jù)的數(shù)據(jù)湖架構(gòu),可將原始數(shù)據(jù)總體壓縮44%。亞馬遜、微軟、阿里云等國(guó)內(nèi)外領(lǐng)先云計(jì)算與人工智能企業(yè)基于數(shù)據(jù)湖技術(shù)需求,分別提出了AWS Lake Formation、Azure Data Lake、阿里云云原生數(shù)據(jù)湖分析(data lake analytics,DLA)等技術(shù)。相關(guān)研究表明DLA相較于Spark,在同等性能條件下成本可節(jié)約90%[11]。
目前,對(duì)于環(huán)境領(lǐng)域大數(shù)據(jù)的存儲(chǔ)管理問題,張文信等[12]對(duì)數(shù)據(jù)的集成及應(yīng)用提出了較為系統(tǒng)的建設(shè)思路,仲陽等[13]科學(xué)分析了自然資源數(shù)據(jù)生產(chǎn)加工現(xiàn)狀,提出以數(shù)據(jù)湖為核心的數(shù)據(jù)組織體系構(gòu)建框架。然而開展環(huán)境大數(shù)據(jù)挖掘分析研究需要數(shù)據(jù)驅(qū)動(dòng),一方面數(shù)據(jù)所占用的存儲(chǔ)空間與日俱增,另一方面對(duì)查詢速度和響應(yīng)時(shí)間有更高要求。本文提出了一種基于DLA的數(shù)據(jù)存儲(chǔ)模型,將數(shù)據(jù)湖應(yīng)用于環(huán)境大數(shù)據(jù),研究構(gòu)建多源異構(gòu)數(shù)據(jù)存儲(chǔ)策略,在存儲(chǔ)空間和查詢時(shí)間2個(gè)方面進(jìn)行實(shí)驗(yàn)驗(yàn)證。
環(huán)境數(shù)據(jù)來源多樣、類型復(fù)雜、結(jié)構(gòu)多種,本文分析選取的環(huán)境數(shù)據(jù)源包括空氣質(zhì)量數(shù)據(jù)、水質(zhì)數(shù)據(jù)、實(shí)時(shí)人口位置數(shù)據(jù)、聯(lián)合國(guó)貿(mào)易統(tǒng)計(jì)數(shù)據(jù)庫(kù)UN Comtrade等數(shù)據(jù)源。對(duì)已有環(huán)境數(shù)據(jù)從4個(gè)維度進(jìn)行歸納總結(jié),如表1所示。
表1 環(huán)境數(shù)據(jù)類型分析
針對(duì)環(huán)境大數(shù)據(jù)多源異構(gòu)的特點(diǎn)和數(shù)據(jù)孤島問題,本文在對(duì)環(huán)境數(shù)據(jù)組成進(jìn)行數(shù)據(jù)源分析的基礎(chǔ)上,提出環(huán)境數(shù)據(jù)存儲(chǔ)的資源管理層、存儲(chǔ)層和分析層的3層數(shù)據(jù)管理架構(gòu),存儲(chǔ)模型如圖1所示。為適應(yīng)環(huán)境大數(shù)據(jù)具有的增長(zhǎng)變化快和數(shù)據(jù)來源種類眾多的特點(diǎn),在Fatemeh Nargesian等[14]提出數(shù)據(jù)湖作為數(shù)據(jù)的中間存儲(chǔ)層的基礎(chǔ)上,基于函數(shù)計(jì)算實(shí)現(xiàn)了事件驅(qū)動(dòng)的數(shù)據(jù)采集獲取,使用對(duì)象存儲(chǔ)統(tǒng)一了數(shù)據(jù)存儲(chǔ)層。
圖1 數(shù)據(jù)湖存儲(chǔ)模型
2.1.1 資源管理層
DLA原生支持csv、json等文件格式,也支持關(guān)聯(lián)MySQL、PostgreSQL等關(guān)系型數(shù)據(jù)庫(kù),針對(duì)多源異構(gòu)的環(huán)境數(shù)據(jù),在資源管理層采用Python腳本等方式完成數(shù)據(jù)處理,環(huán)境數(shù)據(jù)流入數(shù)據(jù)湖。
2.1.2 存儲(chǔ)層
使用對(duì)象存儲(chǔ)技術(shù)支持多種數(shù)據(jù)格式的存儲(chǔ),采用Avro、Parquet等為大數(shù)據(jù)優(yōu)化的數(shù)據(jù)格式縮短數(shù)據(jù)查詢時(shí)間和節(jié)約存儲(chǔ)空間,應(yīng)用分區(qū)存儲(chǔ)策略將開放存儲(chǔ)服務(wù)(open storage service,OSS)存儲(chǔ)層數(shù)據(jù)與數(shù)據(jù)湖建立映射。
2.1.3 分析層
數(shù)據(jù)湖采用讀時(shí)模式,已建立好挖掘關(guān)聯(lián)關(guān)系的數(shù)據(jù)回流到數(shù)據(jù)庫(kù)等結(jié)構(gòu)化或關(guān)系型存儲(chǔ),同時(shí)支持Flink等計(jì)算模型直接訪問存儲(chǔ)層。
在資源管理層實(shí)現(xiàn)環(huán)境數(shù)據(jù)從其他數(shù)據(jù)源到數(shù)據(jù)湖的遷移,即數(shù)據(jù)流入數(shù)據(jù)湖。數(shù)據(jù)處理流程如圖2所示。
圖2 數(shù)據(jù)湖的數(shù)據(jù)處理流程
根據(jù)環(huán)境數(shù)據(jù)源分析,數(shù)據(jù)按照其操作特點(diǎn)可劃分為實(shí)時(shí)增量和定時(shí)批量。對(duì)于實(shí)時(shí)增量數(shù)據(jù),利用函數(shù)計(jì)算的觸發(fā)器,基于事件驅(qū)動(dòng)(functions as a service,F(xiàn)aaS)進(jìn)行觸發(fā)。以人口位置數(shù)據(jù)為例,觸發(fā)器監(jiān)測(cè)到更新的數(shù)據(jù),每15 min自動(dòng)觸發(fā)執(zhí)行1次,完成數(shù)據(jù)獲取。對(duì)于定時(shí)批量更新的數(shù)據(jù),數(shù)據(jù)更新上傳的頻率一般較低,往往數(shù)月完成1次更新上傳,采用的數(shù)據(jù)遷移工具有DataX和OSSutil。DataX是阿里開源的一款數(shù)據(jù)同步工具,支持OSS等多種數(shù)據(jù)源,作為中間傳輸載體負(fù)責(zé)連接各種數(shù)據(jù)源。OSSutil是OSS遷移工具,用于關(guān)聯(lián)和建立OSS的連接,將存放原始數(shù)據(jù)的服務(wù)器連接公網(wǎng),配置服務(wù)器本地?cái)?shù)據(jù)源為源數(shù)據(jù),將數(shù)據(jù)文件定時(shí)批量遷移至OSS存儲(chǔ)。
結(jié)構(gòu)化數(shù)據(jù)包括數(shù)據(jù)庫(kù)數(shù)據(jù)源和csv文件兩類。利用DLA可以加載SQL Server、MySQL、PostgreSQL等關(guān)系型數(shù)據(jù)庫(kù)寫入OSS,并可以將查詢結(jié)果或更改通過數(shù)據(jù)回流寫回?cái)?shù)據(jù)庫(kù)。對(duì)于非結(jié)構(gòu)化數(shù)據(jù),本文所研究的主要有兩大類,分別是Excel電子表格數(shù)據(jù)和Zip壓縮包,電子表格需轉(zhuǎn)換成csv格式,二進(jìn)制格式的壓縮包需完成解壓,上述操作使用Python程序完成自動(dòng)處理。
在查詢分析層通過調(diào)用靈活的數(shù)據(jù)分析接口,為環(huán)境數(shù)據(jù)挖掘提供存儲(chǔ)和分析支撐,即數(shù)據(jù)流出數(shù)據(jù)湖。傳統(tǒng)大數(shù)據(jù)平臺(tái)采用寫時(shí)模式的數(shù)據(jù)處理方式[15],必須經(jīng)過提取、轉(zhuǎn)換、加載等步驟。采用DLA存儲(chǔ)的數(shù)據(jù),由于可以按原樣存儲(chǔ),可以采取更為靈活的處理方式。不同于傳統(tǒng)數(shù)據(jù)倉(cāng)庫(kù)的schema on write(寫時(shí)模式)策略,DLA原生支持schema on read(讀時(shí)模式)策略,無需將其轉(zhuǎn)換為預(yù)先定義的數(shù)據(jù)結(jié)構(gòu)。在Sawadogo P.所總結(jié)的模型基礎(chǔ)上,為了將異構(gòu)數(shù)據(jù)轉(zhuǎn)換成可管理的數(shù)據(jù),通過讀時(shí)模式和寫時(shí)模式策略,增加了數(shù)據(jù)流出數(shù)據(jù)湖,支持將原始數(shù)據(jù)通過數(shù)據(jù)模型,加工成特定結(jié)構(gòu)化、規(guī)整化的形態(tài)進(jìn)行存儲(chǔ)處理。讀時(shí)模式和寫時(shí)模式的對(duì)比分析如表2所示。
表2 讀時(shí)模式和寫時(shí)模式對(duì)比
基于集中式數(shù)據(jù)存儲(chǔ)的OSS構(gòu)建環(huán)境數(shù)據(jù)存儲(chǔ)層,環(huán)境數(shù)據(jù)以本源格式保存,包括結(jié)構(gòu)化的csv、半結(jié)構(gòu)化的json等格式。首先采用讀時(shí)模式,在使用數(shù)據(jù)時(shí)定義環(huán)境數(shù)據(jù)的模型結(jié)構(gòu),提高數(shù)據(jù)模型定義的靈活性,滿足多樣性、可變性的數(shù)據(jù)分析訴求。傳統(tǒng)的寫時(shí)模式有穩(wěn)定的存儲(chǔ)和處理能力,但難以應(yīng)對(duì)大量數(shù)據(jù)快速產(chǎn)生且數(shù)據(jù)類型不同的情況,不適合大數(shù)據(jù)存儲(chǔ),而DLA能完整存儲(chǔ)大量異構(gòu)數(shù)據(jù),支持靈活的讀時(shí)模式策略,可以將數(shù)據(jù)轉(zhuǎn)換成需要使用分析的類型。讀時(shí)模式和寫時(shí)模式相輔相成,利用DLA結(jié)合OSS在環(huán)境大數(shù)據(jù)探索初期采用讀時(shí)模式進(jìn)行數(shù)據(jù)挖掘,在環(huán)境數(shù)據(jù)建立挖掘關(guān)聯(lián)關(guān)系后形成有價(jià)值的信息,通過數(shù)據(jù)回流寫入結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)。同時(shí)Flink等計(jì)算引擎也支持直接訪問OSS進(jìn)行運(yùn)算分析。
通過格式轉(zhuǎn)換方式對(duì)原始數(shù)據(jù)進(jìn)行處理,在OSS存儲(chǔ)層把原始數(shù)據(jù)的格式轉(zhuǎn)換為高性能格式,在使用DLA掃描數(shù)據(jù)時(shí)使用轉(zhuǎn)換后的數(shù)據(jù),可以節(jié)省一定的存儲(chǔ)空間。DLA支持Apache ORC、Parquet和Avro這類高性能數(shù)據(jù)格式。其中,ORC和Parquet是列式存儲(chǔ)的數(shù)據(jù)格式,Avro是一種行式存儲(chǔ)的數(shù)據(jù)格式??梢园言紨?shù)據(jù)轉(zhuǎn)換為上述3類格式,然后只掃描需要的數(shù)據(jù)列,無需掃描所有數(shù)據(jù),從而節(jié)省掃描時(shí)間。DLA支持處理各類數(shù)據(jù)文件的序列化和反序列化(serialize/deserilize,SerDe),配置示例如下:
CREATE EXTERNAL TABLE comtrade
(pfcode varchar(400),
yr varchar(400),
period varchar(400),
……)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ′|′
STORED AS TEXTFILE
LOCATION ′oss://test-bucket/comtrade′;
TBLPROPERTIES
(′skip.header.line.count′= ′1′,);
這個(gè)配置是在DLA連接OSS加載原始數(shù)據(jù)時(shí),通過stored as指定OSS上的數(shù)據(jù)文件格式。
環(huán)境數(shù)據(jù)中文件類型的數(shù)據(jù),會(huì)被周期性地直接上傳到OSS。但這些存儲(chǔ)在OSS上的文件缺少元數(shù)據(jù)管理,造成分析的困難。通過編制分區(qū)元數(shù)據(jù)管理存儲(chǔ)策略,元數(shù)據(jù)發(fā)現(xiàn)任務(wù)可以為OSS的環(huán)境數(shù)據(jù)文件新建和修改數(shù)據(jù)湖元數(shù)據(jù)。在DLA中使用分區(qū)表對(duì)OSS中的環(huán)境大數(shù)據(jù)進(jìn)行細(xì)化處理,縮短查詢響應(yīng)時(shí)間。將存儲(chǔ)在OSS中的資源環(huán)境生態(tài)數(shù)據(jù)映射成一張分區(qū)表,分區(qū)列對(duì)應(yīng)OSS中的目錄,在編制目錄時(shí)遵循命名規(guī)則,分區(qū)列對(duì)應(yīng)表所在OSS路徑下的一個(gè)子目錄,目錄的命名規(guī)則為分區(qū)列名對(duì)應(yīng)分區(qū)列值。
OSS中一個(gè)目錄結(jié)構(gòu)的示例如下:
oss://xxx...xxx/weatherSchema/weatherTable/
file1.csv
oss://xxx...xxx/weatherSchema/weatherTable/
file2.csv
……
oss://xxx...xxx/weatherSchema/weatherPoint Table/file1.csv
oss://xxx...xxx/weatherSchema/ weatherPointTable/file2.csv
……
oss://xxx...xxx/comtradeSchema/HS0Table/year=2020/month=01/file1.json
oss://xxx...xxx/comtradeSchema/HS0Table/year=
2020/month=01/file2.json
……
oss://xxx...xxx/waterSchema/waterTable/file1.json
oss://xxx...xxx/waterSchema/waterTable/file2.json
OSS作為一個(gè)可以容納多種格式、多種來源數(shù)據(jù)的開放文件系統(tǒng),為了高效地構(gòu)建基于環(huán)境數(shù)據(jù)的數(shù)據(jù)湖,數(shù)據(jù)源路徑需遵循一定的規(guī)范格式。如圖3所示,OSS數(shù)據(jù)源的元信息發(fā)現(xiàn)支持的格式為庫(kù)、表、文件或者庫(kù)、表、分區(qū)、文件的格式,OSS路徑的第一級(jí)對(duì)應(yīng)元信息的schema,第二級(jí)對(duì)應(yīng)table,OSS路徑的子目錄名需要與元信息的表名進(jìn)行映射,如果還存在三級(jí)及以上的目錄則與元信息的分區(qū)對(duì)應(yīng)。
圖3 分區(qū)元數(shù)據(jù)管理存儲(chǔ)策略
以空氣質(zhì)量庫(kù)、聯(lián)合國(guó)貿(mào)易統(tǒng)計(jì)數(shù)據(jù)庫(kù)和水質(zhì)庫(kù)為樣例,在OSS路徑根目錄oss://xxx...xxx/下有3個(gè)子目錄weatherSchema、comtradeSchema、waterSchema分別對(duì)應(yīng)空氣質(zhì)量庫(kù)、貿(mào)易統(tǒng)計(jì)庫(kù)和水質(zhì)庫(kù),其中weatherSchema、waterSchema有二級(jí)OSS子目錄,把oss://xxx...xxx/weatherSchema/weatherTable/與空氣質(zhì)量庫(kù)下的空氣質(zhì)量表建立映射,oss://xxx...xxx/weatherSchema/weatherPointTable/與空氣質(zhì)量檢測(cè)站點(diǎn)表做映射,完成第二級(jí)table級(jí)別的數(shù)據(jù)管理。對(duì)于空氣質(zhì)量數(shù)據(jù)和水質(zhì)數(shù)據(jù)由于只有三級(jí)OSS路徑,最高級(jí)第三級(jí)路徑存儲(chǔ)文件粒度數(shù)據(jù),貿(mào)易統(tǒng)計(jì)數(shù)據(jù)相較于前兩者,在第二級(jí)table之上增加了按年和按月分區(qū),OSS的路徑和元信息的表結(jié)構(gòu)也相應(yīng)增加兩級(jí)。
為驗(yàn)證數(shù)據(jù)轉(zhuǎn)換策略優(yōu)化效果,將原始格式為csv的樣本轉(zhuǎn)換為ORC、Parquet、Avro格式在DLA中進(jìn)行數(shù)據(jù)掃描,然后在存儲(chǔ)空間和查詢速度兩方面進(jìn)行對(duì)比。首先進(jìn)行存儲(chǔ)空間方面的實(shí)驗(yàn),測(cè)試分成3個(gè)樣本,每個(gè)樣本中包含不同年份世界全部匯報(bào)國(guó)家的聯(lián)合國(guó)貿(mào)易統(tǒng)計(jì)數(shù)據(jù):樣本1為2000年,樣本2為2000-2004年,樣本3為2000-2009年。3個(gè)樣本的數(shù)據(jù)格式均為csv,數(shù)據(jù)占用存儲(chǔ)空間分別為3.402 GB、18.248 GB和30.669 GB。
實(shí)驗(yàn)環(huán)境如下:
測(cè)試數(shù)據(jù):聯(lián)合國(guó)貿(mào)易統(tǒng)計(jì)數(shù)據(jù)庫(kù)
數(shù)據(jù)湖:Data Lake Analytics 1.2.0
計(jì)算引擎:Alibaba Cloud AnalyticDB
對(duì)象存儲(chǔ):OSS標(biāo)準(zhǔn)類型
結(jié)構(gòu)化數(shù)據(jù)源:RDS for MySQL 1核1G內(nèi)存通用型
測(cè)試結(jié)果如表3所示。ORC、Avro、Parquet相較于csv在3個(gè)樣本所占用的存儲(chǔ)空間均有優(yōu)化,其中ORC格式占用的存儲(chǔ)空間最小,在3個(gè)樣本上的表現(xiàn)相比csv分別節(jié)省約90.4%、90.3%、90.3%,因此在數(shù)據(jù)湖存儲(chǔ)中選用ORC等格式可以節(jié)約存儲(chǔ)空間。
表3 存儲(chǔ)空間測(cè)試 GB
進(jìn)一步驗(yàn)證幾種格式的查詢速度性能。在上述實(shí)驗(yàn)的基礎(chǔ)上,選取樣本3中編號(hào)為270111的無煙煤和編號(hào)為270112的煙煤兩種煤礦資源數(shù)據(jù)回流到RDS for MySQL結(jié)構(gòu)化數(shù)據(jù)進(jìn)行查詢速度的掃描測(cè)試。測(cè)試結(jié)果如圖4所示。
圖4 數(shù)據(jù)回流性能測(cè)試
由圖可知,ORC、Avro、Parquet三種數(shù)據(jù)格式相比csv格式在數(shù)據(jù)湖掃描速度上均有90%以上提升,其中ORC、Parquet格式掃描速度最快,可節(jié)省約90.1%的查詢時(shí)間。
針對(duì)環(huán)境大數(shù)據(jù)多源異構(gòu)的存儲(chǔ)需求,本文提出了一種基于數(shù)據(jù)湖的環(huán)境大數(shù)據(jù)存儲(chǔ)模型。模型具有整合多種環(huán)境數(shù)據(jù)源的能力,既支持不同類型環(huán)境數(shù)據(jù)的靈活存儲(chǔ),又提供了查詢?cè)L問功能,相較于傳統(tǒng)數(shù)據(jù)湖方案,在DLA的基礎(chǔ)上采用格式轉(zhuǎn)換策略,在存儲(chǔ)空間和掃描速度上達(dá)到優(yōu)化90%以上的效果,可以為下一階段環(huán)境數(shù)據(jù)挖掘分析研究提供數(shù)據(jù)存儲(chǔ)支撐,滿足多樣化、靈活性的數(shù)據(jù)分析需求。