天天看點

Teradata 資料庫技術概略之四 —— 資料分布機制(3) Hash Map

Teradata根據要存儲的每條記錄的PI值按照某種雜湊演算法生成一個行哈希值,生成的這個行哈希值的前16位或20位代表了這個行哈希值在哈希表中的哈希桶的編号,而這個哈希桶号則決定了這條記錄具體會被分布到哪個AMP上,那麼,Teradata是如何根據哈希桶号就知道把資料分布到對應的AMP上的呢?這就要通過本篇所要讨論的Hash Map(至于Hash Map,我一直也找不到合适的中文譯法,稱為“哈希地圖”或者“哈希圖”都有那麼點意思,但我感覺都不太好,是以在後面的介紹中,我就都直接使用Hash Map了)。

我們可以把Hash Map了解成一種機制,它最終使得Teradata把某個資料記錄分布到某個AMP上。在邏輯上,可以認為Hash Map是一個二維表,表中總共包含了65536或者1048576個單元格,每個單元格中記錄了一個哈希桶号,而這個哈希桶号唯一對應了Teradata系統中的一個AMP,整個二維表中,會有多個哈希桶号對應到一個AMP上。

根據上面的描述可以得出這樣的結論:(1)對于一個給定的Teradata系統,Hash Map的内容是确定的;(2)對于多個不同的Teradata系統,如果它們使用相同的哈希桶數(65536或者1048576),而且它們包含了相同的AMP個數,那麼,它們的Hash Map是完全相同的,是可互換的。

由于Teradata系統要保證資料記錄盡可能均勻地分布到系統中所有的AMP上,也就是說65536或者1048576個哈希桶号要盡可能平均地對應到每個AMP上,但由于AMP個數的原因,這個“平均”往往不可能真正做到。我們舉例說明,假設系統使用65536個哈希桶,系統中共有200個AMP,那麼我們可以計算得出:其中136個AMP上會配置設定到328個哈希桶,而另外的64個AMP上會配置設定到327個哈希桶。這就導緻了在資料分布上的“傾斜”(Skew)的問題,而且這種傾斜通常是不能避免的。可以計算一下傾斜率:

(328-327)÷ 328 × 100 = 0.31%

下面的表格列出了在系統配置為65536個哈希桶時,不同AMP數的情況下的傾斜率:

AMP數目

每個AMP上的

哈希桶數 下限

每個AMP上的

哈希桶數 上限

傾斜率(%)

100

655

656

0.15

200

327

328

0.31

300

218

219

0.46

400

163

164

0.61

500

131

132

0.76

1000

65

66

1.52

2000

32

33

3.03

3000

21

22

4.55

4000

16

17

5.88

5000

13

14

7.14

可以看到,随着AMP數的增加,傾斜率也在近似線性地增加,是以在建設Teradata系統的時候,對系統的哈希桶數要進行慎重選擇,Teradata的推薦做法是:當系統中的AMP數大于1000時,把系統的哈希桶數設定為1048576,以盡量減小資料分布的傾斜率。

在Teradata系統中,Hash Map是一直駐留在記憶體的,系統建立完成後,Hash Map就一直存在且一成不變,直到系統的哈希桶數被改變或者系統中的AMP數發生了變化(由于變化的代價很高,這兩種情況都不常見)。Hash Map是由BYNET維護的,并且在生成後會被複制傳送到系統中的每個節點(并非AMP)上。

為了滿足不同的管理需要,每個Teradata系統都同時存在着五種不同類型的Hash Map,它們分别是 Current Configuration Primary Map、Current Configuration Fallback Map、Reconfiguration Primary Map、Reconfiguration Fallback Map、Bit Map Hash Map。關于這些Hash Map的具體作用和互相之間的不同之處,請參考Teradata的相關資料。

Teradata系統通過Hash Map把資料記錄分布到AMP上,資料記錄到達AMP後,AMP會根據該資料記錄的RowID來确定該資料記錄具體存儲在存儲媒體的什麼位置上。

資料分布機制小結:

  • Teradata是通過哈希運算對資料記錄進行系統範圍的均勻分布的;
  • 資料記錄的PI經過哈希計算得出行哈希值,該行哈希值中包括了哈希桶号,系統根據這個哈希桶号把資料記錄分布到指定的AMP上,這一過程是通過Hash Map來實作的;
  • 為了保證每個資料記錄在整個系統中唯一性,Teradata由AMP為每個資料記錄生成一個32位長度的唯一值(UV),這個唯一值與行哈希值一起組成RowID,這個RowID在整個Teradata系統中唯一代表了這條資料記錄;
  • AMP根據資料記錄的RowID安排資料記錄的實體存儲位置;