楊淙鈞+艾中良+劉忠麟+李常寶



摘要:伴隨海量數據存儲、處理技術的發展,數據中心中積累了大量的格式化歷史數據,此類數據呈現出數據規模龐大、被查詢頻次低和查詢內容規律不確定等特點,而當前以文件為操作對象的系統在查詢此類數據時主要采用分布式計算引擎對數據進行全局遍歷,存在處理時間長、系統資源消耗高等問題。因此,本文提出了一種基于列式多級索引的海量數據高效查詢方法,使得查詢過程中只有承載相關數據的節點參與計算,大幅降低了系統資源消耗。實驗表明,本文方法在用于大規模歷史數據內容查詢時,相對于較主流的文件系統查詢技術有明顯的效率提升。
關鍵詞:海量數據;文件系統;索引機制
中圖分類號:TP314 文獻標識碼:A DOI:10.3969/j.issn.1003-6970.2016.03.020
0引言
隨著大數據技術的發展以及互聯網+應用模式的不斷推廣,通過分析全信息要素獲取更加準確信息的數據分析模式被各領域廣泛采用,許多領域中存在大量信息采集原始數據并積累了大規模的歷史產品數據,其中包含了大量有價值的信息要素,目前該類數據主要采用文件系統存儲,當前大數據技術僅支持對分布式文件系統中的數據進行全量處理,而數據調研分析是制定海量數據處理流程的前提,當前技術無法有效支撐數據調研階段內容分析。針對這一問題,本文設計了較為完善的數據查詢系統,通過建立合理的索引、數據模型為分布式文件系統構建高效內存查詢功能。
本文首先介紹國內外研究現狀,針對海量格式化的歷史數據查詢問題,詳細分析當前技術的局限性;然后闡述基于列式多級索引的海量數據高效查詢方法,在此基礎上進行系統實現,最后通過實驗對本文方法的有效性進行驗證。
1工團國內外研究現狀
隨著對海量數據的存儲及使用的需求得增多,許多企業、組織對海量數據的存儲、查詢做出了研究,并開發出相應工具,例如Apache SoftwareFoundation(AFS)的HBase和Hive項目,Google公司開發的Dremel等。
Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC上搭建起大規模結構化存儲集群。由于HBase使用了基于RowKey進行檢索的機制,因此無法在不指定RowKey的情況下針對列簇中的值直接進行條件查詢。
Hive是一個基于Hadoop的開源數據倉庫工具,用于存儲和處理海量結構化數據。Hive提供了一套類數據庫的數據存儲和處理機制,并采用HQL(類SQL)語言對數據進行自動化管理和處理。Hive經過對語句進行解析和轉換,最終生成一系列MapReduce任務,通過執行產生的任務完成對數據的處理。由于Hive需要使用MapReduce任務對數據進行遍歷查詢,因此查詢效率低。
Dremel是Google的“交互式”數據分析系統,可以處理PB級別的數據,并將處理數據的時間縮短到秒級。Dremel并非是MapReduce的替代品,而是作為MapReduee的有力補充,常常被用來處理MapReduee的結果集或用來建立分析原型。由于Dremel采用了基于內存的查詢方式,受集群內存的限制,因此難以將非高頻使用的數據全部導入作為待查詢數據。
2基于列式多級索引的海量數據高效查詢方法
在海量數據環境中,由于數據規模的原因,需要將數據存儲于分布式文件系統中,而直接基于文件的查詢方式不僅查詢效率低而且系統資源消耗大,因此本文設計了基于列式多級索引的海量數據高效查詢方法。
本章首先介紹了數據組織方式以及列式多級索引模型,其次介紹了索引的更新方式,最后具體的介紹了基于列式多級索引的海量數據高效查詢的流程。
2.1數據組織
由于海量數據環境中,單機節點的存儲系統無法存放所有的數據,因此本課題所設計的查詢系統將數據存儲在HDFS(Hadoop Distributed File Sys-tern,Hadoop分布式文件系統),以展開基于文件的查詢。
雖然HDFS可支持非常大的單個文件容量(TB級),但鑒于海量數據查詢系統無法避免對數據進行全量或局部檢索,因此在本文所設計的查詢系統中不適于采用單個或數個大文件(GB級及以上)存儲被導人數據,通過減小單個數據文件大小以達到縮小單次文件檢索的數據量的目的。
基于此原因,在將數據導人該查詢系統時,需要對待查數據分文件進行管理,即進行文件切片操作,以嚴格控制單個文件的大小以及文件個數,用于存儲數據的文件結構大致如下圖所示:
在本系統建立的索引中有一個指向待查數據中對應記錄的指針,為使該指針能夠快速定位記錄位置,我們為待查數據中的每一個記錄隱身地生成一個RowID。RowID由文件全局路徑以及行號兩部分信息組成,其形式為RowID=
2.2列式多級索引模型
本文通過對歷史數據特點的分析結果,建立基于分布式文件系統的全屬性列式多級索引模型。本節從全屬性列式索引和多級索引兩個角度描述索引模型。
在海量格式化數據的環境下,數據往往具有較多的屬性,各個屬性之間關系相對較弱,因此針對多個屬性的聯合索引實用價值較低。而且由于數據規模方面的原因,會導致聯合索引創建和維護成本較高。因此本課題采用單屬性索引。
在實際的查詢場景中,結構化數據中的任意一個屬性都有作為篩選條件進行查詢的可能性,為了滿足這一條件,本文所設計的系統針對數據中的所有屬性建立索引。
基于以上兩點原因,采用了全屬性列式索引的機制。使用這種機制可以保證在處理對任意屬性作為篩選條件的查詢請求時都可以高效的完成,并且通過分列建立索引的方法降低索引的創建和維護成本。