HBase使用CMS GC。默认触发GC的时机是当年老代内存达到90%的时候,这个百分比由 -XX:CMSInitiatingOccupancyFraction=N 这个参数来设置。concurrent mode failed发生在这样一个场景:
当年老代内存达到90%的时候,CMS开始进行并发垃圾收集,于此同时,新生代还在迅速不断地晋升对象到年老代。当年老代CMS还未完成并发标记时,年老代满了,悲剧就发生了。CMS因为没内存可用不得不暂停mark,并触发一次stop the world(挂起所有jvm线程),然后采用单线程拷贝方式清理所有垃圾对象。这个过程会非常漫长。为了避免出现concurrent mode failed,建议让GC在未到90%时,就触发。
通过设置?-XX:CMSInitiatingOccupancyFraction=N
这个百分比, 可以简单的这么计算。如果你的?hfile.block.cache.size 和?hbase.regionserver.global.memstore.upperLimit 加起来有60%(默认),那么你可以设置 70-80,一般高10%左右差不多。
maxClientCnxns=300
默认zookeeper给每个客户端IP使用的连接数为10个,经常会出现连接不够用的情况。修改连接数目前好像只支持zoo.cfg配置文件修改,所以需要zookeeper重启才能生效。
zoo.cfg:
maxClientCnxns=300
否则报错如下:2011-10-28 09:39:44,856 – WARN [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:5858:NIOServerCnxn$Factory@253] – Too many connections from /172.*.*.* – max is 10
HBASE_HEAPSIZE=3000
hbase对于内存有特别的嗜好,在硬件允许的情况下配足够多的内存给它。
通过修改hbase-env.sh中的
export HBASE_HEAPSIZE=3000 #这里默认为1000m
hadoop和hbase典型配置
•Region Server
•HBaseRegion Server JVM Heap Size: -Xmx15GB
•Number of HBaseRegion Server Handlers: hbase.regionserver.handler.count=50 (Matching number of active regions)
•Region Size: hbase.hregion.max.filesize=53687091200 (50GB to avoid automatic split)
•Turn off auto major compaction: hbase.hregion.majorcompaction=0
• Map Reduce
•Number of Data Node Threads: dfs.datanode.handler.count=100
•Number of Name Node Threads: dfs.namenode.handler.count=1024 (Todd:
•Name Node Heap Size: -Xmx30GB
•Turn Off Map Speculative Execution: mapred.map.tasks.speculative.execution=false
•Turn off Reduce Speculative Execution: mapred.reduce.tasks.speculative.execution=false
•Client settings
•HBaseRPC Timeout: hbase.rpc.timeout=600000 (10 minutes for client side timeout)
•HBaseClient Pause: hbase.client.pause=3000
•HDFS
•Block Size: dfs.block.size=134217728 (128MB)
•Data node xcievercount: dfs.datanode.max.xcievers=131072
•Number of mappers per node: mapred.tasktracker.map.tasks.maximum=8
•Number of reducers per node: mapred.tasktracker.reduce.tasks.maximum=6
•Swap turned off