硬件成本的快速降低,使得電子設備的無處不在成爲可能,數據無處不在,無時不在.算法
IBM用3V(Volume,Velocity,Variety)來描述大數據的特色,後來又增長了Value這個維度,即價值密度低的數據成爲大數據,須要從低價值的原始海量數據中進行深度挖掘和計算,總結出具備高價值的數據.sql
CAP/ACID/BASE三者的關係數據庫
ACID和BASE原則是在明確提出CAP理論以前關於如何對待可用性和強一致性的兩種徹底不一樣的設計哲學.ACID更強調數據一致性,這是傳統數據庫設計思路.而BASE更強調可用性,弱化數據強一致性的概念,這是互聯網時代對於大規模分佈式數據系統的一種需求,尤爲是其中的軟狀態和最終一致性,這二者是在容忍分區情形下強調可用性的具體手段.數組
布隆過濾器是由Howard Bloom在1970年提出的二進制向量數據結構,具備很好的空間和時間效率,尤爲是空間效率極高,常常用於檢測某個元素是否在巨量數據集合中的成員.緩存
BF能夠高效地表徵集合數據. 其使用長度爲m的位數組來存儲集合信息. 同時使用k個相互獨立服務器
的哈希函數將數據映射到位數組空間.網絡
其基本思想以下:首先.將長度爲m的位數組元素所有置爲0 對於集合S中的某個成員a,分別使k個哈希函數對其計算. 若是數據結構
則將位數組的第x位置爲1,對於成員a來講, 通過k個哈希函數計算後. 可能會將位數組中的W架構
位(w<=k)設置爲1.對於集合中的其餘成員也如此處理,這樣便可完成位數組空間的集合表示app
由於BF使用位數組和哈希函數來表徵集合. 並不須要實際存儲集合數據自己內容,因此空間利用率很是高. 可是有個潛在問題. 即在查詢某個成員是否屬於集合時,會發生誤判(False Resitive)
SkipList由Wil1iam Pugh於1990年提出,這是一種可替代平衡樹的數據結構.不像平衡樹須要強制保持樹的平衡. SkipList 依靠隨機生成數以必定機率來保持數據的平衡分佈。 儘管在最壞狀況下skipList的效率要低於平衡樹. 可是大多數狀況下其效率仍然常,其插入、刪除、查找數據的時間複雜度都是O(log(N)).
LSM樹(Log-structured Merge-tree)的本質是將大量的隨機寫操做轉換成批量的序列寫. 這樣能夠極大地提高磁盤數據寫入速度, 因此LSM樹很是適合對寫操做效率有高要求的應用場景.可是其對應付出的代價是讀效率有所下降. 這每每能夠引入Bloom Filter或者緩存等優化措施來 對讀性能進行改善.
Merkle哈希樹由Ralph Merkle於l979年發陰 . 因故得此名.通常還將其稱爲Merkle樹或哈
希樹(Hash Tree). Merkle樹最初用於高效Lamport簽名驗證.後來被普遍應用在分佈式領域,主要用來在海量數據下快速定位少許變化的數據內容(變化緣由多是損毀、篡改或正常變化.
比特幣也引用了Merkle樹對交易進行驗證.
Snappy是Google開源出的高效數據壓縮與解壓縮算法庫, 其目標並不是是最高的數據壓縮率, 而
是在合理的的壓縮率基礎上追求儘量快的壓縮和解壓縮速度, 其壓縮和解壓縮速度極快, 能夠在單核處埋器上達到250MB/S的壓縮效率和500MB/s的解壓縮效率。與此同時,snappy相比其餘壓縮方案佔用CPU時間更少.
數據壓縮與解壓縮本質上是經過增長CPU計算時間成本採換取較小的存儲成本以及網絡和I/O傳輸成本.若是隻是追求存儲成本最小化.Snappy這種技術方案是不適用的, 可是對於不少情形,
在合理壓縮率狀況下追求最高的壓縮和解壓縮速度比單純追求最小的存儲成本更重要。
與霍夫曼編碼這種統計編碼不一樣, LZ77是一種動態詞典編碼 (Dictionary Coding). 詞典編碼的基本思路是: 文本中的詞用它在詞典中表示位置的號碼代替的無損數據壓縮方法, 通常分爲靜態詞典方法和動態詞典方法兩種
Kafka經過消息副本機制提供了高可用的消息服務,其副本管理單位不是Topic消息隊列,而是Topic的數據分片(Partition)。在配置文件裏能夠指定數據分片的副本個數,在多個副本里,其中一個做爲主副本(Leader),其餘做爲次級副本(Slave)。因此針對這個數據分片的消息讀/寫請求都由主副本負責響應,次級副本只是以主副本數據消費者的方式從主副本同步數據;當主副本發生故障時,Kafka將其中某個次級副本提高爲主副本,以此來達到整個消息系統的高可用性。
Kafka未使用相似Zab或Paxos協議的多數投票機制來保證主備數據的一致性,而是提出一種稱爲ISR(In-Sync Replicas)的機制保證數據一致性。緣由是若是副本個數是2f+1,那麼多數投票機制最多容許f歌副本發生故障,即若是須要1個副本容錯,至少要保持3個數據副本,若是須要2個副本容錯,至少要維護5個數據副本。考慮到消息系統的應用場景,只容許1個副本容錯過於脆弱,至少要支持2個副本容錯,即至少要維護5個數據副本,效率過低。
ISR的運行機制以下:將全部次級副本數據分到兩個集合,其中一個被稱爲ISR集合,這個集合備份數據的特色是即時和主副本數據保持一致,而另一個備份數據容許其消息隊列落後於主副本的數據。在作豬唄切換時,只容許從ISR集合中選擇候選主副本,這樣可保證切換後新的主副本數據狀態和老的主副本保持一致。在數據分片進行消息寫入時,只有ISR集合內全部備份都寫成功才能認爲此次寫入操做成功。在具體實現時,Kafka利用Zookeeper來保存每一個ISR集合的信息,當ISR集合內成員變化時,相關構件也便於通知。經過這種方式,若是設定ISR集合大小爲f+1,那麼最多可容許f個副本故障。
使用 磁盤讀/寫根本且普適的原則是:儘量避免隨機讀/寫,同時儘量利用順序讀/寫,即連續讀/寫整塊數據。
Kafka高效處理大批量消息的重要緣由是將讀/寫操做盡量轉換爲順序讀/寫,好比相似於Log文件方式的文件尾部追加寫。另外,Kafka涉及將文件內容經過網絡進行傳輸,爲提高效率,Kafka採用Linux操做系統的SendFile調用。爲了不屢次數據複製,操做系統能夠直接將數據從內核頁緩存中複製到網卡緩存,這樣能夠加大整個過程的速度。
分佈式系統中一個重要的研究內容是如何將數據通知到網絡中的多個接收方,通常稱爲多傳播通訊。
Gossip原意是謠言或小道消息,Gossip協議被稱爲感染協議(Epidemic Protocol)。
Gossip協議用來儘快將本地更新數據通知到網絡中的全部其餘節點,更新模型可分爲3種:
所有通知模型,反熵模型,散佈謠言模型。
GFS在實際存儲時首先會將不一樣大小的文件切割成固定大小的數據塊,每一塊稱稱爲一個Chunk,一般設定大小爲64MB。
GFS系統化內部須要維護文件名稱到其對應的多個Chunk之間的映射關係,Chunk服務器負責對Chunk的實際存儲,同時響應GFS客戶端對本身負責的Chunk的讀/寫操做。
Google的雲存儲平臺有個顯著的特色,就是大量採用主從結構,即單一的主控服務器和衆多的存儲服務器,主控服務器主要從事系統元數據存儲管理及整個分佈式系統的管理,好比負載均衡,數據在存儲服務器之間遷移,檢測新加入的機器及失效機器等工做。
採用主從結構的好處是整個系統存在一個全局的主控節點,管理相對簡單,缺點是由於主控節點是惟一的,不少服務請求都需通過主控服務器,很容易稱爲整個系統的瓶頸,另外,存在單點失效問題,若是主控服務器癱瘓,整個系統不可用。
爲了增長存儲系統的可靠性和數據的可用性,常用數據備份來達到這一點,一般的作法是對數據作3備份,但數據備份帶來的缺點是增長存儲成本。常見的解決方案是對於熱點數據,在大規模存儲系統中仍然保留3個備份,對於冷數據,只保留1分數據,經過糾刪碼保證數據的可靠性。
糾刪碼經過對原始數據進行校驗並保留校驗數據,以增長冗餘的方式保證數據的可恢復性。極大距離可分碼(Maximum Distance Separable Codes,MDS)是一種經常使用的糾刪碼,其將數據文件切割爲等長的n個數據塊,並根據這n個數據塊生成m個冗餘的校驗信息,使得n+m塊數據中即便任意m塊數據損失,也可經過剩下n塊數據對m塊損失的數據進行重構,以此倆完成數據容錯功能。
和傳統的MMP架構(並行數據庫系統)相比,MapReduce更適合非結構化數據的ETL處理累操做,且其可拓展性及容錯性明顯佔優,但單機處理效率低。儘管MR提供了簡潔的API和完善的容錯處理機制,使得大規模兵法處理海量數據稱爲可能,但從發展趨勢看,相對複雜的任務轉換爲MR任務開發效率不夠高,因此有逐步封裝到下層的趨勢,即在上層系統提供更簡潔的API,在底層由系統自動轉換爲大量MR任務。
DAG是有向無環圖(Directed Acyclic Graph)的簡稱。在大數據處理中,DAG計算經常指的是將計算任務在內部分解成爲若干個子任務,將這些子任務之間的邏輯關係或順序構建成DAG(有向無環圖)結構。DAG計算模型能夠認爲是對MR計算機制的一種拓展。
Hive是Facebook設計並開源的構建在Hadoop基礎之上額度數據倉庫解決方案,與傳統數據倉庫相比,Hive能處理超大規模的數據且有更好的容錯性。Hive的本質思想是爲Hadoop存儲的數據增長模式(schema),併爲用戶提供sql語言,Hive將類sql語言轉換爲一系列MR任務來實現數據的處理,以此手段達到便利操做數據倉庫的目的。
Hive的缺點是查詢處理效率較低,是MR固有的一些特性致使的,主要是由於Hive和Hadoop綁定關係太緊密緻使的。
機器學習的目的是從數據中自動習得模型,對未知數據進行預測,近期學習的任務是從數據中學習決策函數fx-->y,這個決策函數將輸入變量x映射到輸出空間的輸出變量y中,即根據輸入產生預測。