簡體   English   中英

如何從 Windows 通過 pyhive 連接到 Hive

[英]How to Connect to Hive via pyhive from Windows

在過去的幾天里,我一直在絞盡腦汁嘗試使用Windows上的 pyhive 連接到帶有 Python 客戶端的 Hive 服務器。 我是 Hive 的新手(pyhive 也是如此),但我是一位經驗豐富的 Python 開發人員。 我總是收到以下錯誤:

(pyhive-test) C:\dev\sandbox\pyhive-test>python test.py
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    conn = hive.Connection(host='192.168.1.196', port='10000', database='default', auth='NONE')
  File "C:\Users\harnerd\Anaconda3\envs\pyhive-test\lib\site-packages\pyhive\hive.py", line 192, in __init__
    self._transport.open()
  File "C:\Users\harnerd\Anaconda3\envs\pyhive-test\lib\site-packages\thrift_sasl\__init__.py", line 84, in open
    raise TTransportException(type=TTransportException.NOT_OPEN,
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: Unable to find a callback: 2'

執行以下腳本時:

from pyhive import hive

conn = hive.Connection(host='192.168.1.196', port='10000', database='default', auth='NONE')
cur = conn.cursor()
cur.execute('show tables')
data = cur.fetchall()
print(data)

HiveServer2 實例是來自 Cloudera 的開箱即用 HDP 沙盒 VM,其中 HiveServer2 身份驗證設置為“無”。

客戶端是 Windows 10 上的 Anaconda 虛擬環境,使用 Python 3.8.5 和 conda 安裝的以下軟件包:

  • pyhive 0.6.1
  • 薩斯勒 0.2.1
  • 節儉 0.13.0
  • 節儉-sasl 0.4.2

現在我只是嘗試使用上面的腳本連接到 Hive,但最終我打算在 Flask 應用程序的 SQLAlchemy 中使用 pyhive。 換句話說:Flask -> Flask-SQLAlchemy -> SQLAlchemy -> pyhive。 在生產中,Flask 應用程序將由 Cloudera Data Science Workbench(即某種 Linux 風格)托管,但將在 Windows 系統上開發(因此也必須運行)。

當然,我已經在 Cloudera 的網站和 GitHub 上查看了與 Hive 連接問題有關的許多問題,如果有人用槍指着我的頭,我不得不說從 Windows 客戶端嘗試這個可能是問題的一部分因為這似乎不是一件很常見的事情。

No mechanism available

這個錯誤甚至意味着什么? 如果有一些關於如何從 python 配置和使用 SASL 的文檔,那肯定會很好——如果有的話,我想知道它。

FWIW,導致錯誤的thrift_sasl/__init__.py

ret, chosen_mech, initial_response = self.sasl.start(self.mechanism)

self.mechanism是“平原”; chosen_mechinitial_response是空字符串 ('')。 ret為 False,這會導致拋出異常。

我知道我不是唯一一個試圖在 Windows 上使用 pyhive 連接到 Hive 的人 - 這個人( 嘗試從我的 PC 上通過 python 連接到 hive(hue) 時出現 SASL 錯誤 - Windows10 )是,但他的“解決方案” - 安裝Ubuntu 作為他的 Windows 機器上的虛擬機 - 不適合我。

長話短說,這個問題的答案是 Windows 根本不支持 PyHive。 這是因為 PyHive 使用 sasl 庫進行 Hive 連接,而且 sasl 不僅難以在 Windows 上從源代碼編譯,而且似乎根本無法在 Windows 上運行。

關鍵是提供你自己的 thrift_transport 而不是依賴 PyHive 來創建它。 Devin Stevenson 提供了一種替代傳輸( https://github.com/devinstevenson/pure-transport ),它在 Windows 上運行良好,並且應該在其他操作系統上運行(但是我還沒有測試過)。 他的 repo 提供了直接使用 Hive 以及 SQLAlchemy 進行純傳輸的示例。

在我的用例中,我在 Flask 應用程序中將它與 Flask-SQLAlchemy 一起使用。 我注入節儉運輸的方式是這樣的:

from flask_sqlalchemy import SQLAlchemy
import puretransport

thrift_transport = puretransport.transport_factory(host='127.0.0.1',
                                                   port=10000,
                                                   username='a_user',
                                                   password='a_password')


class MySQLAlchemy(SQLAlchemy):
    '''
    Subclassing the standard SQLAlchemy class so we can inject our own thrift
    transport which is needed to get pyhive to work on Windows
    '''
    def apply_driver_hacks(self, app, sa_url, options):
        '''
        If the current driver is for Hive, add our thrift transport
        '''
        if sa_url.drivername.startswith('hive'):
            if 'connect_args' not in options:
                options['connect_args'] = {'thrift_transport': thrift_transport}
        return super(MySQLAlchemy, self).apply_driver_hacks(app, sa_url, options)

# later, in models.py...
db = MySQLAlchemy()

class AModelClass(db.Model):
    __tablename__ = 'some_table'
    id = db.Column(db.Integer, primary_key=True)
    # etc...

在我的例子中,我用於 Hive 連接的 URL 只是hive:///{database_name}的形式,即: hive:///customers ,因為所有必要的信息都是使用 thrift 傳輸傳遞的。 但是有一個警告 - 在注入 thrift 傳輸時,PyHive 斷言hostportauthkerberos_service_namepassword不能具有除None以外的任何值。 不幸的是,如果沒有提供端口號,SQLAlchemy 會將默認的 Hive 端口 10000 分配給port 解決方案是替換HiveDialect.create_connect_args方法,如下所示: https ://github.com/devinstevenson/pure-transport/issues/7。 簡單地繼承 HiveDialect 類在這里是行不通的,因為HiveDialect這個名字在 SQLAlchemy 的方言注冊表中並且不能簡單地被替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM