HBase客户端写入性能不佳

时间:2013-08-16 14:16:44

标签: performance hadoop hbase scalability

我在HBase的应用服务器(-cum web-server)中使用HBase客户端 使用CDH3u4(HBase-0.90)对6个节点进行集群设置。 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. auto-flush = false
  2. ClearbufferOnFail =真
  3. HTable bufferSize = 12MB
  4. put setWriteToWAL = false(丢失1个数据我很好。)
  5. 为了在读写之间保持一致,我正在打电话 每2秒对所有缓冲表进行flush-commit。

    在我的应用程序中,我将HBase写入调用置于队列(异步方式)和 使用20个消费者线程排空队列。在本地点击Web服务器 使用curl,我能够在卷曲完成后看到HBase的TPS为2500,但是 使用Load-test,请求以每秒1200次点击的高速率发出 在3个应用程序服务器上,负责的消费者(排水)线程 写入HBase不会以与输入速率相当的速率写入数据。我 当请求率为每秒1200次点击时,看到的TPS不超过600。

    有人可以建议我们可以做些什么来提高性能?我试过了 在3个应用服务器的每一个上将线程减少到7但仍然没有效果。专家 意见会有所帮助。由于这是一个生产服务器,所以不要思考 交换角色,除非有人指出严重的性能优势。

    [编辑]: 为了突出/澄清我们的HBase写入模式,我们的第一个事务检查表-A中的行(使用HTable.exists)。它无法第一次找到行,因此写入三个表。后续的4个事务使表A上存在检查,并且当它找到该行时,它只写入1个表。

1 个答案:

答案 0 :(得分: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