江 順, 陳榮宇, 林偉君, 吳麗丹
(1.廣東省農業科學院農業經濟與信息研究所, 廣東廣州 510640;2.農業農村部華南都市農業重點實驗室, 廣東廣州 510640; 3.海豐縣農業科學研究所, 廣東海豐 516400;4.汕頭市農業科學研究所, 廣東汕頭 515031)
進入21世紀,大數據、物聯網和云計算技術推動信息技術和互聯網進一步蓬勃發展,現階段互聯網成為了正在發展中的高效率信息庫和信息交換中心,使人類生產生活方式產生了巨大變革,大數據技術和云計算技術是這一階段信息技術和互聯網發展的核心焦點。物聯網技術的更新迭代促使萬物互聯的互聯網時代來臨,網絡數據規模進一步膨脹,這些數據中大部分為非結構化數據。據IDC的調查報告顯示,企業中80%的數據是非結構化數據且這些數據每年都按指數增長60%(該年度數據規模為前1年的1.6倍)。大數據系統既是在這樣一個時代背景之下誕生,使這些非結構化數據被有效管理和利用成為可能。從技術上看,大數據與云計算的關系就像一枚硬幣的正反面一樣密不可分,大數據必然無法用單臺的計算機進行處理,必須采用分布式架構,它的特色在于對海量數據進行分布式數據挖掘,但它必須依托云計算的分布式處理、分布式數據庫和云存儲、虛擬化技術。
隨著物聯網、大數據、云計算等技術應用領域不斷下沉至社會生活生產實踐中,數字農業也越來越成為現在和未來農業產業發展的焦點,數字農業在中國農業生產中應用的不斷加深,促使中國傳統農業的生產方式發生重大變革,越來越多粗放的、機械的、經驗的生產模式不斷向集約化、智能化、科學化發展。如今數字應用已經成為工業生產和社會生活的主流,而農業生產中數字化技術應用仍然處于初創期,農業領域可能是信息化和數字化普及的最后一個產業。導致農業領域數字化技術的應用普及緩慢的原因是多層次的,其中最主要的原因在于中國農村分散的生產經營模式不利于信息化系統的數據資源集中。而隨著農村通信基礎設施的不斷完善、農業物聯網技術的逐步成熟,國家大力推動現代農業產業園的建設,農業全產業鏈的數據集成成為可能。鑒于此,筆者在對大數據架構的研究基礎上提出一種基于Lambda Architecture大數據架構的農業云服務平臺解決方案。
Lambda 架構(Lambda Architecture)是由工程師南森·馬茨(Nathan Marz)根據他在Backtype和Twitter從事分部式數據處理系統工作的經驗提出的大數據處理架構,其目的是指導用戶充分利用批處理和流式技術各自優點,用于實現復雜的大數據系統。在大數據處理系統中,批處理系統(如Hadoop MapReduce)具有較高的可靠性,但數據的實時性較差;流式處理系統(如Storm)則情況正好相反,數據處理延遲低,但可靠性差強人意。Lambda Architecture的目的即為協調2種技術的優缺點,使得大數據處理系統既滿足高可靠性需求,又具有較低的延遲性。Lambda Architecture設計主要目的是滿足以下4個方面的需求:①系統故障或人為錯誤不丟數據;②數據分析低延遲;③系統具備線性擴展能力;④系統中很容易增加新特性。
Lambda Architecture由批處理層(batch layer)、流式處理層(speed layer)、服務層(serving layer)組成(圖1)。

