Как взаимодействовать с Hbase через knox, используя Python?
Я пытаюсь взаимодействовать с 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 ответ
Как вы определили, единственный способ общаться с HBase через Knox - через REST API HBase. Happybase пытается напрямую подключиться к HBase через RPC, который Knox заблокирует.
Вы не можете использовать Happybase вне кластера с включенным Knox.
Хорошее руководство по использованию HBase REST API с 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")