Hbase性能优化篇

2,127 阅读2分钟

HDFS篇

  • dfs.datanode.synconclose = true

在hdfs-site.xml中将dfs.datanode.synconclose设置为false:在硬系统重置或断电时可能会丢失数据


  • dfs.datanode.sync.behind.writes = true

默认为false,设置为true,在数据写入完成之后,datanode会要求操作系统将数据直接同步到磁盘


  • dfs.namenode.avoid.read.stale.datanode = true (default false)
  • dfs.namenode.avoid.write.stale.datanode = true (default false)

避免DataNode写入失效


dfs.datanode.failed.volumes.tolerated = ?

容忍多少个磁盘挂掉以后继续正常运行,默认为0


  • dfs.client.read.shortcircuit = true

启用HDFS快速读取


  • dfs.datanode.max.transfer.threads = 8192

最大传输线程数,默认为4096


  • dfs.namenode.handler.count = ?

NameNode 处理程序计数,默认为30改为60(侦听来自客户端的请求的NamenodeRPC服务器线程的数量。根据机器的可用内存可以调整为 50~100)


  • dfs.datanode.handler.count = 6

数据节点的服务器线程数(该属性默认值为 10,是 DataNode 的处理线程数,如果 HDFS 客户端程序读写请求比较多,可以调高到 15~20,设置的值越大,内存消耗越多,不要调整的过高,一般业务中, 5~10 即可。)


HBase篇

  • hbase.hstore.blockingStoreFiles = 16
  • hbase.hstore.blockingWaitTime = 90

前者为HStore 阻塞存储文件,后者为阻塞的时间(s)

如果storefile的数量超过了10个,就会阻塞flush,compact线程进行合并(如果观察日志,你会看到类似"Too many HFiles, delaying flush"之类的输出),如果想让数据写入更加平滑或者业务写入量巨大,可以考虑增大该值。 另外,在达到了blockingStoreFiles阀值的时候,开始阻塞flush,那么memstore就会膨胀,当memstore膨胀到 flush size 乘于 multiplier(flush size X multiplier)的时候,这个列簇的 写操作就会被阻塞,一直到flush完成(可以关注日志,会有相关日志输出)。 所以如果写入量巨大,建议同时增加multiplier大小,至于flush size的大小,一般默认即可


  • hbase.regionserver.handler.count = ?

HBase 客户端写入缓冲


  • hbase.regionserver.handler.count = 30

HBase Region Server 处理程序计数

每个regionserver启动的RPC Listener实例个数,hbase.master.handler.count参数意思跟它基本一样。handler个数并非越多越好,如果设置了过多的handler可能得到一个适得其反的结果。如果是read-only的场景,handler的个数接近与cpu个数比较好。在调整该参数时候,建议设置为cpu个数的倍数,从两倍cpu个数开始调整。


hbase.hregion.max.filesize = 10G

HBase 文件最大大小


  • hbase.regionserver.thread.compaction.small = 1 (default)

用于minor compact的线程数,当compact quene比较高的时候,建议增加该值。但是需要注意的是:该线程数永远不要超过你可用磁盘数目的一半。 比如:你有8块SSDs, 该值不要超过4