文/姜少彬 伍江江 周正
大數據分析處理技術從海量數據中發現隱含的知識。但數據獲取的方式、速度、數據格式以及人為的誤操作等都會影響數據質量,進而給大數據分析帶來麻煩。大數據處理流程中利用數據清洗來解決數據質量問題。數據清洗通過對數據進行重新審查和校驗,刪除重復信息、非法格式文件以及糾正存在的錯誤,并提供數據一致性,從而保證數據質量,服務大數據分析。
遙感衛星系統在運行過程中,大量的遙感數據7*24小時不間斷下傳,文件系統中存儲了海量的遙感數據。由于衛星器件問題、傳輸問題和地面人為誤操作等都會造成一些數據文件的錯誤。如不及時對非法數據文件進行檢測清理,將會影響后續的數據分析處理業務。由于遙感數據體量巨大,且增長速度快,因此需要以更快的速度對數據進行檢測,在規定的時間內完成對數據的清洗。
本文設計并實現了一種海量數據文件異常并行檢測技術,利用服務器集群對海量數據文件進行異常檢測,并在服務器執行過程中采用多線程技術,從而實現服務器和線程兩級的并行處理,取得了較高的掃描檢測效率。
通過數據分析獲取知識和解決問題是科學研究和工程實踐的重要手段,計算機的出現使數據分析計算的效率實現了質的飛躍。隨著科技發展,科研和工業上遇到的問題愈加復雜龐大,要分析的數據量也在不斷增加,單機的處理速度已經無法滿足要求。1993年,集群技術逐漸得到重視和發展。集群將若干臺計算機(或工作站、服務器等)通過網絡連接,多機協同工作實現并行處理,能夠同時具備高性能和高可用性。1997年戰勝國際象棋大師卡斯帕羅夫的“深藍”計算機就是由多臺運行AIX的IBMSP2計算機組成的集群,每秒可以計算2億步。2000年,新墨西哥大學的Los Lobos[1]集群實際上是256臺IBM的Netfinity個人多服務器組成的“超級集群”。它以低成本提供超級計算機水平的功能,每秒鐘的處理可達到3750億次。該速度在當時前500臺超級計算機中排名第24 。

圖1:系統模塊組成圖

圖2:服務器集群結構圖

圖3:基于負載均衡的任務分發
進入21世紀,現代工業高速發展,特別是網絡信息產業的繁榮,使得數據呈現爆炸式的增長。海量數據的處理需求催生了大數據處理技術。大數據處理的基本思想是分治,采用分布式并行計算,將大數據問題分解成規模較小的子問題進行求解,然后合并子問題的解得到最終解[2],在處理速度上取得了質的飛躍。2004年Google 公司提出的 MapReduce[3]是一種專門處理大數據的編程模型和實現框架,具有簡單、高效、易伸縮以及高容錯性等特點。MapReduce技術本質是一種并行計算,所以也采用集群作為硬件環境。基于MapReduce框架的Hadoop大數據處理平臺可以利用普通計算機搭建集群,為超大數據集提供存儲和處理能力,適合大規模離線數據的批處理。缺點是小文件處理性能較差,且易造成負載不均衡。Spark[4]是輕量的、基于內存計算的開源集群計算平臺。Spark通過完善內存計算和處理優化機制加快批處理工作負載的運行速度,批處理速度比MapReduce快10倍,內存中分析速度快100倍。
由于集群在提供高效計算的同時具有較高的性價比,且可以保證計算系統的高可用,并行計算對集群有越來越強的依賴[5],所以本文決定采用集群作為海量數據文件異常檢測的硬件平臺,并利用多線程技術實現集群和線程兩級的并行處理。
2.1.1 高效檢測能力
遙感衛星系統24小時連續運行,海量探測數據不間斷的下傳,存儲在分布式文件系統中。數據文件異常檢測服務需要能夠快速檢測出海量數據文件中的非法文件,并及時清除,保證數據分析處理業務對數據的訪問。
2.1.2 智能檢測能力
系統應允許用戶選擇文件目錄和檢測時間,設置定時掃描檢測任務,從而實現海量數據文件異常檢測的智能化。
2.1.3 系統高可用
星上數據持續下傳,文件系統中不斷有新的文件存入,數據文件異常檢測服務勢必也要長時間運行。服務器長期運行下會有一定的故障概率,如何避免服務器宕機造成服務中斷是設計中需要解決的問題。
系統擬采用服務器集群來達到檢測所需的性能,在服務器執行掃描檢測任務過程中運用多線程技術實現并行處理進一步提高檢測效率。系統由負載均衡服務器和執行服務器集群組成,其主要功能模塊構成如圖1所示。
(1)通過任務配置模塊,實施檢測策略的靈活配置,能夠從文件名、文件格式、文件內容等不同角度對異常文件進行檢測,并可對檢測時間、檢測目錄等信息靈活選擇,從而實現智能化檢測。

