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
- 下一篇: python 状态空间模型_基于状态空间