是否所有具有相同行键的数据都存储在同一个节点中?

Are all the data with the same row key stored in the same node?

我有一个关于 hbase 数据库的问题。我们首先通过定义行键、列族访问数据,最后通过列限定符访问数据。

我的问题是HBase是否会将所有具有相同行键的列族一起存储在一个节点中?

更新:例如,我想在 map/reduce 作业中乘以 val1 和 val2。而 val1 和 val2 像这样存储在数据库中:Row=00000 Column Family:M, m000001_1234567=val1Row=00000 Column Family: R, r000001_1234567=val2。我可以确保我可以访问同一节点 运行 和 map 中的 val1val2 吗?

正如您可能知道的那样,它实际上是存储了实际键值数据的 HFile,它将分布在数据节点中。 zookeeper / HLog /Memestore 帮助定位 rowkey 数据并检索它。

Key-value 存储将被分组并存储在每个节点中,假设键 [A-L] 进入一个节点,其余 [M-z] 进入另一个节点,考虑 2 节点场景。

问题一:HBase会把所有row key相同的column families一起存储在一个节点中吗?

是的,但有一些特殊情况。

设置 HBase 集群的推荐方法是并置(或并置)配置:将一些机器用于 HDFS 数据节点和 HBase 区域服务器(与将机器专门用于其中一个角色相反) ,在这种情况下,所有读取都将是远程的,性能会受到影响)。在这样的设置中,当区域服务器将数据保存到 HDFS 时,数据的第一个副本将始终保存到本地磁盘。但是,任何其他副本的放置都不一致 - 不同的部分可能会放置在不同的节点上。这意味着如果一台机器挂掉,数据不会丢失,但该区域的数据将不再在任何一台机器上找到,而是分散在整个集群中。即使在这种情况下,单个行可能仍将存储在单个数据节点上,但它不再是新区域服务器的本地。

这不是数据局部性丢失的唯一方式,以前甚至重新启动 HBase 都会产生这种效果。许多较旧的帖子都提到了这一点,但这实际上已在 HBASE-2896.

中得到修复

即使数据局部性丢失,下一次主要压缩也会恢复它。

来源和推荐阅读:

问题 2:从 MapReduce 作业读取 HBase table 时,每个映射器 运行它使用的数据已存储?

我的理解是,除了上面提到的特殊情况,答案是肯定的,但我找不到任何地方明确提到这个。

来源和推荐阅读: