我对hbase数据库有疑问。我们首先通过定义行键,列族和最后一列限定符来访问数据。
我的问题是HBase是否会将所有具有相同行键的列族存储在一个节点中?
更新:作为一个例子,我想在map / reduce作业中乘以val1和val2。而val1和val2存储在数据库中,如下所示:Row=00000 Column Family:M, m000001_1234567=val1
,Row=00000 Column Family: R, r000001_1234567=val2
。我可以确保在运行val1
的同一节点中我可以同时访问val2
和map
吗?
答案 0 :(得分:2)
您可能已经意识到它实际上存储了具有实际键值数据的HFile,并且它将分布在数据节点上。 zookeeper / HLog / Memestore有助于查找rowkey数据并检索它。
键值存储将被分组并存储在每个节点中,假设键[A-L]到达一个节点,其余[M-z]到另一个节点,考虑到2节点场景。
答案 1 :(得分:1)
问题1:HBase会在一个节点中将所有具有相同行键的列族存储在一起吗?
是的,但有一些特殊情况。
设置HBase群集的建议方法是并置(或共置)配置:将一些计算机用于HDFS数据节点和HBase区域服务器(与将这些计算机专门用于其中一个角色相反,在哪种情况下,所有读取都是远程的,性能会受到影响)。在这样的设置中,当Region Server将数据保存到HDFS时,数据的第一个副本将始终保存到本地磁盘。但是,任何其他副本的放置都不一致 - 不同的部分可能放在不同的节点上。这意味着如果一台机器死机,没有数据会丢失,但该区域的数据将不再在任何一台机器上找到,而是将在整个集群周围分散。即使在这种情况下,单行仍可能存储在单个数据节点上,但它不再是新的Region Server本地的。
这不是数据局部丢失的唯一方法,以前甚至重新启动HBase都会产生这种影响。许多较旧的帖子提到了这一点,但从那以后已实际修复了这个问题。
即使数据位置丢失,下一次主要压缩也会恢复它。
来源和推荐阅读:
问题2:从 MapReduce 作业中读取HBase表时,每个映射器是否在存储所用数据的节点上运行?
我的理解是,除了上面提到的特殊情况外,答案是肯定的,但我无法在任何地方找到这一点。
来源和推荐阅读: