朱德新,宋雅娟
(長春大學 計算機科學技術學院,長春 130022)
隨著互聯網的飛速發展,尤其是近幾年來人們所掌握的數據量爆炸式增長,如何高效的處理海量數據已經得到了全世界的廣泛研究。海量數據是一個形容詞,它是用來形容空前浩瀚的、巨大的數據。現在很多業務部門都需要操作海量數據,如水利部門水利的數據,規劃部門規劃的數據,氣象部門氣象的數據,這些處理的數據量都非常大。它包括各種報表統計數據、空間數據、聲音、文字、超文本、圖像等各種環境和文化數據的信息。而這些數據又具有相當高的使用價值,高效合理地使用這些海量數據,不僅可以掌握更多用戶潛在的需求,同時還可以為滿足人們更多需求而開發出更好的應用。然而當人們面對具有如此龐大而且信息量繼續爆炸增長的數據,想要非常高效的利用這些海量數據時才發現困難重重。在網絡時代,如何對海量數據進行操作,這樣越來越多的挑戰需要靠卓越的算法來解決。
數據中蘊含著企業的財富,但是因為數據量的增長速度過快,所以首先在客觀上逼迫企業必須實施海量存儲的解決方案。在這個階段過程中很多企業已經完成方案,或者正在實施。目前,各個企業對文件型數據推出了不同的存儲方案,而采用文件服務器進行文件數據存儲的仍然占據最多數,在總體企業中占據32.9%比例;應用服務器內置存儲空間存儲文件數據的企業占據21.8%的比例;16.3%的企業選擇了通過NAS網關共享SAN網絡存儲空間進行文件數據存儲;還有13.1%的企業通過NAS網絡存儲來進行文件存儲;10.1%的企業通過集群NAS解決文件存儲問題;表示應用分布式文件系統解決文件存儲的企業占總體企業的9.2%;選擇多協議支持的統一存儲系統的企業占總體企業的3.9%;此外,還有16.9%的企業表示目前正在解決文件數據存儲的問題。
面對著蘊藏企業財富的海量數據,在實現存儲和檢索之后,如何把這些有用的數據整合起來,并加以提煉和分析,最終形成支持企業業務發展的一個決策呢?這就是如何對海量數據進行處理的過程。
在過去二十年中,單機的性能有了很大的發展變化,尤其是CPU、內存等硬件技術。但是這些硬件技術在理論上的發展是有限度的。如果說硬件的發展在縱向上提高了系統的系能,那并行技術的發展就是從橫向上拓展了處理的方式,例如如今的多核技術就是并行技術發展的一個實例[1]。在海量數據分析和處理上,并行數據處理方式是必不可少的。因為它的處理策略是“分而治之”,這樣對于性能的延伸在理論上是沒有邊界的。在實際應用中,現今比較主流的兩種并行數據處理技術就是MapReduce技術和并行數據庫技術。
MapReduce是在2004年,Google公司的Jeffrey Dean和Sanjay Ghemawat提出來的[2-3]。谷歌的搜索引擎,每一天都要處理數量龐大的網絡數據。根據客戶的搜索條件將采集來的數據進行篩選,要求在一定的時間內完成。MapReduce將并行編程中復雜的業務邏輯進行抽象化。它在前面展現用于簡單的計算的接口,而對負責的并行化處理、數據分布、容錯、負載平衡和數據分布均進行了隱藏。這樣很大程度上簡化了程序員對于分布式這樣程序的開發難度,每個程序只要用自己最熟練的并且能夠實現數據處理的接口就可以了,而不需要考慮并行處理的每一個細節。MapReduce主要是Reduce和Map這兩個操作上的概念。Reduce操作是針對鍵值進行簡單匯總操作。通過這種方式,將現實生活中的許多任務都能描述出來。Map操作主要是對一組輸入記錄進行處理,處理方式是基于典型的key/value鍵值的方式。
并行數據庫(Parallel Database System)是并行計算和數據庫技術相結合的產物[4]。隨著并行計算技術的發展,人們逐漸的認識到通過空間或時間上的并行處理,能夠大大提高對任務的處理效率。并行計算可以分為任務并行和數據并行。任務并行處理會將任務的協調和管理變得非常復雜。而數據并行則是將一個大任務分解成多個相同的子任務,對比任務并行來說要容易處理。并行數據庫實質上就是將數據并行處理的一種形式。一個數據庫系統關注的更多的是吞吐量和響應時間,這兩者也是衡量一個數據庫系統性能的關鍵指標[5]。前者用于在給定的時間段里能夠完成的任務數量,后者表示單個的任務從提交到完成一共需要多少時間。并行數據庫主要用于提高這兩點的性能。
在海量數據的處理當中,對于數據格式的限制,不應該存在。因為在實際應用當中,各種格式的數據都有可能存在,比較常用的格式有:數據庫、多媒體、網頁、文本以及由其他應用程序生成的數據。而在海量數據的分析處理過程中,可能要面對一種或幾種格式的數據。
在實際應用中,對于一般的數據處理,往往需要使用數據庫。但是如果要對復雜的數據處理,則必須要借助程序。而要在程序操作數據庫和文本之間選擇的話,則要選擇程序操作文本。原因是該處理方法速度快;對文本處理不容易出錯;文本的存儲不受限制于文本的格式等。例如一些海量的網絡日志都是文本或者csv格式,對它進行處理則會涉及到多余數據清除,是需要利用程序進行處理的,而不建議導入數據庫再做處理。
處理數據離不開好的程序代碼,尤其在處理復雜數據時,必須使用程序。程序代碼對數據的處理非常重要,這不僅是數據處理準確性的問題,更是數據處理的效率問題。優秀的程序代碼應該包含好的處理流程、好的算法、好的異常處理機制、好的效率等。當數據量非常大時,選擇語言就需要慎重了。因為每種語言都有各自不同的特點,所以就需要在編程時間和運行時間之間進行權衡。遍歷處理所有數據時,腳本語言處理就不合適了。因為腳本語言的運行時間非常長,不能夠讓人接受。另外,對于內存使用和文件讀寫,程序都沒法控制。不幸的是,很少語言會為處理海量文件做優化。這時,C/C++是最好的選擇。
該算法中,處理海量數據主要分為兩部分。第一部分是對海量數據的讀取。該階段的算法可應用于任何類型的文本文件中,數據以字符為單位從文件中讀取出來。第二部分是對海量數據的分析。而分析過程則需要根據文件的格式類型進行不同的處理。筆者處理數據的文件是.csv格式,文件的大小至少在25M以上,共有152049行,81列,文件的內容格式如圖1所示。該算法的執行時間大約為7s。

