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安排数据记录的物理存储位置;