圖1 Lambda Architecture組成示意圖Fig.1 Lambda Architecture composition diagram
(1)批處理層。批處理層的主要職責是保證數據處理的準確性和可靠性,該層將數據以原始格式存儲于HDFS上,以保障和加強數據系統的可靠性,利用Hadoop MapReduce框架對數據進行處理,并保存計算結果,經該處理過程后的數據視圖稱之為批處理視圖(Batch View)。Hadoop MapReduce框架具有優秀的魯棒性,運行過程中即使出現異常也不會產生數據丟失。這種批處理方式只需要數據存儲系統進行隨機讀取、追加寫入操作,不需要處理隨機寫、加鎖、數據一致性等問題,因而較大簡化了存儲系統的設計。但是批處理層的數據處理通常有幾小時到幾天的延遲。
(2)流式處理層。流式處理層的主要職責是滿足所有實時性處理的需求。流式處理層通常基于Storm這樣的流式計算平臺,通過快速的增量式算法,以分鐘級、秒級甚至毫秒級來讀取、分析、保存數據。對于存儲系統,由于需要支持持續的更新操作,其設計要復雜得多。為了簡化問題,通常使用劃窗機制來保存一段時間的數據,劃窗的時間一般和批處理層的數據處理一致。流式處理往往使用內存計算,這意味著當出現異常(比如升級或工作節點異常)時,可能會導致數據的丟失或計算結果錯誤。然而,Lambda Architecture卻不需要過多考慮這類問題,因為下一次批處理作業會再次處理所有數據并獲得準確的結果。
(3)服務層。流式處理層的服務層職責是將流式處理層輸出數據合并至批處理輸出數據上,從而得到一份完整的輸出數據,并保存到諸如HBASE這樣的NoSQL數據庫中,以服務于在線檢索應用。在批處理計算結果之上結合少量實時數據,其結果與完全使用批處理計算相比,具有很好的近似性。
分布式文件系統(Distributed File System,DFS)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點(可簡單理解為一臺計算機)相連。Hadoop分布式文件系統(Hadoop Distributed File System,HDFS)是指被設計成適合運行在通用硬件(Commodity Hardware)上的分布式文件系統。HDFS有高容錯性(Fault Tolerant)的特點,并且設計用來部署在低廉的(Low Cost)硬件上。而且它提供高吞吐量(High Throughput)來訪問應用程序的數據,適合那些有超大數據集(Large Data Set)的應用程序。HDFS放寬了POSIX的要求,這樣可以實現流的形式訪問(Streaming Access)文件系統中的數據。
HDFS的結構。HDFS由4部分組成(圖2):HDFS客戶端(HDFS Client)、名稱節點(Name Node)、數據節點(Data Node)和輔助名稱節點(Secondary Name Node)。HDFS是1個主-從(Mater/Slave)體系結構,HDFS集群擁有1個名稱節點和一些數據節點。名稱節點管理文件系統的元數據,數據節點存儲實際的數據。

圖2 HDFS結構示意圖Fig.2 HDFS structure diagram
(1)名稱節點:負責管理分布式文件系統的命名空間(Namespace),保存了2個核心的數據結構,即鏡像文件(FsImage)和操作日志(EditLog)。鏡像文件用于維護文件系統樹以及文件樹中所有的文件和文件夾的元數據。操作日志文件中記錄了所有針對文件的創建、刪除、重命名等操作。
(2)HDFS客戶端:提供一系列命令用于管理和訪問HDFS,如啟動和關閉HDFS。用于與數據節點交互,讀取或者寫入數據;讀取時,要與名稱節點交互,獲取文件的位置信息;寫入HDFS時,Client將文件切分成多個的數據塊(Block),然后進行存儲。
(3)輔助名稱節點:它是用來保存名稱節點中對HDFS元數據信息的備份,并減少名稱節點重啟的時間。輔助名稱節點一般是單獨運行在1臺機器上。
(4)數據節點:數據節點是HDFS的工作節點,負責數據的存儲和讀取,會根據客戶端或者是名稱節點的調度來進行數據的存儲和檢索,并且向名稱節點定期發送自己所存儲的塊的列表。
HDFS的數據讀取。HDFS讀取數據流程(圖3)如下:
(1)打開HDFS文件。HDFS客戶端首先調用“DistributedFileSystem類”中的“open方法”打開HDFS文件,底層會調用“ClientProtocal類”中的“open方法”,返回一個用于讀取的“HdfsDataInputStream”對象。
(2)從名稱節點獲取數據節點地址。在構造“DFSInputStream對象”的時候,調用“ClientPortocal類”中的“getBlockLocations方法”向名稱節點獲取該文件起始位置數據塊信息。名稱節點返回的數據塊的存儲位置是按照與客戶端距離遠近排序的。所以“DFSInputStream對象”可以選擇一個最優的數據節點,然后與這個節點建立數據連接讀取數據塊。
(3)連接到數據節點讀取數據塊。HDFS客戶端通過調用“DFSInputStream對象”從最優的數據節點讀取數據塊,數據會以數據包(Packet)的形式從數據節點以流式接口傳送到客戶端,當達到一個數據塊末尾的時候,“DFSInputStream對象”就會再次調用“getBlockLocations方法”獲取下一個數據塊的位置信息,并建立和這個新的數據塊的最優節點之間的連接,然后HDFS繼續讀取數據塊。
(4)HDFS客戶端關閉輸入流。

