Python使用pyhive库远程操作hive的配置和使用
請先安裝好hive,林子雨老師的配置方法,該配置方法是可以配置成功的,請注意配置hive-site.xml文件的時候,里面添加的信息都是在標簽里的尾部添加
配置hive環境
到hive安裝的conf目錄下,把hive-env.sh.template復制一份并改名為hive-env.sh
cd /usr/local/hive/conf/ cp hive-env.sh.template hive-env.sh然后配置hive-env.sh文件,進入里面會發現里面都是被注釋了的。
使用命令vim /usr/local/hive/conf/hive-env.sh進入里面配置,添加的內容如下。當然,具體路徑要看自己情況。第一個是Hadoop的安裝目錄,第二個是JDK的安裝目錄,第三個是hive的配置目錄
HADOOP_HOME=/usr/local/hadoop JAVA_HOME=/usr/lib/jvm/jdk1.8.0_261 export HIVE_CONF_DIR=/usr/local/hive/conf然后配置hive-site.xml文件,添加的內容如下
使用命令vim /usr/local/hive/conf/hive-site.xml進入里面配置,在標簽里的尾部添加如下內容。注意:下面的zhong和123456是用來登陸hive的賬號和密碼,連接時會使用到;NOSASL是登陸驗證方式,在連接的時候會使用到
<property><name>hive.server2.thrift.client.user</name><value>zhong</value><description>Username to use against thrift client</description></property><property><name>hive.server2.thrift.client.password</name><value>123456</value><description>Password to use against thrift client</description></property><property><name>hive.server2.authentication</name><value>NOSASL</value></property><property><name>hive.auto.convert.join</name><value>false</value></property>在Hadoop的core-site.xml文件中的標簽內的尾部添加以下內容,要注意兩點,下面配置中的兩個zhong是我登陸Hadoop的用戶名,一般就是用戶名,如果你像網上那樣建議配置Hadoop,那么你可能使用的用戶名是hadoop。請替換為你的登陸名。hive.auto.convert.join為false如果沒有配置該條,遠程連接操作時可以新建數據庫和表,但是不能插入語句,具體原因在這里可以看到http://www.voidcn.com/article/p-cnbletfe-no.html
使用命令vim /usr/local/hadoop/etc/hadoop/core-site.xml打開文件。
hadoop.proxyuser.zhong.hosts 配置hadoop的代理用戶,主要是用于讓hiveserver2客戶端訪問及操作hadoop文件具備權限。另一個是組,也是同樣的原理
開啟Hadoop和hive
在Ubuntu開啟Hadoop和hive
# 到hadoop的命令目錄下運行開啟dfs的腳本,如果你已將該目錄加入到PATH路徑下,那么就可以直接start-dfs.sh,而不需要打開目錄然后運行shell腳本 cd /usr/local/hadoop/sbin ./start-dfs.sh# 到hive的命令目錄下運行hive的腳本,并在后臺運行,如果已將該目錄添加到PATH路徑下,可以不用打開目錄,并省略符號點斜桿(./) cd /usr/local/hive/bin nohup ./hive --service metastore & nohup ./hive --service hiveserver2 &nohup命令是系統的命令,它的作用可以使用命令nohup --help查看它的使用方法(:忽略掛起信號運行指定的命令)。使用以上命令會有提示信息,只要回車就行了
使用命令jobs -l可以查看后臺運行的進程(二路,不是一),我的顯示如下
zhong@zhong-VirtualBox:/usr/local/hive/bin$ jobs -l [1]- 6076 運行中 nohup hive --service metastore & (工作目錄: /usr/local/hive/conf) [2]+ 6178 運行中 nohup hive --service hiveserver2 & (工作目錄: /usr/local/hive/conf)如果不能正常運行上面兩個進程,就去看看報錯信息,開啟時會提示說nohup的錯誤信息會輸出到哪里(我的是輸出到用戶的家目錄下的nohup.out文件:/home/zhong/nohup.out)
此時使用jps命令可以看到如下(我配置的Hadoop是偽分布式):
12417 RunJar 12292 RunJar 10602 SecondaryNameNode 10220 NameNode 12685 Jps 10382 DataNode注意:開啟了Hadoop和hive之后要等大概一分鐘后再使用python代碼操作hive,否則連接不上,會報錯
關閉Hadoop和hive
如果運行完畢,想關閉,可以使用以下方法:
先關閉hive的進程,以下命令是殺死進程的意思,數字是上面運行jobs -l命令后顯示的數字,具體數字要看自己的情況,有時使用jobs -l命令顯示不出后臺運行的進程,也可以使用jps命令查看在JVM中運行的進程,其中RunJar就是hive的進程
kill 6076 kill 6178然后關閉Hadoop
# 到hadoop的命令目錄下運行關閉dfs的腳本,如果你已將該目錄加入到PATH路徑下,那么就可以直接stop-dfs.sh,而不需要打開目錄然后運行shell腳本 cd /usr/local/hadoop/sbin ./stop-dfs.sh------------Ubuntu配置完畢------------
我操作hive的方式是,在Windows運行Python程序控制Ubuntu虛擬機的安裝的hive
在Windows安裝四個Python的庫,我安裝時sasl庫報錯了,但是能夠遠程連接,不知道為什么
pip install sasl thrift thrift-sasl PyHive開始寫Python代碼操作hive
PyHive庫的官方API文檔:https://pypi.org/project/PyHive/
該庫的使用方法和pymysql庫類似
# 查看有哪些數據庫 from pyhive import hiveconn = hive.Connection(host='192.168.31.224', port=10000, username='zhong', auth='NOSASL') curs = conn.cursor() # 獲取一個游標 sql = 'show databases' # 操作語句 curs.execute(sql) # 執行sql語句 print(curs.fetchall()) # 輸出獲取結果的所有行連接數據庫時,它有個默認參數database='default'用來指定連接那個數據庫,默認時default,該數據庫是安裝hive時自動創建的數據庫,若想連接某一個數據庫可以指定該參數
# 查看數據庫zhong,下面有哪些表 from pyhive import hiveconn = hive.Connection(host='192.168.31.224', port=10000, username='zhong', auth='NOSASL', database='zhong') curs = conn.cursor() # 獲取一個游標 sql = 'show tables' # 操作語句 curs.execute(sql) # 執行sql語句 print(curs.fetchall()) # 輸出獲取結果的所有行具體的操作語句和SQL語句基本一致,就不演示了,但注意的是hive主要是用來做數據倉庫的所以支持查和增數據,默認不能使用改和刪數據。
官方也意識到了hive要訪問MySQL數據庫之后再訪問HDFS,HDFS再訪問磁盤的緩慢,所以也支持異步的方式操作hive。官方的實例如下(經過修改):
from pyhive import hive from TCLIService.ttypes import TOperationStateconn = hive.Connection(host='192.168.31.224', port=10000, username='zhong', auth='NOSASL', database='zhong') cursor = conn.cursor() # 獲取游標 sql = 'show tables' # sql語句 cursor.execute(sql, async_=True) # 聲明是異步函數status = cursor.poll().operationState # 記錄啟用循環隊列的狀態 while status in (TOperationState.INITIALIZED_STATE, TOperationState.RUNNING_STATE): # 如果時起始狀態或者正在運行狀態logs = cursor.fetch_logs() # 獲取運行過程中產生的日志信息,返回值放在列表中for message in logs: # 迭代日志信息print(message)status = cursor.poll().operationState # 再次記錄啟用循環隊列的狀態 # 獲取到結果,循環隊列結束 print(cursor.fetchall()) # 輸出查詢結果官方并沒有詳細解釋了怎么使用異步方式操作hive,比如,沒有解釋怎么增加異步運行任務,而且使用的是最原始的循環。如果正常代碼中使用該方法進行異步操作,將沒有任何意義,還會增加工作量。還不如使用concurrent.futures對象的方法將該任務轉為異步的進程池或線程池內的子任務。
from pyhive import hive from concurrent.futures.thread import ThreadPoolExecutordef func_1():conn = hive.Connection(host='192.168.31.224', port=10000, username='zhong', auth='NOSASL', database='zhong')curs = conn.cursor() # 獲取一個游標sql = 'show tables' # 操作語句curs.execute(sql) # 執行sql語句print(curs.fetchall()) # 輸出獲取結果的所有行if __name__ == "__main__":pool = ThreadPoolExecutor(max_workers=5) # 創建線程池pool.submit(func_1) # 提交一個任務,第一個參數是普通函數的本身,后面的所有參數都是普通函數的參數總結
以上是生活随笔為你收集整理的Python使用pyhive库远程操作hive的配置和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杨辉三角java
- 下一篇: OC基础知识(面试必看)