命令是:
count 'tableName'.
获取整个表的总行数非常慢。
我的情况是:
我有一个主设备和两个从设备,每个节点有16个cpus和16G内存。
我的表只有一个列族,有两列:标题和内容。
标题列最多有100B字节,内容可能有5M字节。
现在该表有1550行,每当我计算行号时,大约需要2分钟。
我很好奇为什么hbase在这个操作上这么慢,我猜它比mysql慢得多。 Cassandra在这些操作上比Hbase更快吗?
答案 0 :(得分:5)
首先,您拥有非常少量的数据。如果你有那种音量,那么使用NoSql的IMO将无法为你提供优势。
您的测试不适合判断HBase和Cassandra的表现。两者都有自己的用例和甜点。
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.在这种情况下,如果您还没有新列,则可能需要使用较小的值为行添加新列(布尔值是最佳选项)。