圖 3 HDFS讀取數據流程 Fig.3 HDFS data reading process
HDFS數據寫入。HDFS寫入數據流程見圖4:
(1)HDFS 客戶端調用“DistributedFileSystem類”中的“create()方法”
(2)底層調用“ClientProtocal類”中的“create()方法”在名稱節點的文件系統目錄樹中創建一個文件,并且創建新文件的操作記錄到操作日志(EditLog)中,返回一個輸出流對象(HdfsDataOutputStream)。
(3)HDFS 客戶端根據返回的輸出流對象調用“write方法”來寫數據。
(4)由于之間創建的新文件是一個空文件,并沒有申請任何數據塊,所以“DFSOutputStream對象”首先會調用“ClientProtocal類”中的“addBlock方法”向名稱節點申請數據塊,數據塊的大小可以由用戶自己配置,默認為128 M,名稱節點返回一個“LocatedBlock對象”,該對象保存了該數據塊所有數據節點位置信息,然后就可以建立數據流管道寫數據塊。
(5)建立通向數據節點的數據流管道,寫入數據:建立數據流管道之后,HDFS客戶端就可以向數據流管道寫數據。它會將數據切分成一個個的數據包(Data Packet),然后通過數據流管道發送到數據節點。
(6)每一個數據包(Data Packet)都有一個確認包(Ack Packet),逆序的通過數據流管道回到輸出流。輸出流在確認了所有的數據節點已經寫入了這個數據包,就會從對應的緩存隊列刪除這個數據包。
(7)當數據節點成功接收一個數據塊時,數據節點會通過“DataNodeProtocal類”中的“blockReceivedAndDelete方法”向名稱節點匯報,名稱節點會更新內存中數據塊和數據節點的對應關系。
(8)完成操作后,客戶端關閉輸出流。

圖4 HDFS寫入數據流程 Fig.4 HDFS data writing process
HDFS的優缺點。HDFS具有鮮明的優勢,它兼容廉價的硬件設備,支持流數據的讀寫和大數據集的集成,采用十分簡單的文件模型,擁有強大的全平臺性能。但同樣有不容忽視的局限性:HDFS數據讀取效率低且速度慢,不適合有低延遲需求的數據訪問,且無法高效存儲大量小文件,不支持數據集的并行處理,即不支持多用戶寫入及任意修改文件。
批處理技術。MapReduce是面向大數據并行處理的計算模型、框架和平臺,它具有3層隱藏含義:
(1)基于集群的高性能并行計算平臺(Cluster Infrastructure)。它允許用市場上普通的商用服務器構成一個包含數十、數百至數千個節點的分布和并行計算集群。
(2)并行計算與運行軟件框架(Software Framework)。MapReduce提供了一個龐大但設計精良的并行計算軟件框架,能自動完成計算任務的并行化處理,自動劃分計算數據和計算任務。
(3)并行程序設計模型與方法(Programming Model & Methodology)。它借助于函數式程序設計語言Lisp的設計思想,提供了一種簡便的并行程序設計方法,用Map和Reduce共2個函數編程實現基本的并行計算任務,提供了抽象的操作和并行編程接口,以簡單方便地完成大規模數據的編程和計算處理。
流式計算技術。Storm是一種開源的分布式實時計算框架,可以簡單、可靠的處理大量的數據流。Storm有很多使用場景,如實時分析、在線機器學習、持續計算、分布式遠程過程調用(Remote Procedure Call ,RPC)、數據抽取轉換加載(Extract-Transform-Load,ETL)等。Storm是一個分布式的、可靠的、容錯的數據流處理系統,Storm支持水平擴展,具有高容錯性,保證每個消息都會得到處理,而且處理速度很快(在1個小集群中,每個結點每秒可以處理數以百萬計的消息)。Storm的部署和運維都很便捷,而且更為重要的是可以使用任意編程語言來開發應用。
云計算是一種IT資源的交付和使用模式,指通過網絡以按需、以擴展的方式獲得所需的資源(硬件、平臺、軟件及服務等),提供資源的網絡被稱為“云”。與其說云計算是一種新的技術領域,不如說它是一種在業務模式方面的創新。“云”中的資源在使用者看來是可以無限擴展的,并且可以隨時獲取,按需使用、隨時擴展、按使用付費。公共云是最基礎的服務,多個客戶可共享一個服務提供商的系統資源,他們無須架設任何設備及配備管理人員,便可享有專業的IT服務,這對于農業經營主體來說,無疑是一個降低資金和管理成本的理想軟件架設方式。公共云還可細分為3個類別,包括軟件即服務(Software-as-a-Service,SaaS)、平臺即服務(Platform-as-a-Service, PaaS)、基礎設施即服務(Infrastructure-as-a-Service, IaaS)。
SaaS(Software as a Service)應用即服務,軟件即服務也是其服務的一類,通過互聯網提供按需軟件付費應用程序,云計算提供商托管和管理軟件應用程序,并允許其用戶連接到應用程序并通過全球互聯網訪問應用程序。在SaaS中從底層的網絡和存儲設備到上層的數據和應用的管理都通過云服務托管的方式進行架設和管理(圖5),用戶可以從任意位置、通過任意設備登錄SaaS應用程序,由SaaS服務的提供商進行系統的日常管理和更新,用戶無須安裝部署或維護更新,無論是農業生產企業和SaaS服務提供商,都大大降低了成本的投入。SaaS服務提供商可以隨著使用量的增加提供更多的數據存儲能力、計算能力或網絡接入能力。

