通过 HiveServer2 访问 Hive
一、hive服务简介
先解释一下几个名词:
- metadata :hive元数据,即hive定义的表名,字段名,类型,分区,用户这些数据。一般存储关系型书库mysql中,在测试阶段也可以用hive内置Derby数据库。
- metastore :hivestore服务端。主要提供将DDL,DML等语句转换为MapReduce,提交到hdfs中。
- hiveserver2:hive服务端。提供hive服务。客户端可以通过beeline,jdbc(即用java代码链接)等多种方式链接到hive。
- beeline:hive客户端链接到hive的一个工具。可以理解成mysql的客户端。如:navite cat 等。
其它语言访问hive主要是通过hiveserver2服务,HiveServer2(HS2)是一种能使客户端执行Hive查询的服务。HiveServer2可以支持对 HiveServer2 的嵌入式和远程访问,支持多客户端并发和身份认证。旨在为开放API客户端(如JDBC和ODBC)提供更好的支持。
会启动一个hive服务端默认端口为:10000,可以通过beeline,jdbc,odbc的方式链接到hive。hiveserver2启动的时候会先检查有没有配置 hive.metastore.uris
,如果没有会先启动一个metastore服务,然后在启动hiveserver2。如果有配置hive.metastore.uris
。会连接到远程的metastore服务。这种方式是最常用的。部署在图如下:
二、Python访问Hive
Python3访问hive需要安装的依赖有:
- pip3 install thrift
- pip3 install PyHive
- pip3 install sasl
- pip3 install thrift_sasl
这里有一个Python访问Hive的工具类:
# -*- coding:utf-8 -*-
from pyhive import hive
class HiveClient(object):
"""docstring for HiveClient"""
def __init__(self, host='hadoop-master',port=10000,username='hadoop',password='hadoop',database='hadoop',auth='LDAP'):
"""
create connection to hive server2
"""
self.conn = hive.Connection(host=host,
port=port,
username=username,
password=password,
database=database,
auth=auth)
def query(self, sql):
"""
query
"""
with self.conn.cursor() as cursor:
cursor.execute(sql)
return cursor.fetchall()
def insert(self, sql):
"""
insert action
"""
with self.conn.cursor() as cursor:
cursor.execute(sql)
# self.conn.commit()
# self.conn.rollback()
def close(self):
"""
close connection
"""
self.conn.close()
使用的时候,只需要导入,然后创建一个对象实例即可,传入sql调用query方法完成查询。
# 拿一个连接
hclient = hive.HiveClient()
# 执行查询操作
...
# 关闭连接
hclient.close()
注意:在insert插入方法中,我将self.conn.commit()和self.conn.rollback()即回滚注释了,这是传统关系型数据库才有的事务操作,Hive中是不支持的。
相关文章:
知乎 | 通过HiveServer2访问Hive
官网 | HiveServer2 Clients
知乎 | 五万字 | Hive知识体系保姆级教程
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)