为啥 HBase 计数操作这么慢

Posted

技术标签:

【中文标题】为啥 HBase 计数操作这么慢【英文标题】:why HBase count operation so slow为什么 HBase 计数操作这么慢 【发布时间】:2015-04-27 06:15:06 【问题描述】:

命令是:

count 'tableName'. 

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

我的情况是:

我有一个master和两个slave,每个节点有16个cpu和16G内存。

我的表格只有一个包含两列的列族:标题和内容。

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

目前表格有 1550 行,每次我计算行数时,大约需要 2 分钟。

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

【问题讨论】:

【参考方案1】:

首先,您的数据量非常少。如果您有这种容量,那么使用 NoSql 的 IMO 将不会为您提供任何优势。 您的测试不适合判断 HBase 和 Cassandra 的性能。两者都有自己的用例和最佳点。

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

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

【讨论】:

非常感谢 Anil,请再问一个问题,当 RowCounter 运行 Map/Reduce 时,Map/Reduce Api 是直接查询 HDFS 文件还是查询 RegionServers?谢谢杰克 不,它不直接读取 HDFS。 RowCounter MapReduce 作业使用 HBase 的 java API 读取 HBase 表的数据。 但是为什么直接和Hbase对话,在这个类源码中找不到HConnection的踪迹,看key类型是ImmutableBytesWritable,很hadoop风格。但我可以想象,如果它与 RegionServer 连接,它将利用 Hbase 缓存层。但如果直接与 HDFS 连接会减少带宽开销。请问您怎么看,非常感谢!【参考方案2】:

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

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

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

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

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

【讨论】:

非常感谢鲁本,您的回答很有帮助!我希望 *** 可以提供多个答案选择,因此,我也会选择你的答案:) -Jack

以上是关于为啥 HBase 计数操作这么慢的主要内容,如果未能解决你的问题,请参考以下文章

为啥在嵌套函数之外声明一个计数器变量会使循环慢 5 倍?

HBase之计数器

Mysql实战篇之count(*)这么慢,我该怎么办?--06

使用 hadoop 和 hbase 运行单词计数器示例

HBase - 计数器 - 计数器的介绍以及使用 | 那伊抹微笑

HBase 模式行键设计 - 增量计数器?