0

我在我的应用程序服务器(-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 客户端使用以下优化:

  1. 自动刷新 = 假
  2. ClearbufferOnFail=true
  3. HTable 缓冲区大小 = 12MB
  4. 将 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 个表。

4

1 回答 1

4

所以这是一个非常古老的 HBase 版本。 截至 2013 年 8 月 18 日,我建议升级到基于 0.94.x 的版本。

除此之外,真的很难确切地告诉你。有很多调音旋钮。你应该 :

  • 确保 HDFS 有足够的 xceivers。
  • 确保 HBase 有足够的堆空间。
  • 确保没有交换
  • 确保有足够的处理程序。
  • 确保您已打开压缩。[1]
  • 检查磁盘io
  • 确保您的行键、列族名称、列限定符和值尽可能小
  • 确保您的写入在您的密钥空间中分布良好'
  • 确保您的区域是(预)拆分的
  • 如果您使用的是最新版本,那么您可能需要查看编码 [2]

在处理完所有这些事情之后,您就可以开始查看日志和 jstack。

  1. https://hbase.apache.org/book/compression.html
  2. https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/io/encoding/FastDiffDeltaEncoder.html
于 2013-08-19T06:11:58.167 回答