写在前面

本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定大数据理论体系

解答

1. hash
2. consistent hash without virtual node
3. consistent hash with virtual node
4. range based

补充

为什么要数据分片?

分布式是解决把一个大任务细分为多个小任务。 大任务我们是知道了的。

那么,问题来了,我们该怎么分,怎么根据每个独立计算机的特点进行分配,这就是我们要解决的数据分片问题。

  1. 怎么按数据的特征,以及独立计算机的特点进行匹配划分?
  2. 怎么把属于某个数据,转移到适合他的独立计算机上?
  3. 增加了新的独立计算机,怎么分配数据?
  4. 独立计算机的管理问题,怎么知道哪类数据是在哪个模块?

笔者总结,目前在流行的分布式大数据技术框架中共有 4 种数据分片手段

hash

哈希表,特点:简单。由于他的简单,也就不存在上面提的独立计算机管理的问题(为了方便理解,把每个独立计算机储存数据的特征当做元数据)。

按照数据的某一特征来计算哈希值,并将哈希值与系统中的节点建立映射关系,从而将哈希值不同的数据分布到不同的节点上。

缺点是每增加新的独立计算机,需要大量的移动数据。

假设先有3个机器,每个机器对应平均分配一个hash值的区域,按id来计算hash值,再进行分配,得到以下情况。这些R1,R2,R3就是元数据。

hash分片1

若是再增加一个机器,每个机器对应的一个hash值的区域就发生改变。原有的id的hash值,可能不在原有的机器中,需要发生数据转移。比如下图中的 R2 从 Node0 转移到 Node2。

hash分片2

此外,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的元数据管理相对复杂一些,需要记录每个节点的数据区间范围,特别单个节点对于多个区间的情况。而且,在数据可修改的情况下,如果块进行分裂,那么元数据中的区间信息也需要同步修改。

Q.E.D.


Apache Spark Contributor