转自https://blog.csdn.net/kelebb0459/article/details/106838905

问题:使用happybase连接池操作HBASE一直出现 TTransportException(type=4, message=‘TSocket read 0 bytes’) 这个错误

原因1: 客户端链接hbase时传输协模式与协议与thriftpy服务端不匹配。可更改为 h_conn = happybase.Connection( host=“host”,port=port, transport=‘framed’, protocol=‘compact’ )

原因二:操作完hbase时with不会默认close thriftpy的socket链接,而HBASE的服务端有默认为60秒的超时后会主动断开,而操作者的连接池不知道,导致TTransportException(type=4, message=‘TSocket read 0 bytes’) 这个错误

原因三:第三个原因与第二个类似,但是现象有所不同。我简单的描述一下现象:当首次初始化好happybase连接池后,一直未操作查数据,过一会后,大概60秒再操作会出现标题中的问题。 原因是,happybase默认初始化链接池后,会默认去向hbase做一次链接(如下图),但为close,我个人认为这也是happybase这个包的bug。解决这个问题的办法就是,初始化好链接后,立刻做一次查询(比如查看hbase有哪些表)后close掉这个链接。可能大家会问,做查询的这个链接怎么保证就是happybase初始化的那个链接,其实只要看看源码就知道,happybase的连接池是维护的一个队列,所以第一次查询肯定是这个happybase包默认初始化而未释放的链接。

目前解决方案:每次数据量达到BATCH_SIZE设置的数量(我设置的是1000条数据写一次)建立一次connection,数据send完之后close连接

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