Database HBase区域中的数据可以根据family:列的值手动排列

Database HBase区域中的数据可以根据family:列的值手动排列,database,hadoop,hbase,apache-zookeeper,Database,Hadoop,Hbase,Apache Zookeeper,我已经在HBase上工作了几周,我的项目仍处于设计状态,正在进行POC。现在,在我提问之前,让我简要描述一下我的推论 HBase中水平可伸缩性的基本单元称为区域。区域是表数据的子集,它们本质上是存储在一起的连续、排序的行范围。 当区域在添加更多行后变得过大时,将在中间关键点处将区域拆分为两个,从而创建两个大致相等的半区域 因此,HBase表的多映射结构可以总结为 键->族->列->时间戳->值 HBase在内部保留名为-ROOT-and.META的特殊目录表。它在其中维护集群上漂浮的所有区域的当

我已经在HBase上工作了几周,我的项目仍处于设计状态,正在进行POC。现在,在我提问之前,让我简要描述一下我的推论

HBase中水平可伸缩性的基本单元称为区域。区域是表数据的子集,它们本质上是存储在一起的连续、排序的行范围。 当区域在添加更多行后变得过大时,将在中间关键点处将区域拆分为两个,从而创建两个大致相等的半区域

因此,HBase表的多映射结构可以总结为 键->族->列->时间戳->值

HBase在内部保留名为-ROOT-and.META的特殊目录表。它在其中维护集群上漂浮的所有区域的当前列表、状态和位置。根表保存.META的列表。表格区域。元。表包含所有用户空间区域的列表。这些表中的条目按区域名称进行键控,其中区域名称由该区域所属的表名、该区域的起始行、其创建时间以及所有前者的MD5哈希组成

一个区域中可以存储的行数取决于为一个区域定义的阈值,即我认为可以手动给定的值

所以我想做的是:-

如果一个具有USERID、ROLE和YEAR的表是包含数百万元组的表。我想创建两个层。 一层,区域节点根据年份范围进行区分。假设一个地区存储了1990-1995年的数据,另一个地区存储了1996-2000年的数据,依此类推。 &第二层在角色上有差异。例如,一个区域节点保存管理员id-1的数据,另一个保存用户SID-2的数据,依此类推。 每个层都有自己的区域服务器,映射到ZOOKEEPER管理的元表和元表中。 有关进一步澄清,请参阅下图:-

也许不止一个动物园管理员可以同步工作,由他们上面的另一个动物园管理员管理


这就是我将要提出的设计,我想询问它的可行性

如果您创建这两个表,hbase将在需要时自动进行拆分和重新平衡。 如果要手动预拆分表,在创建时可以为每个表指定所需的键范围集,hbase将为每个范围创建一个区域。然后,平衡器将负责将不同的区域分配到不同的机器。 你不需要关心Zookeeper,-ROOT-或.META


谢谢你的关注。根据您的回复,我可以手动定义区域的范围,但所有这些区域将由谁保持同步。这不是zookeeper的工作吗?zookeeper只用于存储一些元数据以引导客户端,并在内部跟踪瞬态。有关更多详细信息,请参阅本文。但是从客户端的角度来看,ZooKeeper仅用于获取承载元数据的元数据表的地址。一旦有了元表,就有了区域服务器和区域之间的映射。当您执行Put或Get操作时,将咨询META以询问由哪台计算机负责处理此密钥,并将请求发送到区域服务器。假设您使用单个区域创建了一个表并开始插入数据。HBase会将该区域添加到元表中,分配/平衡器会选择一个区域服务器来承载该区域。一旦该地区增长过快。该区域分为两部分,因此meta现在包含该表的2个区域,以此类推。。。从客户机的角度来看,您不必关心区域,只需插入数据即可。除非您想手动分区表,否则请参见CREATETABLE的SPLIT参数