happybase(TSocket read 0 bytes)

關於報錯

happybase 是使用python鏈接hbase的一個第三方庫,目前基於thrift1 。在使用過程當中常常碰到報錯html

TTransportException(type=4, message='TSocket read 0 bytes')python

即便使用thrift server首頁上提供了鏈接Apache HBase Wiki on Thrift裏的demo也同樣報錯。apache

測試代碼

import happybase
def get_tables_name(host,port):
    conn = happybase.Connection(host=host,port=port)
    return conn.tables()

很簡單,就是鏈接hbase,返回全部table名稱。api

報錯可能緣由

  • hbase 未開啓thrift服務
  • Connection參數與thrift服務不匹配

Connection參數

看一下官網wiki上創建鏈接的例子app

from thrift.transport.TSocket import TSocket
from thrift.transport.TTransport import TBufferedTransport
from thrift.protocol import TBinaryProtocol
from hbase import Hbase

transport = TBufferedTransport(TSocket(host, port))
transport.open()
protocol = TBinaryProtocol.TBinaryProtocol(transport)

client = Hbase.Client(protocol)oop

構建一個鏈接須要兩個輔助類 TBufferedTransportTBinaryProtocol。其中transport負責通信協議,protocol負責序列化協議。測試

happybase connection

happybase官網上對於connection的介紹connection的介紹code

總結有三個參數須要匹配server

  • protocol: binary (the default) and compact
  • compat :0.90, 0.92, 0.94, or 0.96 (the default)
  • transport :buffered (the default) and framed

在我將上述測試代碼改成htm

import happybase
def get_tables_name(host,port):
    conn = happybase.Connection(host=host,port=port,protocol='compact',transport='framed')
    return conn.tables()

就沒問題了。

相關文章
相關標籤/搜索