圖 5 云服務架設方式對比[27-28]Fig.5 Comparison of cloud service setup
基于HDFS和NoSQL的多元農業數據集成。在農業從原料、加工、生產到銷售的全產業鏈中會產生海量類型多樣的數據,這些是融合了農業的地域性、季節性、多樣性、周期性等自身特征后產生的來源廣泛、類型多樣、結構復雜、具有潛在價值,并難以應用通常方法處理和分析的數據集合,是典型的大數據的特征。農業大數據保留了大數據規模巨大(Volume)、類型多樣(Variety)、價值密度低(Value)、處理速度快(Velocity)、精確度高(Veracity)和復雜度高(Complexity)等基本特征,并使農業內部的信息流得到了延展和深化。
物聯網、遙感等先進技術的使用使得農業大數據的來源更加豐富、結構更加復雜、類型更加多樣,農業大數據按產生的場景可以概括為3種數據類別:生產端數據、市場端數據和知識庫。按數據的組織結構不同又可以分為結構化業務數據、半結構化數據(Semi-structure Data)和非結構化數據(圖6)。
對于大量的半結構化數據和非結構化數據的存儲、并發計算和擴展能力需求,大數據系統普遍采用非關系型數據庫(NoSQL)解決方案,如Apache的Hbase分布式數據庫系統。大數據系統中,結構化數據和半結構/非結構化數據有著截然不同的2套處理流程和體系,結構化數據一般可以直接存入分布式數據庫環境中,半結構化數據/非結構化數據則通過2種途徑存入至分布式文件系統或分布式數據庫中:對于能夠序列化的數據,直接經過ETL(抽取、轉換、加載)清洗處理后直接存放至數據庫中;對于不能夠序列化的數據,一般通過數據整理后存放至分布式文件系統中。

圖6 農業大數據集成示意圖Fig.6 Schematic diagram of agricultural big data integration
基于Lambda Architecture的農業大數據架構。在由實際監測、手工錄入或信息采集所產生的數據流進入系統后,同時發往批處理層和流式處理層處理。批處理層以不可變模型離線存儲所有數據集,通過在全體數據集上不斷重新計算構建查詢所對應的批處理視圖。流式處理層處理增量的實時數據流,不斷更新查詢所對應的即時視圖。服務層合并批處理視圖和即時視圖中的結果數據集到最終的數據集并響應用戶的查詢請求(圖7)。

