Hbase 并发使其变慢

Posted

技术标签:

【中文标题】Hbase 并发使其变慢【英文标题】:Hbase concurrency making it slow 【发布时间】:2014-05-30 05:11:56 【问题描述】:

我有 1 台主服务器和 5 台区域服务器,每台服务器都有 200 GB 磁盘空间和 16 GB RAM。我在 HBase 中创建了一个包含 1000 万条记录的表。我在 hadoop 2 上使用 hbase-0.96 版本。

表名 - sh_self_profiles

列族 - 简介

在此表中,每行有 30 列。 当我从 HBase 获得单列值时,大约需要 10 毫秒。我的问题是当我达到 100 个或更多并发请求时,时间会慢慢累积并增加到 400 多毫秒,而不是仅在 10 毫秒内完成。线性命中 100 个请求时,每个请求只需要 10 毫秒。

【问题讨论】:

添加更多关于您的密钥设计、hbase 内存设置等的信息。 记录有多大?它们是 1 亿条 1MB 记录还是 10 字节记录?这有很大的不同。 读取是如何分布的?统一?您是否一遍又一遍地访问同一行? 【参考方案1】:

您应该检查的一件事是您的桌子的分布情况。

您可以通过访问 HBase 主 Web 控制台 http://:60010 来执行此操作,您将能够看到您的表有多少个区域。如果您在创建表时没有做任何特别的事情,您很容易只有一个或两个区域,这意味着所有请求都被定向到单个区域服务器。

如果是这种情况,您可以使用预拆分区域重新创建表(我建议使用 5 的倍数,例如 15 或 20),并确保您正在执行的并发获取平均分布在行键空间。

另外,请检查您为区域服务器分配了多少 RAM - 您可能需要从默认值增加它。如果您在这些机器上没有运行除 HBase Region Sever 以外的任何其他东西,您可能会增加到 8GB 内存。

除此之外,您还可以调整 hbase.regionserver.handler.count 的默认值。

我希望这会有所帮助。

【讨论】:

【参考方案2】:

您使用的是哪个客户端?您使用的是标准 Java 客户端、Thrift 客户端、HTTP REST 客户端还是其他什么?如果您的用例是大量随机读取单列值,我强烈建议您尝试asynchbase,因为它比标准同步 Java 客户端快得多。

【讨论】:

以上是关于Hbase 并发使其变慢的主要内容,如果未能解决你的问题,请参考以下文章

Scala并发速度变慢

HBase 事务和并发控制机制原理

转载 | HBase 事务和并发控制机制原理

并发拉取HBase大量指定列数据时卡住的问题排查

如何在C# winform 中对textbox 实现只读,并且不使其变灰,各位知道的提点下

空值上的 SQL 内连接