Hbase提供Thrift实现多语言的支持,python的happybase就是其中一个实现。
最近在使用happybase出现TTransportException和Broken pipe的异常,记录一下解决方案。
环境:
python:3.6.2
happbase:1.1.0
hbase:1.2.4
现象:要每几分钟左右往HBase插入一条数据,但是,在大约1分钟过后,被服务器断开了连接,然后再尝试插入的时候,抛出broken pipe.
复现代码:
1 | import happybase |
分析:Broken pipe往往是因为客户端和服务器的TCP连接断开引起的。
通过google发现hbase thrift server有一个超时的配置hbase.thrift.server.socket.read.timeout,当客户端和服务器的连接超过该值没有收到消息的时候,该连接会被断开,默认值为60秒,正好跟本次现象发生的场景一致,每隔60秒连接断开。参考[HBASE-14926]https://issues.apache.org/jira/browse/HBASE-14926
查看happybase连接池相关的代码发现在with完成后connection并没有close,直接返回到连接池当中。
1 | @contextlib.contextmanager |
而问题就出现在这里,返回到连接池中的connection在1分钟后没有使用,被断开了连接,当下一次再拿这个connection去请求资源就会出现Broken pipe的异常。
接下来就到了解决问题的时候,一般来讲可以有两个解决方案:
1.配置hbase.thrift.server.socket.read.timeout,增加超时时间
2.在使用connection后关闭连接
1 | import happybase |