海量數據處理

 海量數據處理是基於海量數據上的存儲、處理、操作。

       所謂海量,就是數據量很大,可能是TB級別甚至是PB級別,導致無法一次性載入內存或者無法在較短時間內處理完成。面對海量數據,我們想到的最簡單方法即是分治法,即分開處理,大而化小,小而治之。我們也可以想到集羣分佈式處理。


1 海量數據的存儲:爲大數據分析做準備


傳統關係型數據庫
        傳統關係型數據庫在數據存儲上主要面向結構化數據,聚焦於便捷的數據查詢分析能力、按照嚴格規則快速處理事務(transaction)的能力、多用戶併發訪問能力以及數據安全性的保證。其結構化的數據組織形式,嚴格的一致性模型,簡單便捷的查詢語言,強大的數據分析能力以及較高的程序與數據獨立性等優點獲得廣泛應用。  但是 面向結構化數據存儲的關係型數據庫已經不能滿足當今互聯網數據快速訪問、大規模數據分析挖掘的需求。
它主要缺點:
1) 對於半結構化、非結構化的海量數據存儲效果不理想。像電子郵件、 超文本、標籤(Tag)以及圖片、音視頻等各種非結構化的海量數據。
2)關係模型束縛對海量數據的快速訪問能力: 關係模型是一種按內容訪問的模型。即在傳統的關係型數據庫中,根據列的值來定位相應的行。這種訪問模型,會在數據訪問過程中引入耗時的輸入輸出,從而影響快速訪問的能力。雖然,傳統的數據庫系統可以通過分區的技術(水平分區和垂直分區) ,來減少查詢過程中數據輸入輸出的次數以縮減響應時間, 提高數據處理能力, 但是在海量數據的規模下,這種分區所帶來的性能改善並不顯著。 
3)在海量規模下, 傳統數據庫一個致命弱點, 就是其可擴展性差。
非集中式數據存儲管理系統
       Dynamo是亞馬遜的key-value模式的存儲平臺,可用性和擴展性都很好,性能也不錯:讀寫訪問中99.9%的響應時間都在300ms內。
在 Dynamo 中,數據按照鍵/值對(key-value)進行組織,主要面向原始數據的存儲。這種架構下,系統中每個節點都能相互感知,自我管理性能較強,沒有單點失效。 
       Bigtable 是谷歌開發的一套結構化存儲系統。數據以多維順序表的方式進行存儲。整個系統採用傳統的服務器羣形式,由一個主控服務器和多個子表服務器構成,並使用分佈式鎖服務 Chubby進行容錯等管理。這種架構下,將存儲(依靠 GFS)和服務的管理分離開來,簡化了管理難度,易於維護且人爲可控。但是由於底層存儲依賴分佈式文件系統,使得Bigtable 只能在集羣中部署。 
      hadoop中Hbase就是Google BigTable的開源實現。
       CassandraCassandra最初由Facebook開發,後轉變成了開源項目. 是一套採用對等網絡計算(peer to peer,P2P)技術實現的結構化數據存儲系統。以Amazon專有的完全分佈式的Dynamo爲基礎,結合了Google BigTable基於列族(Column Family)的數據模型.P2P去中心化的存儲。很多方面都可以稱之爲Dynamo 2.0。
      與 Dynamo 有所不同的是,Cassandra 採用類似 Bigtable 的多維表數據模型組織數據。其主要功能比Dynamo更豐富,但支持度卻不如文檔存儲MongoDB(介於關係數據庫和非關係數據庫之間的開源產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。支持的數據結構非常鬆散,是類似json的bjson格式,因此可以存儲比較複雜的數據類型。)
主要特性:
  ● 分佈式
  ● 基於column的結構化
  ● 高伸展性

2  海量數據處理 

       海量數據處理就是如何快速地從這些海量數據中抽取出關鍵的信息,然後提供給用戶。
