想必在數據量情況少的情況下我們首先想到的時擅長于存儲的常見數據庫如MySQL或者oracle,甚至我們可以將企業的web Server,db Server都裝載到一個服務中,但是隨著時間或者公司的成長數據庫會越來越滿。
這時候我們想到了讀寫分離,使用Master/salve架構,使用Master負責寫操作,使用幾個Salve負責寫操作。
但是隨著壓力增大,Master節點壓力也變大,一般我們采用的是進行垂直分庫,就是將沒有邏輯關系的數據表,分布在不同的數據庫中。當數據一直增大導致一張表的數據會特別大,這樣也會使得一個數據表的查詢變得特別慢,我們只能采取的水平分區的辦法,將一個表的數據量限制在10W,來減輕庫的壓力。
畢竟不是最終的解決辦法,不能解決數據一直激增的存儲問題。Hadoop是通過集群的方式,即通過增加機器的方式解決了數據的存儲問題。
目前oracle雖然可以搭建集群 但是當數據量達到一定限度之后查詢處理速度會變得很慢 且對機器性能要求很高。
SQL數據庫和Hadoop 區別
用向外擴展代替向上擴展
Hadoop集群就是增加更多的機器。一個Hadoop集群的標配是十至數百臺計算機。而不是專注于提高單臺服務器的性能用鍵/值對代替關系表
SQL 針對結構化查詢語句 是結構化數據,hadoop針對的是非結構化數據,文本形式
關系數據庫是 有一定格式,而存放文本、圖片和xml文件 則應該用鍵值對的方式用函數式編程(MapReduce)代替聲明式查詢(SQL)
hadoop讀取出的數據,可以建立復雜的模型或者改變圖片格式用離線批量處理代替在線處理
Hadoop是專為離線處理和大規模數據分析而設計的,它并不適合那種對幾個記錄隨機讀寫的在線事務處理模式。
同時在設計Hadoop時考慮的是對大量數據的存儲和操作,雖然在小量的數據上Hadoop可能不如RDMS,但是大量數據存儲情況下,如HDFS可以存儲超大的文件,更新或修改大部分數據時MapReduce效率大于常見數據的B樹查詢。
為什么不通過使用數據庫加上更多磁盤來做大規模批量分析?為什么我們還需要MapReduce?
1、磁盤驅動器尋址時間的速度遠遠慢于傳輸速率的提高速度,尋址就是將磁頭移動到特定位置進行讀寫操作的工序,它的特點是磁盤操作有延遲,而傳輸速率對應磁盤的帶寬。如果數據的訪問受限于磁盤的
尋址,勢必會導致它花更長的時間來讀或寫大部分數據。
2、在更新一小部分數據的情況下,傳統的B樹效果很好,但在更新大部分數據時,B樹的效率就沒有MapReduce的高,因為它需要使用排序/合并來重建數據庫。
在很多情況下,MapReduce能夠被視為一種RDBMS的補充,MapReduce很適合處理那些需要分析整個數據集的問題,以批處理的方式,尤其是Ad Hoc(自主或即時)分析。RDBMS適用于點查詢和更新
(其中,數據集已經被索引以提供低延遲的檢索和短時間的少量數據更新)。MapReduce適合數據被一次寫入和多次讀取的應用,而RDBMS更適合持續更新的數據集。
為什么數據庫使用B樹索引而非散列索引?
一般關系型數據庫使用B+樹來做索引,NoSQL數據庫用哈希來做索引。MySQL就普遍使用B+Tree實現其索引結構。
因為索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產生磁盤I/O消耗,相對于內存存取,I/O存取的消耗要高幾個數量級,所以評價一個數據結構作為索引的優劣最重要的指標就是在查找過程中磁盤I/O操作次數的漸進復雜度。
因此為了提高效率,要盡量減少磁盤I/O。
為了達到這個目的,磁盤往往不是嚴格按需讀取,而是每次都會預讀,即使只需要一個字節,磁盤也會從這個位置開始,順序向后讀取一定長度的數據放入內存。這樣做的理論依據是計算機科學中著名的局部性原理:
當一個數據被用到時,其附近的數據也通常會馬上被使用。程序運行期間所需要的數據通常比較集中。
根據B Tree的定義,可知檢索一次最多需要訪問h個節點。數據庫系統的設計者巧妙利用了磁盤預讀原理,將一個節點的大小設為等于一個頁,這樣每個節點只需要一次I/O就可以完全載入。為了達到這個目的,在實際實現中B-Tree在每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁里,加之計算機存儲分配都是按頁對齊的,就實現了一個node只需一次I/O。
B-Tree中一次檢索最多需要h-1次I/O(根節點常駐內存),漸進復雜度為O(h)=O(logdN)。一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3)。
綜上所述, 用B-Tree作為索引結構效率是非常高的。
而紅黑樹這種結構,h明顯要深的多。由于邏輯上很近的節點(父子)物理上可能很遠,無法利用局部性,所以紅黑樹的I/O漸進復雜度也為O(h),效率明顯比B-Tree差很多。
B+Tree更適合外存索引,原因和內節點出度d有關。從上面分析可以看到,d越大索引的性能越好,而出度的上限取決于節點內key和data的大小,由于B+Tree內節點去掉了data域,因此可以擁有更大的出度,擁有更好的性能