有一种方法可以在群集的每个节点上复制表数据吗? 我需要使用最大的数据位置进行性能测试。 默认情况下,HBase在一小部分集群节点(1或2个节点)上分发数据,可能是因为我的数据不是非常大的数据(~2 GB)。 我知道Hbase是为更大的数据集设计的,但在这种情况下,它是我的要求。
答案 0 :(得分:3)
关于它有很多很好的阅读*(见帖子的结尾),但我会用自己的话来解释它;)
HBase不负责数据复制,Hadoop HDFS默认配置复制因子为3,这意味着所有数据都将存储在至少3个节点中。
数据位置是获得良好性能的关键方面,但实现最大数据局部性很容易:您只需要将HBase Regionservers(RS)与Hadoop Datanodes(DN)并置,所以,您的所有DN都应该具有RS角色。一旦你有了这个,HBase会自动将数据移动到需要的位置(主要压缩)以实现数据局部性,只要每个RS都有本地服务区域的数据,你就会拥有数据局部性。
即使您将数据复制到多个DN,每个区域(以及它们包含的行)也只能由一个RS 提供服务,因此复制因子为3并不重要,10或100 ...读取属于区域#1的行将始终命中相同的RS,并且将是托管该区域的那个(由于数据位置,它将从HDFS本地读取数据)。如果托管该区域的RS出现故障,该区域将自动分配给另一个RS(因为该数据也会复制到其他DN)
您可以做的是以每个RS甚至分配给它的行(区域)桶的方式拆分表,以便在读取或写入数据时尽可能多地使用不同的RS,从而提高整体吞吐量只要你不总是命中相同的区域(称为regionserver hotspotting **)。
因此,您应始终首先确保将表的所有区域分配给不同的RS,并且它们会收到相同数量的R / W请求。完成后,您可以将表拆分为更多区域,直到群集的所有RS上都有偶数个区域(如果您对负载均衡器不满意,可能需要手动分配它们)。
只是提醒一下,即使你看起来有一个完美的地区分布,如果你的数据访问模式不正确(或者它是不均匀的)并且没有均匀地到达所有区域,你仍然会有糟糕的表现,最后它们全部取决于你的申请。
(*)推荐阅读:
(**)为了避免RS热点,我们总是将表设计为具有非单调递增的行键,因此行1,2,3 ... N被托管在不同的区域,常见的方法是使用MD5( id)+ id为rowkey。这种方法有它自己的一些缺点:你不能扫描前10行因为它们被盐渍了。