Python使用pyhive库远程操作hive的配置和使用
請先安裝好hive,林子雨老師的配置方法,該配置方法是可以配置成功的,請注意配置hive-site.xml文件的時候,里面添加的信息都是在標(biāo)簽里的尾部添加
配置hive環(huán)境
到hive安裝的conf目錄下,把hive-env.sh.template復(fù)制一份并改名為hive-env.sh
cd /usr/local/hive/conf/ cp hive-env.sh.template hive-env.sh然后配置hive-env.sh文件,進(jìn)入里面會發(fā)現(xiàn)里面都是被注釋了的。
使用命令vim /usr/local/hive/conf/hive-env.sh進(jìn)入里面配置,添加的內(nèi)容如下。當(dāng)然,具體路徑要看自己情況。第一個是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文件,添加的內(nèi)容如下
使用命令vim /usr/local/hive/conf/hive-site.xml進(jìn)入里面配置,在標(biāo)簽里的尾部添加如下內(nèi)容。注意:下面的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文件中的標(biāo)簽內(nèi)的尾部添加以下內(nèi)容,要注意兩點(diǎn),下面配置中的兩個zhong是我登陸Hadoop的用戶名,一般就是用戶名,如果你像網(wǎng)上那樣建議配置Hadoop,那么你可能使用的用戶名是hadoop。請?zhí)鎿Q為你的登陸名。hive.auto.convert.join為false如果沒有配置該條,遠(yuǎn)程連接操作時可以新建數(shù)據(jù)庫和表,但是不能插入語句,具體原因在這里可以看到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文件具備權(quán)限。另一個是組,也是同樣的原理
開啟Hadoop和hive
在Ubuntu開啟Hadoop和hive
# 到hadoop的命令目錄下運(yùn)行開啟dfs的腳本,如果你已將該目錄加入到PATH路徑下,那么就可以直接start-dfs.sh,而不需要打開目錄然后運(yùn)行shell腳本 cd /usr/local/hadoop/sbin ./start-dfs.sh# 到hive的命令目錄下運(yùn)行hive的腳本,并在后臺運(yùn)行,如果已將該目錄添加到PATH路徑下,可以不用打開目錄,并省略符號點(diǎn)斜桿(./) cd /usr/local/hive/bin nohup ./hive --service metastore & nohup ./hive --service hiveserver2 &nohup命令是系統(tǒng)的命令,它的作用可以使用命令nohup --help查看它的使用方法(:忽略掛起信號運(yùn)行指定的命令)。使用以上命令會有提示信息,只要回車就行了
使用命令jobs -l可以查看后臺運(yùn)行的進(jìn)程(二路,不是一),我的顯示如下
zhong@zhong-VirtualBox:/usr/local/hive/bin$ jobs -l [1]- 6076 運(yùn)行中 nohup hive --service metastore & (工作目錄: /usr/local/hive/conf) [2]+ 6178 運(yùn)行中 nohup hive --service hiveserver2 & (工作目錄: /usr/local/hive/conf)如果不能正常運(yùn)行上面兩個進(jìn)程,就去看看報錯信息,開啟時會提示說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,否則連接不上,會報錯
關(guān)閉Hadoop和hive
如果運(yùn)行完畢,想關(guān)閉,可以使用以下方法:
先關(guān)閉hive的進(jìn)程,以下命令是殺死進(jìn)程的意思,數(shù)字是上面運(yùn)行jobs -l命令后顯示的數(shù)字,具體數(shù)字要看自己的情況,有時使用jobs -l命令顯示不出后臺運(yùn)行的進(jìn)程,也可以使用jps命令查看在JVM中運(yùn)行的進(jìn)程,其中RunJar就是hive的進(jìn)程
kill 6076 kill 6178然后關(guān)閉Hadoop
# 到hadoop的命令目錄下運(yùn)行關(guān)閉dfs的腳本,如果你已將該目錄加入到PATH路徑下,那么就可以直接stop-dfs.sh,而不需要打開目錄然后運(yùn)行shell腳本 cd /usr/local/hadoop/sbin ./stop-dfs.sh------------Ubuntu配置完畢------------
我操作hive的方式是,在Windows運(yùn)行Python程序控制Ubuntu虛擬機(jī)的安裝的hive
在Windows安裝四個Python的庫,我安裝時sasl庫報錯了,但是能夠遠(yuǎn)程連接,不知道為什么
pip install sasl thrift thrift-sasl PyHive開始寫Python代碼操作hive
PyHive庫的官方API文檔:https://pypi.org/project/PyHive/
該庫的使用方法和pymysql庫類似
# 查看有哪些數(shù)據(jù)庫 from pyhive import hiveconn = hive.Connection(host='192.168.31.224', port=10000, username='zhong', auth='NOSASL') curs = conn.cursor() # 獲取一個游標(biāo) sql = 'show databases' # 操作語句 curs.execute(sql) # 執(zhí)行sql語句 print(curs.fetchall()) # 輸出獲取結(jié)果的所有行連接數(shù)據(jù)庫時,它有個默認(rèn)參數(shù)database='default'用來指定連接那個數(shù)據(jù)庫,默認(rèn)時default,該數(shù)據(jù)庫是安裝hive時自動創(chuàng)建的數(shù)據(jù)庫,若想連接某一個數(shù)據(jù)庫可以指定該參數(shù)
# 查看數(shù)據(jù)庫zhong,下面有哪些表 from pyhive import hiveconn = hive.Connection(host='192.168.31.224', port=10000, username='zhong', auth='NOSASL', database='zhong') curs = conn.cursor() # 獲取一個游標(biāo) sql = 'show tables' # 操作語句 curs.execute(sql) # 執(zhí)行sql語句 print(curs.fetchall()) # 輸出獲取結(jié)果的所有行具體的操作語句和SQL語句基本一致,就不演示了,但注意的是hive主要是用來做數(shù)據(jù)倉庫的所以支持查和增數(shù)據(jù),默認(rèn)不能使用改和刪數(shù)據(jù)。
官方也意識到了hive要訪問MySQL數(shù)據(jù)庫之后再訪問HDFS,HDFS再訪問磁盤的緩慢,所以也支持異步的方式操作hive。官方的實例如下(經(jīng)過修改):
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() # 獲取游標(biāo) sql = 'show tables' # sql語句 cursor.execute(sql, async_=True) # 聲明是異步函數(shù)status = cursor.poll().operationState # 記錄啟用循環(huán)隊列的狀態(tài) while status in (TOperationState.INITIALIZED_STATE, TOperationState.RUNNING_STATE): # 如果時起始狀態(tài)或者正在運(yùn)行狀態(tài)logs = cursor.fetch_logs() # 獲取運(yùn)行過程中產(chǎn)生的日志信息,返回值放在列表中for message in logs: # 迭代日志信息print(message)status = cursor.poll().operationState # 再次記錄啟用循環(huán)隊列的狀態(tài) # 獲取到結(jié)果,循環(huán)隊列結(jié)束 print(cursor.fetchall()) # 輸出查詢結(jié)果官方并沒有詳細(xì)解釋了怎么使用異步方式操作hive,比如,沒有解釋怎么增加異步運(yùn)行任務(wù),而且使用的是最原始的循環(huán)。如果正常代碼中使用該方法進(jìn)行異步操作,將沒有任何意義,還會增加工作量。還不如使用concurrent.futures對象的方法將該任務(wù)轉(zhuǎn)為異步的進(jìn)程池或線程池內(nèi)的子任務(wù)。
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() # 獲取一個游標(biāo)sql = 'show tables' # 操作語句curs.execute(sql) # 執(zhí)行sql語句print(curs.fetchall()) # 輸出獲取結(jié)果的所有行if __name__ == "__main__":pool = ThreadPoolExecutor(max_workers=5) # 創(chuàng)建線程池pool.submit(func_1) # 提交一個任務(wù),第一個參數(shù)是普通函數(shù)的本身,后面的所有參數(shù)都是普通函數(shù)的參數(shù)總結(jié)
以上是生活随笔為你收集整理的Python使用pyhive库远程操作hive的配置和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杨辉三角java
- 下一篇: python 状态空间模型_基于状态空间