如何使用 Python 通过 knox 与 Hbase 交互?
How to interact to Hbase via knox using Python?
我正在尝试使用 Python 通过 hbase throght knox 进行交互,在 python
管理员给出了 hive、hbase 和 spark 的 knox API 端点列表,例如:
https://knox-devl.www.mysite.com:9042/gateway/MYSITEHDO/hbaseversion/cluster
现在,由于我使用的是 Python 的 happybase 库,所以我的连接代码是
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 库
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 或在集群上启用某些东西?
如您所见,通过 Knox 与 HBase 对话的唯一方法是通过 HBase 的 REST API。 Happybase 正在尝试通过 RPC 直接连接到 HBase,Knox 会阻止。
您不能从启用了 Knox 的集群外部使用 Happybase。
可在 here 中找到有关将 HBase REST API 与 Python 结合使用的好教程。以防 link 死掉,本文中一些最有用的命令是:
查看 table 的架构:
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"})
删除一个table:
request = requests.delete(baseurl + "/" + tablename + "/schema")
我正在尝试使用 Python 通过 hbase throght knox 进行交互,在 python
管理员给出了 hive、hbase 和 spark 的 knox API 端点列表,例如:
https://knox-devl.www.mysite.com:9042/gateway/MYSITEHDO/hbaseversion/cluster
现在,由于我使用的是 Python 的 happybase 库,所以我的连接代码是
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 库
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 或在集群上启用某些东西?
如您所见,通过 Knox 与 HBase 对话的唯一方法是通过 HBase 的 REST API。 Happybase 正在尝试通过 RPC 直接连接到 HBase,Knox 会阻止。
您不能从启用了 Knox 的集群外部使用 Happybase。
可在 here 中找到有关将 HBase REST API 与 Python 结合使用的好教程。以防 link 死掉,本文中一些最有用的命令是:
查看 table 的架构:
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"})
删除一个table:
request = requests.delete(baseurl + "/" + tablename + "/schema")