为什么 HBase 计数操作这么慢

why HBase count operation so slow

命令是:

count 'tableName'. 

获取整个table的总行数很慢。

我的情况是:

我很好奇为什么hbase在这个操作上这么慢,我猜它比mysql还要慢。 Cassandra 在这些操作上是否比 Hbase 快?

首先,你的数据量非常小。如果你有那种数量,那么使用 NoSql 的 IMO 不会给你带来任何优势。 您的测试不适合判断 HBase 和 Cassandra 的性能。两者都有自己的用例和优势。

hbase 上的计数命令是 运行宁一个单线程 java 程序来计算行数。尽管如此,我还是很惊讶它需要 2 分钟来计算 1550 行。 如果您想以更快的方式进行计数(对于更大的数据集),那么您应该 运行 HBase 的 MapReduce 作业 Row_Counter.
运行 MapReduce 作业 运行宁此:

bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter

首先,请提醒,要使用数据局部性,您的 "slaves"(更广为人知的 RegionServers)必须同时具有 DataNode 角色,否则会成为性能杀手。

由于性能原因,HBase 不维护实时行计数器。要执行计数,HBase shell 客户端需要检索所有数据,这意味着如果您的平均行有 5M 数据,那么客户端将从区域服务器检索 5M * 1550 只是为了计数,这是一个很多.

要加快速度,您有 2 个选择:

  • 如果您需要实时响应,您可以使用 HBase 原子计数器维护您自己的实时行计数器:每次插入时增加计数器,每次删除时减少计数器。甚至可以在同一个table,用另外一个列族来存储就可以了

  • 如果您不需要实时 运行 分布式行计数器 map-reduce 作业 (source code) 强制扫描仅使用最小的列族和列可用以避免读取大行,每个 RegionServer 将读取本地存储的数据并且不需要网络 I/O。在这种情况下,如果您还没有新列(布尔值是您的最佳选择),您可能需要在行中添加一个较小值的新列。