目录
1、TTransportException(type=1, message="Could not connect to ('192.168.10.111', 9090)")}
2、TTransportException(type=4, message='TSocket read 0 bytes')
1、分析1:错误原因可能是 hbase.regionserver.thrift.http 配置导致的
2、分析2:可能是因为thrift 的server端和client端的协议不匹配造成的。
3、分析3:如果是成功连接使用一段时间后又出现这种错误或者出现读取超时的错误。可能是thrift 服务器对客户端请求的读取超时
环境条件:
- 1、hbase版本:2.1.0
- 2、thrift协议版本:1.X
- 3、Python版本:3.9
- 4、连接hbase的Python库:happybase
1、TTransportException(type=1, message="Could not connect to ('192.168.10.111', 9090)")}
1、分析:错误原因是不能正常连接到thrift服务
- 解决办法:
- 1、检查hbase服务是否启动
- 1、如果是管理员直接使用命令jps,查看服务HMaster或HRegionServer是否启动
- 2、如果不是管理员可以通过以下方式查看hbase是否启动(hbase默认启动端口16010)
- 1、执行命令查看是否有进程信息:sudo netstat -ntlp | grep 16010
- 2、或者通过在浏览器中输入,服务IP:16010(如:192.168.10.111:16010)查看是否能访问hbase服务页面
- 2、检查thrift服务是否成功启动
- 1、如果是管理员直接使用命令jps,查看服务ThriftServer是否启动
- 2、如果不是管理员可以通过以下方式查看thrift服务是否启动(thrift默认启动端口是9090)
- 1、执行命令查看是否有进程信息:sudo netstat -ntlp | grep 9090
- 3、启动thrift服务
- 1、直接在hbase 的master节点上单启动(建议此方式,一般都是连接hbase的master节点操作hbase)
# 进入到安装hbase的bin目录下,执行下面命令:
sudo ./hbase-daemon.sh start thrift -f
参数说明:
-f:Thrift 服务将以前台模式启动并输出日志到终端。这样可以方便地查看和调试服务的日志信息。请注意,前台模式可能会阻塞终端,因此你可能需要另开一个终端窗口来执行其他操作。 - 2、thrift集群方式启动,thrift会在整个hbase集群上启动
sudo ./hbase-daemons.sh start thrift -f
- 如果启动出现端口冲突,可以指定端口启动
sudo ./hbase-daemon.sh start thrift -p 9096 -f
- 1、直接在hbase 的master节点上单启动(建议此方式,一般都是连接hbase的master节点操作hbase)
2、TTransportException(type=4, message='TSocket read 0 bytes')
1、分析1:错误原因可能是 hbase.regionserver.thrift.http 配置导致的
- 解决办法:
- 1、进入hbase的conf目录,找到hbase-site.xml配置文件
- 2、查看配置文件中hbase.regionserver.thrift.http的配置,如配置的true,需要改成false,修改完成后重启thrift服务(先重启hbase,在重启thrift服务)
- 3、注意:对hbase-site.xml配置文件进行任何修改,都需要重启hbase才能生效
- 4、原因:
- 由于 HappyBase 是基于原生的 Thrift 协议实现的 Python 客户端库,它不直接支持通过 HTTP 进行连接和读取数据。因此,如果你在 HappyBase 中尝试通过 HTTP 访问 HBase Thrift 服务,可能会导致无法读取数据的问题。
- 要解决这个问题,你可以将 hbase.regionserver.thrift.http 的值设置为 false,重启 HBase Thrift 服务,并使用 HappyBase 基于 Thrift 协议进行连接和数据操作。这样可以保持与 HappyBase 的兼容性,并正常读取数据。
- 由于 HappyBase 是基于原生的 Thrift 协议实现的 Python 客户端库,它不直接支持通过 HTTP 进行连接和读取数据。因此,如果你在 HappyBase 中尝试通过 HTTP 访问 HBase Thrift 服务,可能会导致无法读取数据的问题。
<property>
<name>hbase.regionserver.thrift.http</name>
<value>false</value>
</property>
2、分析2:可能是因为thrift 的server端和client端的协议不匹配造成的。
- python要使用TCompactProtocol,而不能使用TBinaryProtocol。
- TBinaryProtocol:缺省简单的二进制序列化协议。
- TCompactProtocol:高效的二进制序列化协议。
解决办法:
- 1.修改hbase-site.xml,增加TFramedTransport和TCompactProtocol配置,先重启hbase然后重启thrift;
- hbase.regionserver.thrift.framed: 将该配置设置为 true 启用 Thrift 服务的帧传输模式。在帧传输模式下,每个请求和响应都将被封装在帧中,以提高传输效率和性能。默认情况下,它是禁用的。
- hbase.regionserver.thrift.compact: 将该配置设置为 true 启用 Thrift 服务的紧凑协议模式。紧凑协议是一种二进制协议,可以提供更高效的序列化和传输。默认情况下,它是禁用的。
<property>
<name>hbase.regionserver.thrift.framed</name>
<value>true</value>
</property>
<property>
<name>hbase.regionserver.thrift.compact</name>
<value>true</value>
</property>
- 2、在Python客户端建立连接时增加protocol,transport参数:
conn = happybase.Connection(host="192.168.10.111",port=9090)
#修改为:
conn = happybase.Connection(host="192.168.10.111",port=9090,protocol='compact',transport='framed')
3、分析3:如果是成功连接使用一段时间后又出现这种错误或者出现读取超时的错误。可能是thrift 服务器对客户端请求的读取超时
解决办法:
- 1、修改hbase-site.xml,增加timeout和max-idletime配置,先重启hbase然后重启thrift;
- hbase.thrift.server.socket.read.timeout: 该配置定义了 Thrift 服务器对客户端请求的读取超时时间,单位是毫秒(ms)。默认情况下,它设置为 86400000 毫秒(即 24 小时)。这意味着如果客户端在该时间内没有发送请求,则连接将被关闭。
- hbase.thrift.connection.max-idletime: 该配置定义了 Thrift 服务器对空闲连接的保持时间,单位是秒(s)。默认情况下,它设置为 31104000 秒(即 360 天)。如果连接在指定的时间内没有进行任何操作,则将被关闭。
<property>
<name>hbase.thrift.server.socket.read.timeout</name>
<value>86400000</value>
</property>
<property>
<name>hbase.thrift.connection.max-idletime</name>
<value>31104000</value>
</property>
建议:为避免在实际使用过程中出现各种问题,以上涉及的hbase-site.xml的配置建议一次全部统一配置好;【注意:配置完成后一定要重启hbase,再重启thrift服务才能生效】,全部配置文件内容如下:
<property>
<name>hbase.regionserver.thrift.http</name>
<value>false</value>
</property>
<property>
<name>hbase.regionserver.thrift.framed</name>
<value>true</value>
</property>
<property>
<name>hbase.regionserver.thrift.compact</name>
<value>true</value>
</property>
<property>
<name>hbase.thrift.server.socket.read.timeout</name>
<value>86400000</value>
</property>
<property>
<name>hbase.thrift.connection.max-idletime</name>
<value>31104000</value>
</property>