
# 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存储文件数量，如果以上情况都不满足，则需考虑扩容。
