HBase占用网络端口,连接数过大会导致其他服务不稳定
问题
HBase占用网络端口,连接数过大会导致其他服务不稳定。
回答
使用操作系统命令lsof或者netstat发现大量TCP连接处于CLOSE_WAIT状态,且连接持有者为HBase RegionServer,可能导致网络端口耗尽或HDFS连接超限,那样可能会导致其他服务不稳定。HBase CLOSE_WAIT现象为HBase机制。
HBase CLOSE_WAIT产生原因:HBase数据以HFile形式存储在HDFS上,这里可以叫StoreFiles,HBase作为HDFS的客户端,HBase在创建StoreFile或启动加载StoreFile时创建了HDFS连接,当创建StoreFile或加载StoreFile完成时,HDFS方面认为任务已完成,将连接关闭权交给HBase,但HBase为了保证实时响应,有请求时就可以连接对应数据文件,需要保持连接,选择不关闭连接,所以连接状态为CLOSE_WAIT(需客户端关闭)。
什么时候会创建StoreFile:当HBase执行Flush时。
什么时候执行Flush:HBase写入数据首先会存在内存MemStore,只有内存使用达到阈值或手动执行flush命令时会触发flush操作,将数据写入HDFS。
解决方法:
由于HBase连接机制,如果想减小HBase端口占用,则需控制StoreFile数量,具体可以通过触发HBase的compaction动作完成,即触发HBase文件合并,方法如下:
方法1:使用HBase shell客户端,在客户端手动执行major_compact操作。
方法2:编写HBase客户端代码,调用HBaseAdmin类中的compact方法触发HBase的compaction动作。
如果compact无法解决HBase端口占用现象,说明HBase使用情况已经达到瓶颈,需考虑如下几点:
- table的Region数初始设置是否合适。
- 是否存在无用数据。
如果存在无用数据,可删除对应数据以减小HBase存储文件数量,如果以上情况都不满足,则需考虑扩容。