小能豆

TSocket 读取 0 字节 - happybase 版本 0.8

py

我正在尝试通过 happybase 框架版本 0.8 连接 hbase。

我已经启动守护进程节俭- /usr/hdp/current/hbase-master/bin/hbase-daemon.sh start thrift -p 9090

 from happybase.connection import Connection
 DEFAULT_HOST = '10.128.121.13'
 DEFAULT_PORT = 9090
 DEFAULT_TRANSPORT = 'framed'
 DEFAULT_COMPAT = '0.96'`

 cc = Connection(DEFAULT_HOST,DEFAULT_PORT,None,True,None,'_',DEFAULT_COMPAT,DEFAULT_TRANSPORT) print(cc.tables())`

我是否需要在所有节点、Hbase 主服务器和 RegionServers 上启动 thrift 服务?

我收到此错误:

TSocket read 0 bytes


阅读 8

收藏
2025-01-12

共1个答案

小能豆

在通过 HappyBase 连接 HBase 时,TSocket read 0 bytes 错误通常表明客户端无法正确地与 HBase Thrift 服务器通信。以下是解决问题的一些关键检查和步骤:


1. Thrift 服务是否在正确的节点上运行?

  • 你只需要在 HBase Master 节点上启动 Thrift 服务,不需要在所有节点(如 RegionServers)上运行 Thrift。
  • 使用以下命令验证 Thrift 服务是否已成功运行:
    bash netstat -an | grep 9090
    如果端口未监听,则需要重新启动 Thrift 服务。

2. 确保使用的是正确的 Thrift 传输模式

  • 你的代码中指定了 DEFAULT_TRANSPORT = 'framed',确保 Thrift 服务也以相同的 framed 模式启动。可以在启动 Thrift 服务时使用以下参数:
    bash hbase-daemon.sh start thrift -p 9090 -f
    -f 表示使用 framed 传输模式。

3. 检查 HBase 的防火墙或网络配置

  • 确保 10.128.121.13 是 Thrift 服务运行的节点,并且客户端能够从网络访问该节点上的 9090 端口。
  • 使用 telnetnc 测试连通性:
    bash telnet 10.128.121.13 9090

4. 确认 HappyBase 和 HBase 的兼容性

  • 你的 DEFAULT_COMPAT = '0.96' 设置是否与 HBase 的实际版本匹配?可以检查 HBase 的版本并调整此设置,例如:
    py DEFAULT_COMPAT = '1.0' # 针对 HBase 1.x
  • 使用以下命令查看 HBase 版本:
    bash hbase version

5. 确保 Thrift 服务已配置为正确的协议

  • 你的代码没有显式指定 Thrift 协议,但默认使用 TBinaryProtocol
  • 确保 Thrift 服务启动时没有使用 --compact 或其他协议切换参数。如果使用了 --compact,则需要在代码中也匹配协议。

示例:

from thrift.protocol import TCompactProtocol
from happybase.connection import Connection

DEFAULT_TRANSPORT = 'framed'
DEFAULT_COMPAT = '1.0'

cc = Connection(
    host='10.128.121.13',
    port=9090,
    transport=DEFAULT_TRANSPORT,
    compat=DEFAULT_COMPAT,
    protocol=TCompactProtocol.TCompactProtocolAccelerated
)
print(cc.tables())

6. 验证 HBase 和 ZooKeeper 的状态

  • Thrift 依赖于 HBase 和 ZooKeeper 服务运行正常。检查 HBase 集群状态:
    ```bash
    hbase shell

    status ‘summary’
    ```

  • 确保 ZooKeeper 运行在正确的节点,并且 HBase Master 能够连接到它。

总结

根据错误信息,最可能的问题是:
1. Thrift 服务没有以 framed 模式启动。
2. 网络连通性或防火墙问题导致无法访问 10.128.121.13:9090
3. DEFAULT_COMPAT 或 Thrift 协议与 HBase 的实际配置不匹配。

逐一排查上述问题后,HappyBase 应该能够正常连接到 HBase。

2025-01-12