圖1 文件內容形式
該階段將文件映射對象映射到當前應用程序的地址空間中,并根據文件的大小,將數據以字符為單位讀取出來。流程圖如圖2。

圖2 讀取海量數據
該階段是圖2中對視圖數據處理這個過程。處理文件的格式為.csv格式,該文件的特點是數據以逗號作為分隔符,每一行結束符為回車換行。處理過程將圖1中每一個時間戳內有效數據(浮點數)分析出來,并將有效數據時間戳數以及一個時間戳內的行值、列值、最左點、最右點、最上點、最下點等信息提取出來。流程圖如圖3。

圖3 海量數據處理
該算法執行海量數據的結果如圖4、圖5所示。

圖4 顯示執行時間

圖5 提取有效數據結果
本文從現實問題出發,就當前海量數據分析處理難題,進行了方法上的簡單探討。并根據存儲海量數據的文件格式,設計了算法。通過對算法在執行效率和分析有效數據上的驗證,該算法快捷有效,能夠比較好的對海量數據進行處理。
[1]陳康,鄭緯民.云計算:系統實例與研究現狀[J].軟件學報,2009,20(5):1337-1348.
[2]J.Dean and S.Ghemawat.MapReduce:Simplified data processing on largeclusters[M].In Proc.OSDI,2004.
[3]David J.DeWitt,Jim Gray.Parallel Database Systems[M].The Future of High Performance Database Processing,1992.
[4]Ben Lorica.HadoopDB[M].An Open Source Parallel Database.2009.