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进入里面配置,在标签里的尾部添加如下内容。注意:下面的zhong123456是用来登陆hive的账号和密码,连接时会使用到;NOSASL是登陆验证方式,在连接的时候会使用到

  <property>
    <name>hive.server2.thrift.client.username>
    <value>zhongvalue>
    <description>Username to use against thrift clientdescription>
  property>
  <property>
    <name>hive.server2.thrift.client.passwordname>
    <value>123456value>
    <description>Password to use against thrift clientdescription>
  property>
  <property>
        <name>hive.server2.authenticationname>
        <value>NOSASLvalue>
  property>
  <property>
    <name>hive.auto.convert.joinname>
    <value>falsevalue>
  property>

在Hadoop的core-site.xml文件中的标签内的尾部添加以下内容,要注意两点,下面配置中的两个zhong是我登陆Hadoop的用户名,一般就是用户名,如果你像网上那样建议配置Hadoop,那么你可能使用的用户名是hadoop。请替换为你的登陆名。hive.auto.convert.joinfalse如果没有配置该条,远程连接操作时可以新建数据库和表,但是不能插入语句,具体原因在这里可以看到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文件具备权限。另一个是组,也是同样的原理

         <property>
                 <name>hadoop.proxyuser.zhong.hostsname>
                 <value>*value>
         property>
         <property>
                 <name>hadoop.proxyuser.zhong.groupsname>
                 <value>*value>
         property>

开启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 hive

conn = 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 hive

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())  # 输出获取结果的所有行

具体的操作语句和SQL语句基本一致,就不演示了,但注意的是hive主要是用来做数据仓库的所以支持查和增数据,默认不能使用改和删数据

官方也意识到了hive要访问MySQL数据库之后再访问HDFS,HDFS再访问磁盘的缓慢,所以也支持异步的方式操作hive。官方的实例如下(经过修改):

from pyhive import hive
from TCLIService.ttypes import TOperationState


conn = 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 ThreadPoolExecutor


def 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学习,大数据,python,数据库,hive)