我在我的应用程序服务器(-cum web-server)中使用 HBase 客户端,并使用 CDH3u4(HBase-0.90)设置 6 个节点的 HBase 集群。集群上运行的 HBase/Hadoop 服务有:
NODENAME-- ROLE
Node1 -- NameNode
Node2 -- RegionServer, SecondaryNameNode, DataNode, Master
Node3 -- RegionServer, DataNode, Zookeeper
Node4 -- RegionServer, DataNode, Zookeeper
Node5 -- RegionServer, DataNode, Zookeeper
Node6 -- Cloudera Manager, RegionServer, DataNode
我正在为我的 HBase 客户端使用以下优化:
- 自动刷新 = 假
- ClearbufferOnFail=true
- HTable 缓冲区大小 = 12MB
- 将 setWriteToWAL = false (我可以丢失 1 个数据)。
为了在读取和写入之间保持紧密一致,我每 2 秒对所有缓冲表调用一次刷新提交。
在我的应用程序中,我将 HBase 写入调用放在队列(异步方式)中,并使用 20 个消费者线程排空队列。在使用 curl 在本地访问 Web 服务器时,我可以在 curl 完成后看到 HBase 的 TPS 为 2500,但是通过负载测试,请求在 3 个应用程序服务器上以每秒 1200 次命中的高速率出现,消费者(流失) 负责写入 HBase 的线程不会以与输入速率相当的速率写入数据。当请求率为每秒 1200 次点击时,我看到不超过 600 TPS。
谁能建议我们可以做些什么来提高性能?我已经尝试在 3 个应用服务器上将线程减少到 7 个,但仍然没有效果。专家意见会有所帮助。由于这是一个生产服务器,所以不要考虑交换角色,除非有人指出严重的性能优势。
[编辑]:为了突出/澄清我们的 HBase 写入模式,我们的第一个事务检查表 A 中的行(使用 HTable.exists)。它第一次找不到该行,因此写入三个表。随后的 4 个事务对表 A 进行存在检查,当它找到该行时,它只写入 1 个表。