我在应用服务器(-cumweb服务器)中使用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=真
表缓冲区大小=12mb
put setwritetowal=false(丢失1个数据就可以了)。
为了在读和写之间保持紧密一致,我每2秒对所有缓冲表调用一次flush commits。
在我的应用程序中,我将hbase write调用放入队列(异步方式),并使用20个使用者线程排出队列。在使用curl本地访问web服务器时,我可以在curl完成后看到hbase的tps为2500,但是在负载测试中,请求在3台应用服务器上以每秒1200次的高命中率出现,负责写入hbase的使用者(drain)线程写入数据的速率不能与输入速率相比。当请求速率为每秒1200次时,我看到的tps不超过600次。
有人能建议我们如何提高绩效吗?我试过将3个应用服务器上的线程数减少到7个,但仍然没有效果。Maven的意见会有帮助的。由于这是一个生产服务器,所以不要考虑交换角色,除非有人指出严重的性能优势。
[编辑]:为了突出/澄清我们的hbase写入模式,我们的第一个事务检查表-a中的行(使用htable.exists)。它第一次找不到行,因此写入三个表。随后的4个事务对表-a进行exist检查,当它找到行时,它只写入1个表。
1条答案
按热度按时间uoifb46i1#
这是一个非常古老的hbase版本。从2013年8月18日起,我建议升级到基于0.94.x的版本。
除此之外,很难确定地告诉你。有许多调谐旋钮。你应该:
确保hdfs有足够的收发器。
确保hbase有足够的堆空间。
确保没有交换
确保有足够的处理程序。
确保已打开压缩[1]
检查磁盘io
确保行键、列族名称、列限定符和值尽可能小
确保您的写操作在密钥空间中分布良好
确保您的区域(预)分割
如果您使用的是最新版本,那么您可能需要查看编码[2]
在处理完所有这些之后,您就可以开始查看日志和jstack了。
https://hbase.apache.org/book/compression.html
https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/io/encoding/fastdiffdeltaencoder.html