2016-09-14 61 views
0

我有一个关于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吗?

回答

1

问题1:请问HBase的存储中的所有列族使用相同的行键集中在一个节点?

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

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

这不是数据局部性如何丢失的唯一方式,以前甚至重新启动HBase都会产生这种影响。很多较旧的帖子都提到了这一点,但从HBASE-2896开始,它实际上已经被修复。

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

源头和推荐的读数:

问题2:当从MapReduce的读取HBase的表作业,每个映射程序是否在所使用的数据所在的节点上运行?

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

来源及推荐阅读:使用相同的密钥值

+0

我会,如果你给予的答案,这个例子更清楚的答案是非常赞赏: 我想乘VAL1和val2中的map/reduce。虽然val1和val2的被存储在数据库是这样的:'行= 00000柱族:M,m000001_1234567 = val1','行= 00000柱族:R,r000001_1234567 = val2'。我可以确保可以在同一个节点上访问val1和val2吗?因为它们都具有相同的键值1234567? – mmostajab

+0

我无法在任何地方明确地发现这一点,但似乎一切似乎表明'TableMapper'类透明地为您处理数据局部性。我用你的问题的这一部分更新了我的答案,并添加了一些关于原始问题的更多细节和注意事项。 – Zoltan

1

正如你可能知道它其实HFile有实际的键值数据存储,它将分布在datanode中。 zookeeper/HLog/Memestore帮助查找rowkey数据并检索它。

考虑到2个节点场景,将键值存储器分组并存储在每个节点中,假定键[A-L]进入一个节点并且其余的[M-z]到另一个节点。

enter image description here

enter image description here

enter image description here

+0

MapReduce的集成部分,因此所有的数据都在同一节点上? – mmostajab

+0

也许我可以通过一个例子更清楚地说明我的问题。我想在map/reduce中乘以'val1'和'val2'。虽然'val1'和'val2'像这样存储在数据库中:列族:'M','m000001_1234567 = val1',列族:'R','r000001_1234567 = val2'。我可以确保'val1'和'val2'可以在同一个节点上提取吗?因为它们都具有相同的键值“1234567”? – mmostajab

相关问题