表1:任務執行時間表
(2)通過運行在負載均衡服務器上的負載均衡模塊將任務劃分后分發到多臺執行服務器上并行執行,從而提高檢測效率,并且集群可以根據需求靈活擴展系統能力。
(3)在執行服務器上設計實現服務器資源監控調度模塊,監視服務器資源動態使用情況,根據業務繁忙程度為檢測服務分配服務器資源,從而在充分利用資源提高檢測效率的同時保證服務器上其他業務的正常運行。
(4)任務執行模塊運行在執行服務器上。其中線程管理子模塊負責開設線程池,管理多個線程并行執行掃描檢測任務,進一步提高檢測效率;任務隊列管理子模塊負責對任務隊列進行組織管理;線程執行模塊中各線程從任務隊列中提取任務進行執行。
(5)各服務器任務完成后通過集成在服務器上的消息發送端將結果發送至分發服務器,由分發服務器直接推送給前端進行顯示。
(6)系統內服務器實施熱備和冗余設計,當某臺服務器宕機后,冗余節點能夠在短時間內接手任務,保證服務持續進行,從而實現系統的高可用。
服務器集群在工作過程中,負載均衡模塊運行負載均衡策略完成集群之間任務的快速分發;服務器資源監視調度模塊為掃描檢測任務分配一定的系統資源用于執行;任務執行模塊依托多核處理器為任務進程開設線程池,管理和運行多個線程,實現線程級的并行處理;各服務器檢測結果最終通過消息發送端發送至分發服務器,由分發服務器推送至前端顯示。
3.1.1 服務器集群構建
系統呈三層結構,主要包括:負載均衡服務器、任務執行服務器集群和分布式共享文件系統。如圖2所示。
負載均衡服務器是系統的對外端口。用戶提交的任務請求通過負載均衡服務器分發給執行服務器。執行服務器根據分配的任務從分布式文件系統中提取數據進行處理,并將處理結果寫入數據庫。
為保證系統的高可用,負載均衡服務器采用主從式雙機熱備,主服務器負責負載均衡和任務分發。主服務器出現故障停機,從服務器可在短時間內接管服務,保證系統的正常運行。為執行服務器設置冗余節點,當監測到一臺執行服務器出現故障,系統會啟用冗余節點接管該服務器的任務繼續執行,保證系統的高可用。各執行服務器獨立完成分配的任務,執行服務器之間不進行通信,從而降低依賴和耦合,便于集群的擴展。

圖4:檢測結果推送

圖5:海量數據文件異常并行檢測執行流程圖

圖6:線程池結構圖
3.1.2 基于負載均衡的任務分發
負載均衡模塊運行基于任務量和服務器負載狀態的負載均衡策略,防止出現服務器超載或饑餓現象,提高集群資源利用率,最大限度地發揮集群處理能力。
執行服務器serveri資源空閑情況主要指CPU空閑情況,用空閑的核心數量ci表示。各服務器的空閑資源在所有服務器空閑資源總和中占有的比例稱為空閑資源占比ki:

用戶請求的任務量為M,則根據空閑資源占比各個執行服務器分配到的任務量為mi:

