有一种方法可以在集群的每个节点上复制表数据吗?我需要用数据的最大局部等级进行性能测试。默认情况下,HBase将数据分布在一小部分集群节点上(在1或2个节点上),可能是因为我的数据不是很大的数据(~2GB)。我知道Hbase是为更大的数据集设计的,但在这种情况下,这对我来说是一个要求
有很多关于它的好文章*(见文章的末尾),但我会用我自己的话来解释它;)
HBase不负责数据复制,Hadoop HDFS负责,默认情况下配置为复制因子3,这意味着所有数据将存储在至少3个节点中。
数据本地化是获得良好性能的一个关键方面,但实现最大数据本地化很容易:您只需要将HBase Regionserver(RS)与Hadoop数据节点(DN)并置,因此,所有DN都应该具有RS角色。一旦你有了这些,HBase将自动将数据移动到需要的地方(在主要契约中),以实现数据本地化,仅此而已,只要每个RS都有它在本地服务的区域的数据,你就有了数据本地化。
即使将数据复制到多个DN,每个区域(及其包含的行)也将仅由一个RS提供服务,复制因子为3、10或100也没关系…读取属于区域#1的行总是会遇到相同的RS,并且该区域将是托管该区域的区域(由于数据局部性,该区域将从HDFS本地读取数据)。如果托管该区域的RS发生故障,该区域将自动分配给另一个RS(因为数据也复制到其他DN)
您可以做的是以这样一种方式拆分您的表,即每个RS都有偶数桶的行(区域)分配给它,这样在读取或写入数据时,尽可能多的不同RS可以同时工作,只要您不总是访问相同的区域,就可以提高您的总吞吐量(称为regionserver热点**)。
因此,您应该始终从确保表中的所有区域都分配给不同的RS开始,并且它们接收相同数量的R/W请求。完成后,您可以将表拆分为多个区域,直到集群的所有RS上都有偶数个区域(如果您对负载均衡器不满意,可能需要手动分配它们)。
只要提醒一下,即使您的区域分布完美,如果您的数据访问模式不正确(或不均衡),并且不能均匀地访问所有区域,那么您的性能仍然很差,最终这完全取决于您的应用程序。
(*)推荐读数:
- http://www.larsgeorge.com/2009/10/hbase-architecture-101-storage.html
- http://www.larsgeorge.com/2010/05/hbase-file-locality-in-hdfs.html
(**)为了避免RS热点,我们总是将表设计为具有非单调递增的行键,因此行1、2、3。。。N托管在不同的区域,常见的方法是使用MD5(id)+id作为行密钥。这种方法有它自己的一系列缺点:你不能扫描前10行,因为它们是加盐的。