【摘要】本文將為大家帶來Python連接presto開源的兩個實踐案例。
Python連接presto開源提供了以下兩個庫可以使用
presto-python-client:https://github.com/prestodb/presto-python-client
pyhive:https://github.com/dropbox/PyHive
接下來就來分別實踐一下,這兩種客戶端。
環境准備
- 創建一台Ubuntu的ECS,VPC選擇和MRS集群一致
- 下載安裝apt-get,pip3,python3
- 安裝MRS客戶端
參考https://support.huaweicloud.com/usermanual-mrs/mrs_01_0091.html
遇到的報錯:Error: Network time protocol(NTP) not running. Please start NTP first.
解決方案:sudo /etc/init.d/ntp restart
4. 在MRS Manager頁面中系統設置>用戶管理中創建的用戶,並下載認證憑據,解壓后,將krb5.conf和user.keytab放到/root目錄下
5. 獲取SSL認證憑據
將集群中的/opt/Bigdata/MRS_1.8.10/install/FusionInsight-ldapclient-2.5.0/ldapclient/local/cert/cacert.pem文件拷貝到Ubuntu的ECS的/root目錄下
連接方式一:presto-python-client
(1)安裝依賴
- 安裝pandas:
pip3 install pandas
- 安裝requests-kerberos:
sudo apt-get install python3-dev
sudo apt install krb5-multidev
pip3 install requests_kerberos
- 安裝presto-python-client
pip3 install presto-python-client
(2)編寫代碼
import prestodb import os from pandas import DataFrame os.system('kinit -kt {}/user.keytab {}'.format('/root','sxy')) conn=prestodb.dbapi.connect( host='192.168.0.194', #Presto Coordinator的ip port=7521, user='sxy', catalog='tpcds', schema='sf1', http_scheme='https', auth=prestodb.auth.KerberosAuthentication(config='/root/krb5.conf',service_name='presto',principal='sxy',mutual_authentication=False,ca_bundle='/root/cacert.pem') ) cur = conn.cursor() cur.execute('select c_first_name, c_last_name from customer limit 5') df = DataFrame(cur.fetchall()) df.columns = ['First_Name', 'Last_Name'] print(df)
(3)運行結果
連接方式二:PyHive
(1)安裝依賴
- 安裝requests-kerberos:
sudo apt-get install python3-dev
sudo apt install krb5-multidev
pip3 install requests_kerberos
- 安裝pyhive
pip3 install pyhive2. 編寫代碼
(2)編寫代碼
from pyhive import presto presto_cli = presto.connect( host='192.168.0.194', port=7521, username='sxy', password='XXXX', # 創建用戶時設置的密碼 catalog='tpcds', schema='sf1', poll_interval=1, source='pyhive', session_props=None, protocol='https', requests_session=None, requests_kwargs={ 'verify':'/root/cacert.pem' }, KerberosRemoteServiceName='presto', KerberosPrincipal='sxy', KerberosConfigPath='/root/krb5.conf', KerberosKeytabPath='/root/user.keytab', KerberosCredentialCachePath=None, KerberosUseCanonicalHostname=None ) c = presto_cli.cursor() c.execute('show tables') for i in c.fetchall(): print(i)
(3)運行結果
那些踩的坑
- 用EulerOS鏡像裝requests-kerberos遇到一些XXX.h文件無法找到的問題
沒有找到EulerOS下替代sudo apt-get install python3-dev,修復該問題的方法。轉而使用Ubuntu。
2. SSL認證失敗
出現以下報錯的原因pem文件配置不正確
3. 401 Unauthorized報錯
原因:Kerberos的四個相關參數(user, principal,krb5,keytab)配置錯誤。
校驗參數的方法:用presto_cli工具登錄客戶端后執行show tables,若成功則,參數正確。