Как взаимодействовать с Hbase через knox, используя Python? - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь взаимодействовать с hbase throght knox, используя Python. В python Администратор дает список конечных точек API knox для hive, hbase и spark, как: https://knox-devl.www.mysite.com:9042/gateway/MYSITEHDO/hbaseversion/cluster

Теперь, так как яиспользуя библиотеку happybase Python, мой код подключения

import happybase

connection=happybase.Connection('https://knox-devl.www.mysite.com/gateway/MYSITEHDO/hbaseversion/cluster',port=9042)
connection.open()
print(connection.tables())

Ошибка, которую он показывает: thriftpy.transport.TTransportException: TTransportException(message="Could not connect to ('https://knox-devl.www.mysite.com/gateway/MYSITEHDO/hbaseversion/cluster', 9042)", type=1)

Также я пытался с Phoenixdb lib

import phoenixdb

database_url = 'https://knox-devl.www.mysite.com:9042/gateway/MYSITEHDO/hbaseversion/cluster'
conn = phoenixdb.connect(database_url, autocommit=True)
cursor = conn.cursor()
cursor.execute("SHOW tables")

Но яполучаю еще одну ошибку: phoenixdb.errors.InterfaceError: ('RPC request failed', None, None, BadStatusLine("''",)) Exception phoenixdb.errors.InterfaceError: InterfaceError('RPC request failed', None, None, BadStatusLine("''",)) in <bound method Connection.__del__ of <phoenixdb.connection.Connection object at 0x10bc97d90>> ignored

Единственный способ получить некоторые данные с помощью curl:

curl -i -k -u guest:guest-password 'https://knox-devl.www.mysite.com:9042/gateway/MYSITEHDO/hbaseversion/cluster'

Но там нет команд SQL.

Кто-нибудь знал, как это сделать, или я что-то упустил здесь, например, запросить другой URL или включить что-то в кластере?

1 Ответ

1 голос
/ 04 апреля 2019

Как вы определили, единственный способ общаться с HBase через Knox - через REST API HBase.Happybase пытается подключиться напрямую к HBase через RPC, который Knox заблокирует.

Вы не можете использовать Happybase вне кластера с включенным Knox.

Хороший учебник по использованию HBase RESTAPI с Python можно найти здесь .На случай, если ссылка когда-либо прекратится, некоторые из наиболее полезных команд из этой статьи:

  • Посмотрите на схему таблицы:

    request = requests.get(baseurl + "/" + tablename + "/schema")
    
  • Вставить строку:

    cellset = Element('CellSet')
    
    linenumber = 0;
    
    for line in shakespeare:      
        rowKey = username + "-" + filename + "-" + str(linenumber).zfill(6)
        rowKeyEncoded = base64.b64encode(rowKey)
    
        row = SubElement(cellset, 'Row', key=rowKeyEncoded)
    
        messageencoded = base64.b64encode(line.strip())
        linenumberencoded = encode(linenumber)
        usernameencoded = base64.b64encode(username)
    
        # Add bleet cell
        cell = SubElement(row, 'Cell', column=messagecolumnencoded)
        cell.text = messageencoded
    
        # Add username cell
        cell = SubElement(row, 'Cell', column=usernamecolumnencoded)
        cell.text = usernameencoded
    
        # Add Line Number cell
        cell = SubElement(row, 'Cell', column=linenumbercolumnencoded)
        cell.text = linenumberencoded
    
        linenumber = linenumber + 1
    
        # Submit XML to REST server
        request = requests.post(baseurl + "/" + tablename + "/fakerow", data=tostring(cellset), headers={"Content-Type" : "text/xml", "Accept" : "text/xml"})
    
  • Удалить таблицу:

    request = requests.delete(baseurl + "/" + tablename + "/schema")
    
...