为什么HBase计数操作如此缓慢

时间:2015-04-27 06:15:06

标签: cassandra hbase

命令是:

count 'tableName'. 

获取整个表的总行数非常慢。

我的情况是:

  • 我有一个主设备和两个从设备,每个节点有16个cpus和16G内存。

  • 我的表只有一个列族,有两列:标题和内容。

  • 标题列最多有100B字节,内容可能有5M字节。

  • 现在该表有1550行,每当我计算行号时,大约需要2分钟。

我很好奇为什么hbase在这个操作上这么慢,我猜它比mysql慢得多。 Cassandra在这些操作上比Hbase更快吗?

2 个答案:

答案 0 :(得分:5)

首先,您拥有非常少量的数据。如果你有那种音量,那么使用NoSql的IMO将无法为你提供优势。 您的测试不适合判断HBase和Cassandra的表现。两者都有自己的用例和甜点。

hbase上的

count命令正在运行单线程java程序来执行行计数。不过,我很惊讶它花了2分钟计算1550行。  如果您想以更快的方式进行计数(对于更大的数据集),那么您应该运行HBase Row_Counter的MapReduce作业。
运行以下命令运行MapReduce作业:

  

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

答案 1 :(得分:2)

首先,请提醒一下,为了利用数据局部性,你的“奴隶”(更好地称为RegionServers)也必须具有DataNode角色,不这样做是性能杀手。

由于性能原因,HBase不会保留行的实时计数器。要执行计数,HBase shell客户端需要检索所有数据,这意味着如果您的平均行有5M的数据,那么客户端将从regionservers中检索5M * 1550只是为了计数,这是很多。

为了加快速度,您有两个选择:

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

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