block locality

因为DataNode和RegionServer通常会部署在相同的机器上,所以会产生Locality这样的概念。

HBase的Locality是通过HDFS的Block复制实现的。在复制Block时,HBase是这样选择副本的位置的:

第一个副本写到本地节点上;
第二个副本写到另一个机架的随机节点上;
第三个副本写到相同机架的一个随机选择的其他节点上;
如果还有更多的副本,这些副本将会写到集群上的随机节点上。


就是这样,在flush或compact后,HBase的Region实现了Locality。

当一个RegionServer处在failover的情况下(rebalance或重启)时,可能会分配到一些没有本地StoreFiles的Region(因为此时没有可用的本地副本)。然而,有新数据再写入这些Region的时候,或者是对表进行compact的时候,StoreFiles将会被重写,这些Region也会再次变成RegionServer的“local”Region。

有一个相关的指标“data locality”,即Region保存在本地的StoreFile的百分比。

其实我的理解是:一个region是一张表,在某一台机器上的的一部分数据。但是这应该是一个逻辑上的概念,一个region会有多个HStore(列族),一个HStore下面会有多个hfile。这些hfile才是真的存储的文件,这些hfile都是在hdfs上以block存储的,这些block可能在不同的机器上,这就有了 本地化率这个概念。

datanode和 regionserver 一般都部署在同一台机器上,所以region server 管理的 region 会优先存储在本地,以节省网络开销。如果 block locality 较低有可能是刚做过 balance或刚重启,经过compact 后region 的数据都会写到当前机器的 datanode,block locality 也会慢慢达到接近 100。

也就是说本地化率低,可以通过compaction来提升本地化率。
 

发布了131 篇原创文章 · 获赞 79 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/qq_31780525/article/details/101068977