写在前面
本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定大数据理论体系
解答
1. hash
2. consistent hash without virtual node
3. consistent hash with virtual node
4. range based
补充
为什么要数据分片?
分布式是解决把一个大任务细分为多个小任务。 大任务我们是知道了的。
那么,问题来了,我们该怎么分,怎么根据每个独立计算机的特点进行分配,这就是我们要解决的数据分片问题。
- 怎么按数据的特征,以及独立计算机的特点进行匹配划分?
- 怎么把属于某个数据,转移到适合他的独立计算机上?
- 增加了新的独立计算机,怎么分配数据?
- 独立计算机的管理问题,怎么知道哪类数据是在哪个模块?
笔者总结,目前在流行的分布式大数据技术框架中共有 4 种数据分片手段
hash
哈希表,特点:简单。由于他的简单,也就不存在上面提的独立计算机管理的问题(为了方便理解,把每个独立计算机储存数据的特征当做元数据)。
按照数据的某一特征来计算哈希值,并将哈希值与系统中的节点建立映射关系,从而将哈希值不同的数据分布到不同的节点上。
缺点是每增加新的独立计算机,需要大量的移动数据。
假设先有3个机器,每个机器对应平均分配一个hash值的区域,按id来计算hash值,再进行分配,得到以下情况。这些R1,R2,R3就是元数据。
若是再增加一个机器,每个机器对应的一个hash值的区域就发生改变。原有的id的hash值,可能不在原有的机器中,需要发生数据转移。比如下图中的 R2 从 Node0 转移到 Node2。
此外,hash方式很难解决数据不均衡问题,假设这里面是按员工的薪水进行计算hash值,实际人群中,可能处于平均薪水10k 左右的人比较多,高薪水的人比较少这导致某些机器上的数据很大,某些机器上的数据很小。
这种现象在大数据领域叫作:数据倾斜。
没有虚拟节点的一致性哈希(consistent hash without virtual node)
有虚拟节点的一致性哈希(consistent hash with virtual node)
以上 2 个请参考我的另外一篇博客——一致性哈希是什么?
基于范围进行分片(range based)
简单来说,就是按照关键值划分成不同的区间,每个物理节点负责一个或者多个区间。其实这种方式跟一致性hash有点像,可以理解为物理节点在hash环上的位置是动态变化的。
还是以上面的数据举例,三个节点的数据区间分别是N0(0, 200], N1(200, 500], N2(500, 1000]。那么数据分布如下:
注意,区间的大小不是固定的,每个数据区间的数据量与区间的大小也是没有关系的。比如说,一部分数据非常集中,那么区间大小应该是比较小的,即以数据量的大小为片段标准。
在实际工程中,一个节点往往负责多个区间,每个区间成为一个块(chunk、block),每个块有一个阈值,当达到这个阈值之后就会分裂成两个块。这样做的目的在于当有节点加入的时候,可以快速达到均衡的目的。
如果一个节点负责的数据只有一个区间,range based与没有虚拟节点概念的一致性hash很类似;如果一个节点负责多个区间,range based与有虚拟节点概念的一致性hash很类似。
range based的元数据管理相对复杂一些,需要记录每个节点的数据区间范围,特别单个节点对于多个区间的情况。而且,在数据可修改的情况下,如果块进行分裂,那么元数据中的区间信息也需要同步修改。