圖7 農業大數據服務架構示意圖Fig.7 Schematic diagram of agricultural big data service architecture
系統架構設計。該研究示例系統從系統底層至系統上層依次為云計算的硬件系統和虛擬系統、大數據的獲取、存儲、查詢計算、分析、服務和應用業務模塊(圖8)。
平臺應用界面。該研究的大數據系統架構已經在廣東省農業生產領域中形成了多套應用,涉及的農業細分行業包括茶葉產業、蔬菜產業、水稻產業等(圖9、10),通過對農業資源基礎數據、農業生產數據、生產經營主體數據、市場信息數據、科技服務數據的整合,實現“一個平臺,多套系統”的系統集成方式,測試系統服務器配置如表1所示。
大數據應用平臺在云端共部署數據存儲服務節點7個,其中1個主名稱節點、1個輔助名稱節點、5個大數據存儲節點(數字節點),均為高性能數據計算配置。應用服務器主要承擔網絡接口任務,部署一套Web集群服務器,架設nginx服務框架,承擔網絡高并發處理任務,部署Web服務器2套,另設1套redis緩存服務器。
大數據服務系統目前已在廣東省部分現代農業產業園部署(圖9~11),以上3個平臺基于一套大數據云服務系統,由SaaS服務提供商提供系統的架設、維護和升級服務,在系統的設計和開發過程中,研究和開發團隊設計了全面的訪問控制功能,保證私密生產數據的安全性。農業產業園在資源和產業方面集中化和規模化的特點,使得農業大數據的獲取相對于分散小農更具便利性,物聯網設施的應用也更為普遍,由于生產的集約化和農村勞動人口的流失,對農業生產的自動化需求也更為迫切,大數據系統的部署為農業生產的進一步自動化提供基礎性的服務。
數據管理視圖。系統數據的采集、管理系統界面如圖12所示,數據管理視圖主要用于檔案信息和農事操作信息等

圖8 農業云服務平臺架構示意圖Fig.8 Schematic diagram of agricultural cloud service platform architecture

表1 測試系統服務器配置Table 1 Test the system server configuration

圖9 農業產業大數據服務平臺 Fig.9 Agricultural industry big data service platform
需要手動輸入的信息錄入和管理,目前大數據系統的數據管理系統實現了田塊管理、農業投入品(化肥、農藥等)管理、生產批次管理、農事計劃和溯源信息管理等關鍵的管理功能。
在研究中對常規系統和大數據系統的集群查詢性能進行了對比試驗,試驗在實驗室虛擬化環境中運行,分別針對該研究的Hadoop數據集群和普通MySQL數據集群,試驗結果如圖13所示。從圖13可以看出,當數據規模較小時,大數據集群效率無法體現,甚至還落后于相同硬件配置下的 常規數據集。在300萬條數據級別時,常規數據集與大數據集群效率基本持平。在 500 萬條數據級別時,大數據集群的效率明顯高于常規數據集,數據查詢效率提升超過25%。

圖10 農業產業大數據服務平臺Fig.10 Agricultural industry big data service platform

圖11 農業產業大數據服務平臺Fig.11 Agricultural industry big data service platform
該研究中的大數據架構在保障數據的不可變性的基礎上做到了數據的重新計算,批處理層保存了原始數據,可以極大避免數據的損失,算法可以同時分析歷史數據和短期實時數據,兼顧數據的準確性和實時性,但事實上大數據系統的2個計算層進行了大量的重復計算,從計算資源角度看,這樣的大數據系統架構消耗了較多的資源。
大數據和云計算服務2種焦點技術的結合,為農業生產和流通產生了有益的結果,在云計算系統中的大數據分析有多種優勢。首先,云計算服務有助于整合來自眾多來源的數據,隨著云計算技術的進步,大數據分析得以更加完善;其次,云計算服務為農業大數據分析提供了靈活的基礎架構,大大簡化了大數據分析的系統規模,可以根據需求進行擴展,使得管理工作負載變得容易;最后,云計算服務使得用戶無需大規模的大數據資源即可進行大數據處理,大大降低了涉農企業和組織機構的大數據系統運營成本,為農業發展帶來巨大的價值。
在系統的實際應用中,時常會出現實時與批量計算結果不一致引起的數據口徑問題,因為批處理和實時計算是2個并行的計算框架和計算程序,批處理計算是整體數據計算框架,實時計算則是局部數據計算,常會出現某一數據在一定時間后發生變化的現象。
平臺已經完成技術集成和整合,在農業大數據領域應用

圖12 數據管理視圖Fig.12 Data management view

圖13 Hadoop數據集群與MySQL數據集群性能對比Fig.13 Comparison between Hadoop data clustering and MySQL data clustering
具備應用的超前性和技術的先進性,但目前在應用上沒有突出的亮點,尚處于前端應用的缺乏階段,平臺的進一步開發與研究過程中,應當挖掘平臺更深層次的應用,實現技術的社會經濟效益。