在實際工作中,文件系統將下傳的遙感數據按年、月、日、小時劃分目錄進行組織,方便后續的使用管理。由于遙感衛星在每個小時所產生的數據量基本相當,所以在實際的均衡策略執行時并不需統計目錄下確切的文件數量,可將小時目錄的數量近似看做任務量來進行分配。現用戶請求對目錄DATA下的文件進行檢測,其下有0-23共24個小時目錄。如圖3所示,集群中有5臺服務器,假定當前各服務器均為空載,則通過負載均衡策略將子目錄分配給各執行服務器執行。
3.1.3 檢測結果推送
如圖4所示,集群中采用TCP 遷移技術,將客戶端與均衡服務器的TCP連接透明地遷移至執行服務器上。執行服務器執行完畢后將結果寫入數據庫,不經過負載均衡服務器而是直接向客戶端推送結果信息,既有效減少了客戶端的響應延遲,又大大降低負載均衡服務器的負擔,有助于提高整個系統的性能。
3.2.1 并行檢測流程
掃描檢測任務的執行過程如圖5所示。
執行服務器上的任務執行模塊根據得到的任務配置信息和分配的系統資源量開辟適當規模的線程池,管理多個線程并行執行掃描檢測任務。
用戶提交任務時通過任務配置模塊和負載均衡模塊將配置信息傳遞給任務執行模塊,同時服務器資源監視調度模塊監測服務器上業務運行情況,為檢測服務分配系統資源。在業務空閑狀態下可以為檢測服務分配盡量多的資源加快掃描檢測速率,在業務繁忙狀態下可適當回收部分資源,保證服務器上其他業務的正常運行。任務執行模塊中的線程管理子模塊根據獲得的任務信息和可分配資源信息開辟包含多個線程的線程池,并行執行掃描檢測任務。在線程執行過程中,首先從數據庫中獲得篩選依據,而后遞歸進入目錄對文件格式、各級目錄以及文件屬性和目錄層級匹配是否規范進行判斷,并將違規數據寫入數據庫。
3.2.2 多線程的實現
線程池結構如圖6所示。
線程池主要由線程、任務隊列和線程管理器組成。其中線程管理器負責調度,避免反復創建和銷毀線程造成不必要的時間開銷,提高資源利用率。
服務器根據可分配的資源量默認開辟線程數為n的線程池,為核心線程。任務到達時,按小時目錄劃分為子任務分配給各個線程執行。若子任務數多于n,則線程池增開線程,但總數不得超過可分配的最大核心數m;若線程池已滿則將任務放入任務隊列等待執行;若任務隊列已滿則拒絕新加入的任務。
4.1.1 硬件環境
1臺PC終端(作為軟件操作終端),4臺服務器(1臺負載均衡服務器,3臺執行服務器)。
服務器配置如下:
CPU:Intel(R) Xeon(R) CPU E5-2650 v3@ 2.30GHz×4
網卡:Intel Corporation 82599ES 萬兆網卡
4.1.2 軟件環境
集群操作系統:Redhat Linux 6.5 64位PC端操作系統:Windows 7 64位中文版文件系統:華為Oceanstor5500分布式文件系統
實驗按照實際的文件格式在DATA目錄下生成日期子目錄20190103,在20190103目錄下生成12個小時子目錄01-12,每個小時目錄內包含100000條正常數據和2000條異常數據,共計1224000條數據。分別采用集群服務器多線程執行、單服務器多線程執行和集群服務器單線程執行對DATA目錄進行多次掃描檢測對比實驗,記錄任務執行時間如表1。
從表1中的數據可以看出,集群服務器的檢測效率要優于單機的檢測效率,多線程的檢測效率要優于單線程的檢測效率。分別定義集群多線程、單機多線程和集群單線程的執行速率為V1、V2、V3,則有:

實驗中,所有異常數據均能被檢測出來,同時沒有正常數據被誤檢為異常數據,檢測準確率為100%。由此得出采用集群和多線程技術對海量數據進行掃描檢測,在檢測效率上可以取得顯著提高,是一個可行的方案。
本文通過對海量數據處理技術的學習研究以及對實際業務的具體分析,設計了一種針對海量數據文件異常的并行檢測技術,主要采用集群和多線程的技術進行實現。通過在百萬量級的數據上進行對比實驗,取得了令人滿意的結果,證明采用集群和多線程技術能夠顯著提高檢測效率。