並行計算解決方案:
     解決大規模數據處理的方法之一就是並行計算。將大量數據分散到多個節點上,將計算並行化,利用多機的計算資源,從而加快數據處理的速度。目前,這種並行計算的模型主要分爲三大類:
一類是廣泛應用於高性能計算的 MPI技術,
一類是以谷歌/雅虎爲代表的互聯網 互聯網海量數據存儲和處理技術綜述 企業興起的 Map/Reduce計算,
一類是微軟提出的 Dryad[並行計算模型。
1)MPI 
      MPI 即消息傳遞接口(MessagePassing Interface),是一種編程接口標準,而不是一種具體的編程語言。
      MPI 是一種工業標準的 API規範,專爲在多處理器計算機、計算機集羣和超級計算機上進行高性能計算而設計。該標準是由大量計算機供應商和軟件開發商於 1994 年共同設計完成。 
       MPI 作爲目前國際上最流行的並行編程環境之一,因其良好的可移植性和易用性、完備的異步通信功能等優點,而在機羣高性能計算中得到廣泛應用。在基於 MPI 編程模型中,計算任務是由一個或多個彼此間通過調用庫函數進行消息收、發通信的進程所組成。絕大部分 MPI 實現在程序初始化時生成一組固定的通信進程。這些進程在不同的節點上運行(通常一個處理器一個進程) ,執行着相同或不同的程序,以點對點通信或者集合通信的方式進行進程間交互,共同協作完成同一個計算任務。 
      以任務之間的消息傳遞驅動的 MPI,其進行大規模數據處理的基本思路就是,將任務劃分成爲可以獨立完成的不同計算部分, 將每個計算部分需要處理的數據分發到相應的計算節點分別進行計算,計算完成後各個節點將各自的結果集中到主計算節點進行結果的最終彙總。 
2) MapReduce 
       MapReduce是谷歌在 2004 年提出的應用於大規模集羣進行大規模數據處理的並行計算模型。 Map(映射)和 Reduce(化簡)的概念,以及他們的主要思想,都來自於函數式語言。
       在一個計算任務中,計算被抽象並簡化成爲兩個階段:Map 和 Reduce。Map 階段,系統調用用戶提供的 Map 函數,完成從一組鍵值到新一組鍵值的映射計算;而 Reduce 階段,用戶指定的 Reduce 函數則被用來將所有 Map 計算完成的結果進行一次化簡歸約。 與 MPI 有所不同的是,Map/Reduce 是通過將計算(Map 或者Reduce)分發到相應的數據存儲節點或靠近的節點,讓計算(Map 或者 Reduce)在數據存儲節點就地或者就近完成,儘可能減輕大量數據在網絡上傳輸所產生的壓力。

3)Dryad

       Dryad 是微軟在 2007 年提出的數據並行計算模型。目前已經在 Microsoft Ad’Center 投入使用。 與 MapReduce的思路類似, Dryad 也是通過將計算任務移動到相應的數據存儲節點或靠近的節點,讓計算就地或者就近完成,從而減輕網絡上傳輸的壓力。 在 Dryad 中,每個計算任務被表示成一個有向無環圖(Directed Acyclic Graph, DAG) ,計算任務按照有向無環圖的方向按照依賴關係執行。DAG 相對於兩階段式的 MapReduce,可以表達更加豐富的計算類型;同時,它支持在子任務之間通過 TCP管道、Shared-memory FIFOs(共享內存先進先出)進行結果傳遞,儘量避免一些不必要的磁盤輸入輸出,加速計算的執行。
 
如果從數據結構和算法來考慮處理海量數據:
  1. Bloom Filter
  2. Hash統計和映射
  3. Bit-Map
  4. 堆(Heap)/快速/歸併排序
  5. 雙層桶劃分
  6. 數據庫索引
  7. 倒排索引(Inverted Index)
  8. 外排序
  9. Trie樹
      這些都是針對特定場景,在大量數據中(1千萬以上)中,選出最大的k個數或者是頻率最高的前k條文本數據等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章