滕 飛
(武警工程大學(xué) 裝備管理與保障學(xué)院,西安 710086)
大數(shù)據(jù)(big data),指無(wú)法在一定時(shí)間范圍內(nèi)用常規(guī)軟件工具進(jìn)行捕捉、管理和處理的數(shù)據(jù)集合,是需要新處理模式才能具有更強(qiáng)的決策力、洞察發(fā)現(xiàn)力和流程優(yōu)化能力的海量、高增長(zhǎng)率和多樣化的信息資產(chǎn).大數(shù)據(jù)具有以下特點(diǎn):(1) 數(shù)據(jù)體量巨大.可以達(dá)到TB、PB 級(jí)別;(2) 數(shù)據(jù)類型繁多,例如網(wǎng)絡(luò)日志、視頻、圖片、地理位置信息等;(3) 處理速度快;(4) 商業(yè)價(jià)值,只要利用合理的分析手段,可以挖掘出數(shù)據(jù)中潛在的商業(yè)價(jià)值.在大數(shù)據(jù)時(shí)代,如何充分挖掘出蘊(yùn)藏于數(shù)據(jù)資源中的價(jià)值正在成為各國(guó) IT 業(yè)界,學(xué)術(shù)界和政府共同關(guān)注的焦點(diǎn)[1].2015年中國(guó)大數(shù)據(jù)市場(chǎng)規(guī)模達(dá)到33.85 億元,2020年大數(shù)據(jù)交易市場(chǎng)規(guī)模達(dá)到540 億元.大數(shù)據(jù)市場(chǎng)不僅規(guī)模大,并且呈現(xiàn)快速增長(zhǎng)趨勢(shì),為了更好地運(yùn)用數(shù)據(jù)資源,目前具有的大數(shù)據(jù)交易平臺(tái)有日本富士通公司的大數(shù)據(jù)交易集市Data plaza、BDEX、貴陽(yáng)大數(shù)據(jù)交易所、數(shù)據(jù)堂等,開發(fā)大數(shù)據(jù)交易平臺(tái)具有重大意義.為解決大數(shù)據(jù)交易中存在的自身數(shù)據(jù)不出門、數(shù)據(jù)交換受制約等問(wèn)題,并為用戶提供查看樣本數(shù)據(jù)、根據(jù)需求篩選數(shù)據(jù)集內(nèi)容等功能,同時(shí)創(chuàng)客可以利用平臺(tái)購(gòu)買數(shù)據(jù)開發(fā)相關(guān)的應(yīng)用,并發(fā)布在本平臺(tái),本文設(shè)計(jì)了一種大數(shù)據(jù)交易集市平臺(tái),并利用Spring MVC 構(gòu)建后臺(tái)整體架構(gòu)開發(fā)出相應(yīng)的原型系統(tǒng).
目前的大數(shù)據(jù)交易平臺(tái)主要的模式有:
(1)提供交易平臺(tái),發(fā)布數(shù)據(jù)目錄,不直接提供數(shù)據(jù).
(2)發(fā)布數(shù)據(jù)目錄,數(shù)據(jù)提供方上傳數(shù)據(jù)并保存.
(3)發(fā)布數(shù)據(jù)目錄,發(fā)布銷售數(shù)據(jù).
(4)提供采集工具,采集公開網(wǎng)頁(yè)數(shù)據(jù),收取服務(wù)費(fèi).
在現(xiàn)有的交易模式中,私有數(shù)據(jù)所有者出于數(shù)據(jù)安全的考慮,擔(dān)心隱私泄露、數(shù)據(jù)被濫用、數(shù)據(jù)被競(jìng)爭(zhēng)對(duì)手利用,往往不愿意交換自己擁有的數(shù)據(jù).同時(shí)在不同的行業(yè)和專業(yè)領(lǐng)域之間,彼此難以相互了解對(duì)方的數(shù)據(jù),靠數(shù)據(jù)目錄使得數(shù)據(jù)難以發(fā)揮自身的價(jià)值.本文提出的大數(shù)據(jù)交易集市平臺(tái)是基于各方的分布式數(shù)據(jù)和應(yīng)用建立和運(yùn)營(yíng)一個(gè)公信的數(shù)據(jù)和應(yīng)用服務(wù)交易平臺(tái),本系統(tǒng)可以為數(shù)據(jù)機(jī)構(gòu)提供數(shù)據(jù)和應(yīng)用交易樞紐代理,如圖1所示.主要特點(diǎn)如下.
圖1 數(shù)據(jù)和應(yīng)用交易樞紐圖
(1)數(shù)據(jù)由提供者存儲(chǔ)和管理:數(shù)據(jù)交易集市不直接管理數(shù)據(jù),誰(shuí)的數(shù)據(jù)誰(shuí)控制,數(shù)據(jù)請(qǐng)求發(fā)生時(shí)由數(shù)據(jù)代理根據(jù)需求從數(shù)據(jù)所有者獲取數(shù)據(jù)交給需求方.數(shù)據(jù)提供者可將數(shù)據(jù)保存自己公司的服務(wù)器上,或保存到本系統(tǒng)提供的Hive 集群中,當(dāng)發(fā)生交易時(shí),系統(tǒng)擁有權(quán)限,通過(guò)相應(yīng)的API 接口獲取服務(wù)器中的數(shù)據(jù)集.
(2)提供數(shù)據(jù)樣本數(shù)據(jù):用戶可以在數(shù)據(jù)商城查看樣本數(shù)據(jù)集,進(jìn)一步了解數(shù)據(jù)商品.
(3)篩選數(shù)據(jù)集內(nèi)容功能:用戶可以根據(jù)需求選擇需要的字段,過(guò)濾掉數(shù)據(jù)集中無(wú)價(jià)值的信息.
(4)數(shù)據(jù)應(yīng)用可開發(fā):提供數(shù)據(jù)應(yīng)用開發(fā)環(huán)境,滿足基于大數(shù)據(jù)的創(chuàng)新應(yīng)用需求.
大數(shù)據(jù)交易集市原型系統(tǒng)的總體規(guī)劃如圖2所示.
圖2 系統(tǒng)總體規(guī)劃圖
使用大數(shù)據(jù)交易集市平臺(tái)的有數(shù)據(jù)機(jī)構(gòu)(數(shù)據(jù)商品的提供方)、創(chuàng)客(應(yīng)用程序的開發(fā)者)、客戶.
數(shù)據(jù)機(jī)構(gòu)可以將擁有的數(shù)據(jù)發(fā)布到平臺(tái)的數(shù)據(jù)商城中進(jìn)行交易,同時(shí)把數(shù)據(jù)集中部分?jǐn)?shù)據(jù)作為樣本數(shù)據(jù)加入到平臺(tái)的樣本庫(kù)中,創(chuàng)客通過(guò)查看樣本數(shù)據(jù),決定是否購(gòu)買相應(yīng)的數(shù)據(jù)集.數(shù)據(jù)機(jī)構(gòu)也可以利用自身?yè)碛械臄?shù)據(jù)的優(yōu)勢(shì)開發(fā)應(yīng)用程序,開發(fā)出的應(yīng)用程序可以發(fā)布到平臺(tái)的應(yīng)用商城中,客戶通過(guò)應(yīng)用商城購(gòu)買需要的應(yīng)用.
交易平臺(tái)會(huì)對(duì)數(shù)據(jù)機(jī)構(gòu)提供的數(shù)據(jù)集、應(yīng)用程序進(jìn)行審核,審核通過(guò)后才會(huì)發(fā)布到商城中交易,這樣有效避免數(shù)據(jù)集中存在違法數(shù)據(jù)等問(wèn)題.
大數(shù)據(jù)交易集市平臺(tái)的軟件架構(gòu)設(shè)計(jì)如圖3所示.軟件架構(gòu)從上至下可以分為3 層,分別是SaaS 層[2]、PaaS 層[3]和IaaS 層[4],下面進(jìn)行詳細(xì)的介紹.
圖3 軟件架構(gòu)圖
SaaS 層:給用戶提供的能力是使用在云基礎(chǔ)架構(gòu)上運(yùn)行的云服務(wù)提供商的應(yīng)用程序.本系統(tǒng)的SasS 層中包含前臺(tái)、后臺(tái)管理系統(tǒng)、應(yīng)用沙箱.
PaaS 層:平臺(tái)即服務(wù)作為云計(jì)算的一種,是將基礎(chǔ)設(shè)施平臺(tái)作為一種服務(wù)呈現(xiàn)給用戶的商業(yè)模式,是一種低成本的方案[5].可以讓用戶使用由云服務(wù)提供商支持的編程語(yǔ)言、庫(kù)和開發(fā)工具等開發(fā)應(yīng)用程序,并在相應(yīng)的基礎(chǔ)設(shè)施上部署.本系統(tǒng)的PaaS 層主要包含緩存模塊、文件上傳下載模塊等.
IaaS 層:它將硬件資源以服務(wù)的方式提供給云平臺(tái)服務(wù)開發(fā)商,這樣就對(duì)后者屏蔽了基礎(chǔ)設(shè)施的異構(gòu)性[6].用戶可以在云服務(wù)提供商提供的基礎(chǔ)設(shè)施上部署和運(yùn)行任何軟件.本系統(tǒng)的IaaS 層主要實(shí)現(xiàn)虛擬化、資源調(diào)度、安全管理等功能,硬件上有X86 集群、小型集群等.
下面介紹大數(shù)據(jù)交易集市主要的兩個(gè)業(yè)務(wù)場(chǎng)景.
業(yè)務(wù)場(chǎng)景一:數(shù)據(jù)發(fā)布和服務(wù)代理請(qǐng)求數(shù)據(jù),如圖4所示.本系統(tǒng)實(shí)現(xiàn)該功能可以分為以下幾步.
圖4 數(shù)據(jù)發(fā)布和服務(wù)代理請(qǐng)求調(diào)用數(shù)據(jù)圖
(1)數(shù)據(jù)交易集市為數(shù)據(jù)機(jī)構(gòu)A和B 部署交易端,包括數(shù)據(jù)應(yīng)用運(yùn)行容器及數(shù)據(jù)審計(jì)網(wǎng)關(guān);
(2)數(shù)據(jù)機(jī)構(gòu)A和B 開發(fā)可交易數(shù)據(jù)接口;
(3)數(shù)據(jù)機(jī)構(gòu)A和B 通過(guò)代理注冊(cè)可交易的數(shù)據(jù),并通過(guò)數(shù)據(jù)采集接口提供樣本數(shù)據(jù);
(4)數(shù)據(jù)請(qǐng)求方通過(guò)注冊(cè)功能進(jìn)行數(shù)據(jù)檢索、察看樣本,找到需求數(shù)據(jù);
(5)請(qǐng)求方接受數(shù)據(jù)使用條款;
(6)代理將數(shù)據(jù)提取應(yīng)用部署至數(shù)據(jù)所有者側(cè)A和B,啟動(dòng)應(yīng)用對(duì)數(shù)據(jù)進(jìn)行處理;
(7)處理結(jié)果經(jīng)A和B 過(guò)濾、審計(jì)后再傳回代理;
(8)如果有多個(gè)數(shù)據(jù)源返回結(jié)果,代理對(duì)結(jié)果進(jìn)行過(guò)濾、融合處理(過(guò)濾和審計(jì)操作按交易條件可選);
(9)代理將結(jié)果傳回請(qǐng)求方.
業(yè)務(wù)場(chǎng)景二:應(yīng)用的測(cè)試發(fā)布、數(shù)據(jù)和應(yīng)用服務(wù)請(qǐng)求及處理,如圖5.本系統(tǒng)實(shí)現(xiàn)該功能步驟如下.
圖5 應(yīng)用的測(cè)試發(fā)布、數(shù)據(jù)和應(yīng)用服務(wù)請(qǐng)求及處理圖
(1) 開發(fā)者提出開發(fā)請(qǐng)求;
(2)開發(fā)者利用樣本數(shù)據(jù)在應(yīng)用沙盒中進(jìn)行數(shù)據(jù)處理功能和安全性測(cè)試;
(3)數(shù)據(jù)交易集市對(duì)提交的應(yīng)用進(jìn)行安全和可用性測(cè)試后發(fā)布至應(yīng)用商店;
(4)數(shù)據(jù)交易代理將該應(yīng)用部署至數(shù)據(jù)所有者側(cè)并完成初始化,等待用戶調(diào)用.
Spring MVC 框架實(shí)際上是Spring 框架中的Spring Web MVC 模塊[7].其作為Spring Framework的后續(xù)產(chǎn)品,融合在Spring Web Flow 里面.Spring MVC可以提供MVC (model view controller)軟件開發(fā)模式,并且支持IOC和AOP.
Hive 由Facebook 開發(fā),是一種構(gòu)建于 Hadoop[8]集群之上的數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用,旨在實(shí)現(xiàn) Hadoop 上的數(shù)據(jù)操作與傳統(tǒng) SQL的結(jié)合[9].在Hadoop 中用來(lái)處理結(jié)構(gòu)化數(shù)據(jù).開發(fā)人員直接使用Hadoop 會(huì)面臨學(xué)習(xí)成本太高、項(xiàng)目周期要求太短、MapReduce[10]實(shí)現(xiàn)復(fù)雜查詢邏輯開發(fā)難度大等問(wèn)題.Hive 通過(guò)將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供類 SQL 查詢接口,本質(zhì)是將 SQL 轉(zhuǎn)換為MapReduce 程序,提供快速開發(fā)的能力,有效減少開發(fā)人員的學(xué)習(xí)成本.
在本文提出的大數(shù)據(jù)交易模式中,由數(shù)據(jù)提供方在大數(shù)據(jù)交易集市平臺(tái)上發(fā)布數(shù)據(jù)及相關(guān)的應(yīng)用,數(shù)據(jù)需求方根據(jù)需要在平臺(tái)購(gòu)買相應(yīng)的數(shù)據(jù)集或服務(wù),如圖6所示.
圖6 總體實(shí)施方案圖
數(shù)據(jù)交易集市有前臺(tái)和后臺(tái)管理系統(tǒng)組成.前臺(tái)主要模塊是門戶模塊,該模塊又可以分為多個(gè)子模塊,下面詳細(xì)介紹幾個(gè)主要的功能模塊.
(1)數(shù)據(jù)商城模塊實(shí)現(xiàn)數(shù)據(jù)商城列表、商品詳情.展示數(shù)據(jù)機(jī)構(gòu)發(fā)布的所有數(shù)據(jù)商品,方便有需求的買家挑選購(gòu)買.
(2)應(yīng)用商城模塊實(shí)現(xiàn)應(yīng)用商城列表、商品詳情.展示創(chuàng)客發(fā)布的所有應(yīng)用商品,方便有需求的買家挑選購(gòu)買.
(3)API 商城模塊實(shí)現(xiàn)API 商城列表、商品詳情.展示商家發(fā)布的所有API 商品,方便有需求的買家挑選購(gòu)買.
(4)個(gè)人中心模塊實(shí)現(xiàn)個(gè)人信息、用戶認(rèn)證、賬戶安全、白名單管理、消息通知等功能.
(5)購(gòu)物車模塊,用戶購(gòu)物活動(dòng)中的購(gòu)物車,類似在淘寶、京東中的作用.
(6)買家中心模塊實(shí)現(xiàn)管理已購(gòu)數(shù)據(jù)、已購(gòu)應(yīng)用、已購(gòu)API.
(7)賣家中心功能有統(tǒng)計(jì)分析、已售數(shù)據(jù)、已售應(yīng)用、已售API、數(shù)據(jù)發(fā)布、應(yīng)用發(fā)布、API 發(fā)布、應(yīng)用鑒權(quán)等.
(8)數(shù)據(jù)和應(yīng)用發(fā)布,展現(xiàn)賣家發(fā)布的數(shù)據(jù)和應(yīng)用商品情況列表,支持用戶發(fā)布數(shù)據(jù)和應(yīng)用商品,通過(guò)審核以及數(shù)據(jù)機(jī)構(gòu)應(yīng)用鑒權(quán)后,可上架銷售.
后臺(tái)管理系統(tǒng)由3 部分組成,其中數(shù)據(jù)及應(yīng)用注冊(cè)模塊,主要實(shí)現(xiàn)數(shù)據(jù)集及應(yīng)用的定義及發(fā)布、元數(shù)據(jù)管理、抽樣數(shù)據(jù)管理、數(shù)據(jù)交易記錄等功能.數(shù)據(jù)代理模塊,數(shù)據(jù)代理是數(shù)據(jù)交易的核心功能,主要實(shí)現(xiàn)數(shù)據(jù)應(yīng)用的部署及清理、需求數(shù)據(jù)獲取及返回結(jié)果過(guò)濾或合并等.
應(yīng)用管理模塊,主要為應(yīng)用開發(fā)者提供開發(fā)環(huán)境及上線應(yīng)用的管理等功能.其中應(yīng)用沙箱主要用于應(yīng)用開發(fā),開發(fā)者可以在應(yīng)用沙箱中利用樣本數(shù)據(jù)進(jìn)行應(yīng)用開發(fā),測(cè)試完成的應(yīng)用可通過(guò)發(fā)布功能在應(yīng)用商店進(jìn)行發(fā)布.
編程語(yǔ)言:Java;開發(fā)工具:STS (Spring tools suite);操作系統(tǒng):Windows 10;數(shù)據(jù)庫(kù):MySQL 5.7;JDK 版本:JDK 1.8 版本;瀏覽器:Google Chrome;機(jī)器:Lenovo ThinkPad T470;內(nèi)存:4 GB 以上;硬盤:500 GB 以上;集群環(huán)境:Hadoop/Hive 集群是由 5 臺(tái)與單機(jī)服務(wù)器組成.每臺(tái)服務(wù)器上安裝Ubuntu 系統(tǒng),并安裝配置Hadoop-2.7.3和Hive1.2.
數(shù)據(jù)交易集市平臺(tái)采用前端分離的模式開發(fā),整個(gè)系統(tǒng)有3 個(gè)子項(xiàng)目組成,datamarket (大數(shù)據(jù)交易集市門戶系統(tǒng))、bjmarketportal (大數(shù)據(jù)交易集市后臺(tái)管理系統(tǒng))、datamarketReact (大數(shù)據(jù)交易集市前端頁(yè)面).如圖7,datamarket和bjmarketportal 通過(guò)RESTful API和datamarketReact 頁(yè)面進(jìn)行交互.后臺(tái)使用Java 語(yǔ)言在STS 中開發(fā).前端頁(yè)面系統(tǒng)datamarketReact 采用React 框架[11]開發(fā),使用webpack 前端構(gòu)建工具,采用es2016 新一代JavaScript 編碼模式,頁(yè)面中的圖表展示使用到echarts,前端可以通過(guò)后臺(tái)的RESTful API與后臺(tái)進(jìn)行交互.
圖7 工程架構(gòu)圖
后臺(tái)部分使用Spring MVC 框架構(gòu)建項(xiàng)目整體架構(gòu),并采用了經(jīng)典的Web 3 層架構(gòu)模型,MVC 模式把應(yīng)用程序拆分成3 個(gè)部分:模型,視圖和控制器[12].即從高到低次是Controller 層、Service 層和Dao 層,下面進(jìn)行詳細(xì)的介紹.
本項(xiàng)目在開發(fā)中,通過(guò)在STS 中配置maven-3.5.0實(shí)現(xiàn)對(duì)Jar 包的管理,并在maven[13]的配置文件settings.xml 中完成指定本地倉(cāng)庫(kù)地址,設(shè)置阿里云鏡像,部分代碼如下所示.通過(guò)maven 避免了開發(fā)人員手工添加Jar 包和Jar 包版本沖突的問(wèn)題.
<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror>
在傳統(tǒng)的單體架構(gòu)[14]中,登錄用戶的信息往往保存在session[15]中,當(dāng)?shù)卿浻脩粼龆嗖粌H會(huì)增加服務(wù)器的壓力,同時(shí)在分布式應(yīng)用上,會(huì)限制負(fù)載均衡器的能力和應(yīng)用的擴(kuò)展性,本項(xiàng)目采用基于JWT (JSON Web token)[16]的認(rèn)證方式,通過(guò)pom.xml 文件實(shí)現(xiàn)在Spring MVC 框架中集成JWT.
在數(shù)據(jù)庫(kù)的操作方面,MyBatis的優(yōu)勢(shì)在于利用配置文件,不需要在代碼中編寫SQL 語(yǔ)句[17].MyBatis Generator 插件可以根據(jù)表結(jié)構(gòu)生成JavaBean.本系統(tǒng)實(shí)現(xiàn)了Spring MVC和MyBatis、MyBatis Generator的集成.pom.xml 配置文件部分代碼如下:
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis.spring.version}</version></dependency>
大數(shù)據(jù)集往往需求較大的存儲(chǔ)空間,為滿足業(yè)務(wù)需求,本系統(tǒng)使用MySQL 保存用戶信息、商品詳情、樣本數(shù)據(jù)等信息,使用Hive 保存存儲(chǔ)數(shù)據(jù)公司提供的數(shù)據(jù)集.
在接口測(cè)試方面,實(shí)現(xiàn)了Spring MVC和Swagger框架的集成,Swagger是一個(gè)簡(jiǎn)單又強(qiáng)大的RESTful 風(fēng)格的API 生成文檔工具.pom.xml 配置文件部分代碼如下:
?
項(xiàng)目在Spring MVC 框架中還集成了分頁(yè)插件pagehelper、lombok、Redis 等技術(shù).
在大數(shù)據(jù)交易集市平臺(tái)中,用戶瀏覽數(shù)據(jù)商城,查看樣本數(shù)據(jù)集,以及查看個(gè)人信息等操作都會(huì)涉及到對(duì)數(shù)據(jù)庫(kù)進(jìn)行I/O 操作.當(dāng)用戶訪問(wèn)量增大,對(duì)數(shù)據(jù)庫(kù)會(huì)進(jìn)行頻繁的讀寫操作,系統(tǒng)在性能上會(huì)出現(xiàn)瓶頸,本文采用NoSQL 技術(shù)解決這一問(wèn)題.Redis[18]是現(xiàn)在最受歡迎的NoSQL 數(shù)據(jù)庫(kù)[19]之一,Redis 包含多種數(shù)據(jù)結(jié)構(gòu)、支持網(wǎng)絡(luò)、基于內(nèi)存、可選持久性的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù).本文采用Redis 實(shí)現(xiàn)系統(tǒng)的高訪問(wèn)機(jī)制,當(dāng)用戶從系統(tǒng)獲取數(shù)據(jù)時(shí),系統(tǒng)會(huì)首先從Redis 中查找,如果沒(méi)有找到,再?gòu)臄?shù)據(jù)庫(kù)中讀取,有效提高系統(tǒng)讀取數(shù)據(jù)的性能,緩解數(shù)據(jù)庫(kù)訪問(wèn)壓力,過(guò)程如圖8所示.
圖8 Redis 緩存機(jī)制
3.5.1 RESTful API 介紹
API (application programming interface,應(yīng)用程序編程接口)[20]用來(lái)提供應(yīng)用程序與開發(fā)人員基于某軟件得以訪問(wèn)的一組例程,而開發(fā)人員無(wú)需關(guān)心其內(nèi)部工作機(jī)制的細(xì)節(jié).在REST (representational state transfer)中每個(gè)資源由URI 標(biāo)識(shí),RESTful[21]是一種架構(gòu)的規(guī)范與約束,通過(guò)POST,GET,PUT,DELETE 操作對(duì)資源進(jìn)行CRUD[22]操作.
3.5.2 權(quán)限驗(yàn)證流程
系統(tǒng)提供的所有API 必須通過(guò)認(rèn)證鑒權(quán)才可使用.權(quán)限驗(yàn)證流程如圖9所示.用戶登錄系統(tǒng)時(shí),前端會(huì)向后端傳入登錄驗(yàn)證信息,如表1所示.
表1 用戶登錄信息表
圖9 權(quán)限驗(yàn)證流程圖
驗(yàn)證成功后,服務(wù)器端會(huì)生成Token.之后將Token和該用戶的權(quán)限保存到Redis 中,如表2所示.
表2 Token 信息表
本系統(tǒng)的Token 由隨機(jī)字符串、用戶名稱、時(shí)間戳拼接后md5 摘要生成,60 min 過(guò)期.
3.5.3 接口設(shè)計(jì)
接口數(shù)據(jù)傳輸采用HTTP 協(xié)議,提交和返回?cái)?shù)據(jù)都為JSON 格式[23],并統(tǒng)一采用UTF-8 字符編碼.Spring MVC 框架中使用@RequestBody 注解把前端發(fā)送的JSON 字符串轉(zhuǎn)為Java 對(duì)象,使用@ResponseBody注解把后臺(tái)Java 對(duì)象轉(zhuǎn)換JSON 字符串.在返回?cái)?shù)據(jù)方面,失敗時(shí)re_message 字段返回失敗原因.下面通過(guò)本系統(tǒng)的后臺(tái)管理bjmarketportal 項(xiàng)目中數(shù)據(jù)商品管理模塊詳細(xì)介紹API 接口的設(shè)計(jì).數(shù)據(jù)商品管理模塊主要實(shí)現(xiàn)數(shù)據(jù)商品信息維護(hù),數(shù)據(jù)商品審核、發(fā)布等功能.數(shù)據(jù)商品管信息管理模塊的API 接口設(shè)計(jì)如表3.
表3 數(shù)據(jù)商品管理模塊接口
下面重點(diǎn)介紹其中的根據(jù)id 查詢數(shù)據(jù)商品詳情,接口鏈接地址:/api/v1/ datacommodity{id},id是用戶從前端提交的請(qǐng)求參數(shù),請(qǐng)求方式是GET 類型,后端根據(jù)商品的id 從數(shù)據(jù)庫(kù)中查找商品詳情信息,如表4.
表4 數(shù)據(jù)商品表
查詢結(jié)果會(huì)以成JSON 格式發(fā)送到前端頁(yè)面,當(dāng)查詢成功時(shí)返回結(jié)果如下所示:
{“data_commodity_id”:12,“data_set_commodity_name”:全國(guó)天氣數(shù)據(jù)集,“data_charge_type_code”:“2”,“img”:“nofile”,“file”:“nofile”,“data_charge_price”:“950”,“data_desc1”:“全國(guó)天氣數(shù)據(jù)集簡(jiǎn)介”,“data_desc2”:“可以按照日期和城市查詢天氣數(shù)據(jù)”,“data_desc3”:“天氣預(yù)報(bào),應(yīng)急救災(zāi)”,“data_desc4”:“數(shù)據(jù)分析,機(jī)器學(xué)習(xí)”,“example_is_download”:“1”,“data_type”:“txt 文本”,“data_single”:“1”,“sale_counts”:150}
后臺(tái)執(zhí)行成功,將數(shù)據(jù)添加到數(shù)據(jù)庫(kù)中,如果執(zhí)行失敗,會(huì)將失敗信息以JSON 格式發(fā)送到前端,如下:
?
數(shù)據(jù)集購(gòu)買功能位于datamarket 項(xiàng)目的數(shù)據(jù)商城模塊中,數(shù)據(jù)商品可以按照行業(yè)分為政府、醫(yī)療、金融、電商、汽車、房地產(chǎn)、教育、旅游等.大數(shù)據(jù)具有量大、價(jià)值密度低的特點(diǎn),用戶在使用數(shù)據(jù)集進(jìn)行數(shù)據(jù)分析、開發(fā)應(yīng)用軟件時(shí),往往不會(huì)使用到數(shù)據(jù)集中的所有數(shù)據(jù),需要清除掉無(wú)價(jià)值的信息,本系統(tǒng)在購(gòu)買數(shù)據(jù)商品功能基礎(chǔ)上,提供查看樣本數(shù)據(jù)、按照字段篩選數(shù)據(jù)等功能.
數(shù)據(jù)機(jī)構(gòu)首先上傳數(shù)據(jù)商品的詳情信息和樣本數(shù)據(jù),后臺(tái)管理員審核通過(guò)后,會(huì)將數(shù)據(jù)商品發(fā)布到數(shù)據(jù)商城中.創(chuàng)客根據(jù)自身需求,查看數(shù)據(jù)商品詳情和樣本數(shù)據(jù),選擇合適的數(shù)據(jù)商品,完成支付后,可以下載相應(yīng)的數(shù)據(jù)集,并且可以使用數(shù)據(jù)商城提供的數(shù)據(jù)篩選功能去除數(shù)據(jù)集中無(wú)價(jià)值的信息.下面通過(guò)數(shù)據(jù)機(jī)構(gòu)A 提供的全國(guó)天氣數(shù)據(jù)集National_weather_data 詳細(xì)介紹數(shù)據(jù)商品購(gòu)買功能.
全國(guó)天氣數(shù)據(jù)集National_weather_data 記錄了2000年到2018年全國(guó)各個(gè)城市每一天的天氣數(shù)據(jù),每條記錄字段包含:城市、日期、天氣狀況、最高氣溫、最低氣溫、風(fēng)力風(fēng)向,如表5所示.
表5 全國(guó)天氣數(shù)據(jù)樣例表
數(shù)據(jù)機(jī)構(gòu)A 首先上傳該數(shù)據(jù)集的詳情信息和對(duì)應(yīng)的樣本數(shù)據(jù).數(shù)據(jù)機(jī)構(gòu)首先創(chuàng)建樣本數(shù)據(jù)集對(duì)應(yīng)的表結(jié)構(gòu),填寫每個(gè)字段名稱、字段的數(shù)據(jù)類型等,如圖10.
圖10 設(shè)置樣本數(shù)據(jù)集
數(shù)據(jù)機(jī)構(gòu)A 提交信息后,后臺(tái)會(huì)在MySQL 數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)的表,使用MyBatis 框架實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建表結(jié)構(gòu),把樣本數(shù)據(jù)名稱作為表名,字段名稱和數(shù)據(jù)類型作為表的屬性和相應(yīng)的數(shù)據(jù)類型.之后數(shù)據(jù)機(jī)構(gòu)A 在系統(tǒng)中填寫樣本數(shù)據(jù)表記錄,樣本數(shù)據(jù)表的記錄行數(shù)一般在10-50 行之間,部分代碼如下:
?
系統(tǒng)管理員會(huì)對(duì)數(shù)據(jù)商品的介紹信息和樣本數(shù)據(jù)內(nèi)容進(jìn)行審核,檢查數(shù)據(jù)商品是否符合商城的規(guī)定,有無(wú)違法信息,審核通過(guò)后授權(quán)數(shù)據(jù)機(jī)構(gòu)向Hive 集群上傳數(shù)據(jù)商品.
為確保數(shù)據(jù)提供者的數(shù)據(jù)安全性,系統(tǒng)會(huì)向數(shù)據(jù)提供者提供Hive 集群資源,數(shù)據(jù)提供者可以上傳、修改、查看、刪除數(shù)據(jù)集,數(shù)據(jù)機(jī)構(gòu)和客戶達(dá)成購(gòu)買協(xié)議,并完成交易后,數(shù)據(jù)交易集市才可以獲得相應(yīng)數(shù)據(jù)集的獲取權(quán)限,數(shù)據(jù)代理根據(jù)需求從數(shù)據(jù)所有者獲取數(shù)據(jù)交給客戶.下面通過(guò)national_weather_data 數(shù)據(jù)集進(jìn)行詳細(xì)介紹.
數(shù)據(jù)機(jī)構(gòu)A 將數(shù)據(jù)集中的數(shù)據(jù)保存到txt 文件中,命名為national_weather_data.txt,文件中每一行代表一條數(shù)據(jù)記錄,每條數(shù)據(jù)記錄中的一列代表一個(gè)屬性值,每個(gè)屬性之間用英文逗號(hào)隔開.當(dāng)數(shù)據(jù)商品詳情和樣本數(shù)據(jù)被后臺(tái)管理員審核通過(guò)后,會(huì)通過(guò)數(shù)據(jù)商城的API 接口將national_weather_data.txt 中的數(shù)據(jù)導(dǎo)入到Hive 集群中管理,過(guò)程如圖11所示.
圖11 數(shù)據(jù)機(jī)構(gòu)上傳數(shù)據(jù)商品圖
Hive 集群保存數(shù)據(jù)集的過(guò)程如下:
(1)表名以及表中的字段名稱和樣本數(shù)據(jù)表national_weather_data 相對(duì)應(yīng),MySQL 中的字段數(shù)據(jù)類型,VARCHAR和FLOAT 分別對(duì)應(yīng)Hive 中的string和int 類型.
(2)為保證數(shù)據(jù)集內(nèi)容的充足性,系統(tǒng)輸出審計(jì)功能會(huì)檢查txt 文件的行數(shù),當(dāng)行數(shù)小于100 行時(shí),停止上傳數(shù)據(jù),并反饋數(shù)據(jù)機(jī)構(gòu)數(shù)據(jù)量過(guò)小,不符合要求.同時(shí)隨機(jī)抽取其中5 行記錄供管理員查看,審查其內(nèi)容是否符合數(shù)據(jù)商品的詳情描述,部分代碼如下:
if [${BEFOR_VALUE}-lt 100 ];then echo "`date`-FAILURE count(*)=$BEFOR_VALUE"echo "FAILURE"
(3)數(shù)據(jù)機(jī)構(gòu)向管理員提供Hive 表的分區(qū)字段,national_weather_data 表的分區(qū)字段是year和city.
(4)后臺(tái)程序生成建表語(yǔ)句,如下所示,在Hive 集群中建立表結(jié)構(gòu).
create table national_weather_data(year string,date string,city string,maximum_temperature int,minimum_temperature int,weather string,wind_direction string,wind_rating int,)PARTITIONED BY (`year` string,`city` string)ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' NULL DEFINED AS ''STORED AS TEXTFILE;
(5)執(zhí)行導(dǎo)數(shù)腳本,把txt 文件中保存的數(shù)據(jù)導(dǎo)入到Hive 集群中,執(zhí)行腳本時(shí)需要傳遞3 個(gè)參數(shù),table_name表名,year年份,city 城市.
LOAD DATA LOCAL INPATH '${FILE_NAME}' OVERWRITE INTO TABLE ${table_name} partition (year='${YEAR}',city='${CITY }');"
(6)數(shù)據(jù)集上傳結(jié)束后,為確保數(shù)據(jù)集上傳成功,系統(tǒng)審計(jì)功能會(huì)檢查上傳到Hive 中的數(shù)據(jù)集行數(shù),如果小于txt 文件的行數(shù),則向數(shù)據(jù)機(jī)構(gòu)反饋,數(shù)據(jù)上傳失敗.部分代碼如下:
echo "hive table rows:$AFTER_VALUE"if [$AFTER_VALUE-ne $BEFOR_VALUE ];then echo "`date`-FAILURE:AFTER_VALUE(*)=$AFTER_VALUE<>BEFOR_VALUE(*)=$BEFOR_VALUE "echo "FAILURE"current_2=`date+%s`current_dura=`expr $current_2-$current_1`
數(shù)據(jù)商城提供數(shù)據(jù)集的信息篩選功能,客戶可以根據(jù)數(shù)據(jù)集的字段選擇需要的數(shù)據(jù),去除無(wú)用的數(shù)據(jù)項(xiàng),如圖12所示.后臺(tái)系統(tǒng)會(huì)根據(jù)用戶選擇的字段生成HQL[24]語(yǔ)句,從Hive 集群中將相應(yīng)的數(shù)據(jù)導(dǎo)出到txt 文件中,之后用戶可以下載相應(yīng)的txt 文件.在商品支付方面,創(chuàng)客可以通過(guò)支付寶、微信、網(wǎng)銀等手段完成支付,這個(gè)過(guò)程類似淘寶、京東等網(wǎng)站商城.
圖12 選擇需要的字段
用戶注冊(cè)如果想要成為買家、賣家、創(chuàng)客等,就需要進(jìn)一步認(rèn)證.認(rèn)證通過(guò)后,用戶就擁有購(gòu)買、使用商品的權(quán)限,可以發(fā)布、管理商品,甚至成為一名平臺(tái)創(chuàng)客,申請(qǐng)創(chuàng)客空間資源,開發(fā)、測(cè)試、運(yùn)行應(yīng)用.認(rèn)證分為個(gè)人認(rèn)證和企業(yè)認(rèn)證.
企業(yè)認(rèn)證需要用戶提供公司名稱、地址、三證合一號(hào)碼、營(yíng)業(yè)執(zhí)照副本,以及運(yùn)營(yíng)者姓名、身份證號(hào)、聯(lián)系方式、持證照正反面等信息,如圖13所示,如確認(rèn)用戶信息真實(shí)有效,提出申請(qǐng)后7 個(gè)工作日內(nèi)就會(huì)得到回復(fù).如被駁回,按照駁回原因,重新修改提交.
圖13 企業(yè)認(rèn)證
下面詳細(xì)介紹企業(yè)認(rèn)證功能的實(shí)現(xiàn).用戶點(diǎn)擊提交按鈕后,前端會(huì)調(diào)用bjmarketportal 項(xiàng)目中的企業(yè)認(rèn)證接口,接口地址是/api/v1/enterprisecertification,訪問(wèn)方式是POST,表單中的數(shù)據(jù)會(huì)以JSON 格式發(fā)送到后臺(tái).bjmarketportal 中實(shí)現(xiàn)企業(yè)認(rèn)證功能的代碼由Controller層、Service 層、Dao 層、Pojo (plain ordinary Java object)、Vo (value object)等幾部分組成,下面詳細(xì)介紹后臺(tái)企業(yè)認(rèn)證功能的實(shí)現(xiàn).
Pojo:Pojo 類可方便開發(fā)人員使用數(shù)據(jù)庫(kù)中的數(shù)據(jù)表.通過(guò)MyBatis Generator 插件從MySQL 數(shù)據(jù)庫(kù)中生成企業(yè)認(rèn)證信息表對(duì)應(yīng)的Pojo 類—CorporateInformation.
Vo:常用于業(yè)務(wù)層之間的數(shù)據(jù)傳遞,可以用于封裝從頁(yè)面表單提交的數(shù)據(jù).該模塊中Enterprise CertificationVo類用于封裝企業(yè)認(rèn)證表單數(shù)據(jù).
Controller 層:接收客戶端的請(qǐng)求,然后調(diào)用Service層業(yè)務(wù)邏輯,獲取到數(shù)據(jù),傳遞數(shù)據(jù)給視圖.Corporate Information Controller 類對(duì)應(yīng)該模塊Controller 層代碼.類中使用@Autowired 注解實(shí)現(xiàn)Service 層Corporate Information Service 對(duì)象的自動(dòng)裝配;并創(chuàng)建enterprise Certification 方法實(shí)現(xiàn)企業(yè)認(rèn)證功能,通過(guò)@Request Mapping 注解,設(shè)置該方法的訪問(wèn)路徑/api/v1/user Center/enterprisecertification,訪問(wèn)方式是POST.
Service 層:用于實(shí)現(xiàn)模塊中的業(yè)務(wù)邏輯Corporate-InformationService 類對(duì)應(yīng)該模塊的Service 層代碼,通過(guò)@Service 注解聲明其是一個(gè)Service 類,并自動(dòng)注冊(cè)到Spring 容器中;通過(guò)@Autowired 獲取Dao 層CorporateInformationMapper 對(duì)象;certification 方法實(shí)現(xiàn)企業(yè)認(rèn)證功能.
Dao 層:負(fù)責(zé)模塊中數(shù)據(jù)庫(kù)操作,CorporateInformationMapper 類對(duì)應(yīng)該模塊中的Dao 層代碼,采用MyBatis 框架實(shí)現(xiàn),通過(guò)@Mapper 注解其是一個(gè)Dao層類,并交給Spring 容器管理,同時(shí)省去了mapper 映射文件的書寫.該模塊部分代碼如下:
@Controller@RequestMapping(value="/mail/userCenter")public class CorporateInformationController extends BaseController<Object>{@Autowired private SandboxieService sandboxieService;@Autowired private CorporateInformationService corporateInformationService;@Autowired private DataShopService dataShopService;@RequestMapping(value="enterprisecertification",method=RequestMethod.POST)@ResponseBody public String enterpriseCertification(EnterpriseCertificationVo enterpriseCertificationVo,HttpServletResponse response) throws Exception {String enterpriseName=enterpriseCertificationVo.getEnterpriseName();
if (corporateInformationService.isEnterprise(enterpriseName)) {…}…}
本文設(shè)計(jì)的大數(shù)據(jù)交易集市平臺(tái),通過(guò)向數(shù)據(jù)機(jī)構(gòu)提供公用的Hive 集群資源,實(shí)現(xiàn)數(shù)據(jù)交易集市不存儲(chǔ)數(shù)據(jù),數(shù)據(jù)由提供者存儲(chǔ)和管理,在商城發(fā)布數(shù)據(jù)商品的詳情信息、樣例數(shù)據(jù)供客戶查看,由數(shù)據(jù)代理獲取數(shù)據(jù)交給需求方,有效解決了數(shù)據(jù)交易中私有數(shù)據(jù)持有者擔(dān)心數(shù)據(jù)泄露,不愿意分享數(shù)據(jù)的問(wèn)題.同時(shí)設(shè)計(jì)出數(shù)據(jù)發(fā)布和服務(wù)代理請(qǐng)求數(shù)據(jù)、應(yīng)用的測(cè)試發(fā)布、應(yīng)用服務(wù)請(qǐng)求業(yè)務(wù)流程.并在此基礎(chǔ)上使用Spring MVC 框架,并集成了MyBatis、Swagger 等技術(shù)開發(fā)實(shí)現(xiàn)了大數(shù)據(jù)交易集市平臺(tái),利用Redis 解決系統(tǒng)在高并發(fā)下中性能下降問(wèn)題,采用基于RESTful 風(fēng)格的API 接口設(shè)計(jì),最后通過(guò)數(shù)據(jù)集購(gòu)買功能和企業(yè)認(rèn)證功能詳細(xì)介紹了項(xiàng)目的實(shí)現(xiàn),并且系統(tǒng)具有前后端分離、低耦合高內(nèi)聚以及易擴(kuò)展性.