大數據存取的選擇:行存儲仍是列存儲?

http://www.infoq.com/cn/articles/bigdata-store-choose數據庫

上個月參加了一個雲存儲的技術討論會。這一個月裏,陸續收到幾位同窗討論大數據保存和處理的郵件。今天是週末,索性把這個月的交流內容整理寫下來,供各位參考。安全

目前大數據存儲有兩種方案可供選擇:行存儲和列存儲。業界對兩種存儲方案有不少爭持,集中焦點是:誰可以更有效地處理海量數據,且兼顧安全、可靠、完整性。從目前發展狀況看,關係數據庫已經不適應這種巨大的存儲量和計算要求,基本是淘汰出局。在已知的幾種大數據處理軟件中,Hadoop的HBase採用列存儲,MongoDB是文檔型的行存儲,Lexst是二進制型的行存儲。在這裏,我不討論這些軟件的技術和優缺點,只圍繞機械磁盤的物理特質,分析行存儲和列存儲的存儲特色,以及由此產生的一些問題和解決辦法。多線程

一.結構佈局

行存儲數據排列oop

列存儲數據排列
 佈局

表格的灰色背景部分表示行列結構,白色背景部分表示數據的物理分佈,兩種存儲的數據都是從上至下,從左向右的排列。行是列的組合,行存儲以一行記錄爲單位,列存儲以列數據集合單位,或稱列族(column family)。行存儲的讀寫過程是一致的,都是從第一列開始,到最後一列結束。列存儲的讀取是列數據集中的一段或者所有數據,寫入時,一行記錄被拆分爲多列,每一列數據追加到對應列的末尾處。性能

二. 對比

從上面表格能夠看出,行存儲的寫入是一次完成。若是這種寫入創建在操做系統的文件系統上,能夠保證寫入過程的成功或者失敗,數據的完整性所以能夠肯定。列存儲因爲須要把一行記錄拆分紅單列保存,寫入次數明顯比行存儲多,再加上磁頭須要在盤片上移動和定位花費的時間,實際時間消耗會更大。因此,行存儲在寫入上佔有很大的優點。大數據

還有數據修改,這實際也是一次寫入過程。不一樣的是,數據修改是對磁盤上的記錄作刪除標記。行存儲是在指定位置寫入一次,列存儲是將磁盤定位到多個列上分別寫入,這個過程還是行存儲的列數倍。因此,數據修改也是以行存儲佔優。 數據讀取時,行存儲一般將一行數據徹底讀出,若是隻須要其中幾列數據的狀況,就會存在冗餘列,出於縮短處理時間的考量,消除冗餘列的過程一般是在內存中進行的。列存儲每次讀取的數據是集合的一段或者所有,若是讀取多列時,就須要移動磁頭,再次定位到下一列的位置繼續讀取。 再談兩種存儲的數據分佈。因爲列存儲的每一列數據類型是同質的,不存在二義性問題。好比說某列數據類型爲整型(int),那麼它的數據集合必定是整型數據。這種狀況使數據解析變得十分容易。相比之下,行存儲則要複雜得多,由於在一行記錄中保存了多種類型的數據,數據解析須要在多種數據類型之間頻繁轉換,這個操做很消耗CPU,增長了解析的時間。因此,列存儲的解析過程更有利於分析大數據。優化

三. 優化

顯而易見,兩種存儲格式都有各自的優缺點:行存儲的寫入是一次性完成,消耗的時間比列存儲少,而且可以保證數據的完整性,缺點是數據讀取過程當中會產生冗餘數據,若是隻有少許數據,此影響能夠忽略;數量大可能會影響到數據的處理效率。列存儲在寫入效率、保證數據完整性上都不如行存儲,它的優點是在讀取過程,不會產生冗餘數據,這對數據完整性要求不高的大數據處理領域,好比互聯網,猶爲重要。spa

改進集中在兩方面:行存儲讀取過程當中避免產生冗餘數據,列存儲提升讀寫效率。操作系統

如何改進它們的缺點,並保證優勢呢?

行存儲的改進:減小冗餘數據首先是用戶在定義數據時避免冗餘列的產生;其次是優化數據存儲記錄結構,保證從磁盤讀出的數據進入內存後,可以被快速分解,消除冗餘列。要知道,目前市場上即便最低端CPU和內存的速度也比機械磁盤快上100-1000倍。若是用上高端的硬件配置,這個處理過程還要更快。

列存儲的兩點改進:1.在計算機上安裝多塊硬盤,以多線程並行的方式讀寫它們。多塊硬盤並行工做能夠減小磁盤讀寫競用,這種方式對提升處理效率優點十分明顯。缺點是須要更多的硬盤,這會增長投入成本,在大規模數據處理應用中是不小的數目,運營商須要認真考慮這個問題。2.對寫過程當中的數據完整性問題,可考慮在寫入過程當中加入相似關係數據庫的「回滾」機制,當某一列發生寫入失敗時,此前寫入的數據所有失效,同時加入散列碼校驗,進一步保證數據完整性。

這兩種存儲方案還有一個共同改進的地方:頻繁的小量的數據寫入對磁盤影響很大,更好的解決辦法是將數據在內存中暫時保存並整理,達到必定數量後,一次性寫入磁盤,這樣消耗時間更少一些。目前機械磁盤的寫入速度在20M-50M/秒之間,可以以批量的方式寫入磁盤,效果也是不錯的。

四. 總結

兩種存儲格式各自的特性都決定了它們不多是完美的解決方案。 若是首要考慮是數據的完整性和可靠性,那麼行存儲是不二選擇,列存儲只有在增長磁盤並改進軟件設計後才能接近這樣的目標。若是以保存數據爲主,行存儲的寫入性能比列存儲高不少。在須要頻繁讀取單列集合數據的應用中,列存儲是最合適的。若是每次讀取多列,兩個方案可酌情選擇:採用行存儲時,設計中應考慮減小或避免冗餘列;若採用列存儲方案,爲保證讀寫入效率,每列數據儘量分別保存到不一樣的磁盤上,多個線程並行讀寫各自的數據,這樣避免了磁盤競用的同時也提升了處理效率。 不管選擇哪一種方案,將同內容數據聚湊在一塊兒都是必須的,這是減小磁頭在磁盤上的移動,提升數據讀取時間的有效辦法。

  

相關文章
相關標籤/搜索