概念
目前主流的大資料儲存與計算系統通常採用橫向擴充套件(scale out)的方式支援系統可擴充套件性,即通過增加機器數目來獲得水平擴充套件能力。對於待儲存處理的海量資料,需要通過資料分片(shard/partition)來將資料進行切分並分配到各個機器中去,資料分片後如何找到某條記錄的儲存位置就成為必然要解決的問題,這一般被稱為資料路由(data routing)。資料分片和資料路由的抽象模型如下圖所示:
雜湊分片(hash partition)
最為常見的3種雜湊分片方式分別為:round robin、虛擬桶和一致性雜湊方法。
(1)路由問題
通過以上方式就可以將海量資料分不到集群中的不同節點中,實現資料分片功能。那麼如何根據key和雜湊函式h來定位到記錄內容呢?
一種直觀的解決辦法就是沿著有向環順序查詢,如果h(key)在本節點管理範圍內就返回結果,如果不在則將其交給後繼節點繼續查詢,這樣最多遍歷所有節點就可以給出結果。
很明顯以上方法是乙個低效的查詢方式,為例加快查詢速度,可以為每個節點配置路由表。路由表儲存m條路由資訊(m為雜湊空間的二進位制數值位元位長度,即雜湊空間長度=2^m),其中第i項儲存距離當前節點距離為2^i的資料節點。如n14的節點路由表如下所示:
距離1(2^0)
2(2^1)
4(2^2)
8(2^3)
16(2^4)
機器節點
n20n20
n20n25n5
演算法:假設當前執行操作的節點為nc,其初始值為ni,nc的後繼節點為ns,重複執行下列步驟。下圖為n14節點接收到h(key)=27時的查詢過程:步驟1,判斷是否c < j <= s,如果為真,則結束查詢,說明key如果存在,則在nc的後繼節點ns上,ns返回結果。
步驟2,否則,nc查詢路由表,找到小於j的最大編號節點nh(如果所有路由項都大於j,則選擇第m-1項作為nh),nc向nh傳送訊息,由nh代為查詢,nh此時作為新的nc繼續按照步驟1,步驟2遞迴進行查詢。
此演算法的時間複雜度為o(logn),類似於二分查詢。
(2)加入新節點
如果p2p網路加入乙個新節點nnew,首先nnew能夠和任意節點nx進行通訊,通過nx按照「路由演算法」查詢nnew的對應雜湊值h(nnew)=new,找到nnew的後繼節點ns,假設ns的前趨節點為np,那麼需要做兩件事將nnew加入網路:
一. 改變np、nnew和ns的前趨後繼節點記錄,以體現新的網路架構。
二. 資料的重新分片與分布,將ns節點中儲存的應該由nnew承載的資料(ns節點上雜湊值小於等於new的記錄)遷移到nnew節點上。
在非併發環境中以上事務較易完成,但是在併發環境中,可能np和ns之間同時有多個節點加入,為了避免出現問題,需按照以下兩個步驟完成:
一. 將nnew的後繼節點設定為null。
二. 這一步並非為新加入節點設立的,而是所有節點週期性自動完成,穩定性檢測。
演算法:示例,將n8加入上述網路步驟1,假設ns為nc的後繼節點,nc向ns詢問其前趨節點np,ns向ns答覆,一般情況下,如果np=nc則轉入第4步。
步驟2,如果np介於nc和ns之間,nc記錄下np為其後繼節點。
步驟3,令nx是nc的後繼節點,其可能是ns或者np,這取決於步驟2的判斷結果。如果nx的前趨節點為空或者nc位於nx和它的前趨節點之間,那麼nc給nx發訊息告訴nx,nc就是nx的前趨節點,nx將其前趨節點設定為nc。
步驟4,nx將其部分資料遷移到nc上,即將nx上雜湊值小於等於c的記錄遷移到nc上。
1.根據步驟一,將n8的後繼節點設為n14,前趨節點置為null,如下圖所示:
2.n8進行穩定性檢測,步驟1中,n8發現n14的前趨節點不是自己,進入步驟2,由於n5沒有介於n8和n14之間,所以直接進入步驟3,因為n8位於n5和n14之間,所以n8向n14發訊息,告知n14的前趨節點改為n8,n14的前趨指向n8,如下圖所示:
3.進入步驟4,n14將部分資料遷移到n8。
一段時間後,n5開始進行穩定性檢測,經過步驟n5被告知,n14的前趨節點是n8而不是自己,所以進入步驟2,由於n8介於n5和n14之間,所以n5將後繼節點改為n8,如下圖所示:
進入步驟3,由於n8的前趨節點為空,所以n5通知n8其前趨節點為n5,所以n8將前趨節點置為n5,如下圖所示:
進入步驟4,n8沒有需要向n5遷移的資料,結束。
這樣,n8節點就順利的加入了網路。
(3)當前節點離開網路
當前節點離開網路有兩種方式:正常離開和異常離開。正常離開的節點在離開前可以做些準備工作,包括通知相應節點修改前趨後繼以及將持有資料遷移到相應機器上。異常離開通常是由於機器故障導致,為避免資料丟失,可以採用將資料備份的方式解決。
關於路由表失效問題,可以通過對每個節點定期檢查路由表的方式解決。
(4)虛擬節點
上述一致性雜湊演算法存在兩個問題,乙個是資料對映是隨機的,可能導致集群的負載不均衡,另乙個是集群中的節點存在效能上的差異,可能會導致低效能節點高負載的情況,而且新節點加入時只能緩解其後繼乙個節點的容量飽和問題,不能有效的緩解集群中其他節點的容量飽和問題。針對以上問題,引入「虛擬節點」的概念,即將一台物理機器虛擬成若干個虛擬節點,分別對映到一致性雜湊環的不同位置。這樣就解決了上述問題。
3 . 範圍分片(range partition)
範圍分片首先將所有記錄主鍵進行排序,然後在排好序的主鍵空間裡將記錄劃分成資料分片,每個資料分片儲存有序的主鍵空間片段內的所有記錄。保持乙個資料分片的對映表,表中每一項記在資料分片的最小主鍵及其對應的物理機位址,在對記錄進行增刪改時,查詢對映表找到其對應的物理機,置於分片資料在物理機的管理方式往往採用lsm樹(log structured merge trees),這是一種高效的資料索引結構。範圍分片的模型如下圖所示:
《大資料日知錄 架構與演算法》前言
大資料日知錄 架構與演算法 前言 像移動網際網路 o2o 可穿戴裝置等概念一樣,大資料 從甫一提出到颶風般席捲並風靡全球,從最初的技術名詞到形成滲透各行各業的社會現象,所耗時間僅幾年而已,其興也勃焉。那麼,大資料是否會像很多曾經火熱現在已難覓蹤跡的流行概念一樣,將來某日,人們靜心抬眼,發現風已去而水...
《大資料日知錄 架構與演算法》試讀 隨想
隨想一 大資料是什麼?做為一位技術人員,如果有人問我,大資料是什麼我該如何解答?1.現在你去蘇寧購物,蘇寧每天上萬的 量,蘇寧 提供免費的wifi,乙個月下來有幾十萬的 量,一年有上百萬的 量,這些流量背後就是活生生的資料,這些由量拼成的資料就是大資料.隨想二 大資料有什麼價值呢?拿上面的例子來說....
聯合之大資料(一 資料起源)
資料其實是乙個很常見的東西,怎麼地呢?比如 有乙個孩子叫小明從小學到初中再到高中這三個階段,如果每乙個階段他的學習成績都很好在班上甚至整個年級每次考試都能名列前茅,那麼在他考大學的時候他的父母 老師 同學認為他考上重點大學的可能性就很高。這個可能性是從何而來?如果我們讓乙個陌生人看一眼小明沒有其他的...