转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88636689
Hive有个可选的组件叫做HiveServer或者HiveThrift,其允许通过制定端口访问Hive。Thrift是一个软件框架,允许客户端使用包括Java、C++、Ruby和其他很多种语言,通过编程的方式远程访问Hive。
启动Thrift Server
hive --service hiveserver2 &
检查HiveServer是否启动成功最快捷方法就是使用netstat命令查看10000端口是否打开并监听连接:
[root@binghe ~]# netstat -nl | grep 10000
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN
Groovy是进行原型设计的理想选择,因为其很好的兼容Java,并提供了一个所见即所得(REPL)的编码过程
wget https://dl.bintray.com/groovy/maven/apache-groovy-sdk-2.5.6.zip
unzip apache-groovy-sdk-2.5.6.zip
下载好压缩包后,通过修改groovy-starter.conf文件,将所有的Hive Jar文件加入到Groovy的classpath路径中。这将允许Groovy直接和Hive进行交互而无需认为的在每个会话中载入相关的Jar文件。
# load required libraries
load !{groovy.home}/lib/*.jar
#load user specific libraries
load !{user.home}/.groovy/lib/*.jar
#tools.jar for ant tasks
load ${tools.jar}
load /home/hadoop/hadoop-2.9.2/lib/*.jar
load /home/hadoop/hadoop-2.9.2/lib/*.jar
load /home/hadoop/hive-2.3.4/lib/*.jar
配置Groovy环境变量
GROOVY_HOME=/usr/local/groovy-2.5.6
PATH=$GROOVY_HOME/bin:$PATH
export PATH GROOVY_HOME
从这个REPL中,导入Hive和Thrift相关的类。这些类用于连接到Hive,及创建一个HiveClient实例。HiveClient含有用户和Hive交互所需要的常用方法:
我们启动groovy
[root@binghe ~]# groovysh
Mar 18, 2019 9:27:40 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Groovy Shell (2.5.6, JVM: 1.8.0_202)
Type ':help' or ':h' for help.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> import org.apache.hadoop.hive.service.*;
groovy:000> import org.apache.thrift.protocol.*;
groovy:000> import org.apache.thrift.transport.*;
groovy:000> transport = new TSocket("localhost", 10000);
groovy:000> protocol = new TBinaryProtocol(transport);
groovy:000> client = new HiveClient(protocol);
groovy:000> transport.open();
groovy:000> client.execute("show tables");
获取集群状态信息
groovy:000> client.getClusterStatus();
结果集模式
在执行一个查询后,用户可以通过getSchema()方法获取到结果集的schema。如果用户在执行一个查询前调用这个方法的话,那么其将返回一个null schema。
groovy:000> client.getSchema();
groovy:000> client.execute("show tables");
groovy:000> client.getSchema();
获取结果
当执行查询后,用户可以通过fetchOne()方法获取到结果集。并不建议通过Thrift接口来获取数据量大的结果。fetchOne()方法用于获取一行数据:
groovy:000> client.fetchOne();
还可以通过fetchAll()方法以字符数组的形式获取整个结果集:
groovy:000> client.fetchAll();
获取执行计划
执行过一个查询之后,就可以使用getQueryPlan()方法来获取关于这个查询的状态信息。信息内容包括计数器的信息和job的状态信息:
groovy:000> client.execute("select * from time_to_serve");
groovy:000> client.getQueryPlan();
元数据存储方法
Hive通过Thrift提供Hive元数据存储的服务。通常来说,用户应该不能够直接调用元数据存储方法直接对元数据进行修改,而应该通过HiveQL语言让Hive来执行这样的操作。用户应该只能通过利用只读方法来获取表的元数据信息。例如可以使用get_partition_names(String, String, short)方法来确认查询可以使用的分区有哪些:
groovy:000> client.get_partition_names("default", "fracture_act", (short)0)
以编程的方式来访问元数据存储的能力提供了部署过程中的监控和执行条件的能力。
默认情况下,管理表会在数据仓库目录下存储表数据,这个目录默认为/user/hive/warehouse。而通常情况下,外部表不会使用这个目录,但是也并非就不能使用这个目录存储外部表数据。
在接下来的这个程序中,最外层的循环对get_all_databases()方法返回的结果列表进行迭代。而内层的循环对get_all_tables(database)方法的结果列表进行迭代。方法get_table(database, table)的放回结果Table对象包含了这个表的所有元数据信息。我们可以检查表的存储路径和表的类型是否是MANAGED_TABLE。外部表的表类型是EXTERNAL。最终会返回一组“不符合规则的”表名,用列表bad表示:
public List check(){
List bad = new ArrayList();
for(String database : client.get_all_databases()){
for(String table : client.get_all_tables(database)){
try{
Table t = client.get_table(database, table);
URI u = new URI(t.getSd().getLocation());
if("MANAGED_TABLE".equals(t.getTableType()) && !u.getPath().contains("/user/hive/warehouse")){
System.out.println(t.getTableName() + " is a non external table mounted inside /user/hive/warehouse");
bad.add(t.getTableName());
}
}catch(Exception e){
System.err.println("Had exception but will continue: " + e);
}
}
}
return bad;
}
Hive CLI会在本地创建如文件名为.hivehistory这样的部件,以及会在/tmp目录和hadoop.tmp.dir目录下创建一些条目
除了在本地安装完整的Hive客户端,还可以通过HiveServer服务来提交Job。在生产环境下使用HiveServer,通常客户端机器需要进行的形成执行计划和管理task的工作现在需要由服务端来完成。如果用户同时执行多个客户端的话,那么就会对于单个HiveServer造成太大的压力。一种简单的解决方案就是使用TCP负载均衡或者通过代理的方式为一组后面的服务器进行均衡连接。
可以通过haproxy工具来对众多的ThrfitServer服务器,并记录代理对应的虚拟服务器:
物理服务器配置
短域名 主机名和端口
HiveService1 hiveserver1.example.pvt:10000
HiveService2 hiveserver2.example.pvt:10000
代理配置
主机名 IP地址和端口
hiveprimary.example.pvt 10.10.10.100:10000
安装Haproxy,以RHEL/CENTOS为例:
yum install haproxy
按照前面的清单来完成配置文件:
more /etc/haproxy/haproxy.cfg
listen hiveprimary 10.10.10.100:10000
balance leastconn
mode tcp
server hivethrift1 hiveserver1.example.pvt:10000 check
server hivethrift2 hiveserver2.example.pvt:10000 check
通过系统的init脚本来启动HAProxy。一旦确认可以正常执行后,那么就可以使用chkconfig命令将其加入到默认的系统启动过程中:
/etc/init.d/haproxy start
chkconfig haproxy on
Hive提供了配置变量hive.start.cleanup.scratchdir,默认为false。将这个属性配置为true的话,那么就会每次重启HiveServer服务时清理掉临时目录
hive.start.cleanup.scratchdir
true
Hive提供了一个可选的组件名为ThriftMetastore。在这种设置下,Hive客户端会连接到ThriftMetastore,而且回合JDBCMetastore进行通信。大多数的部署是不需要这个组件的。对于那些非Java客户端而又需要获取到元数据存储信息时才会使用这个组件。使用这种元数据库服务需要2个单独的配置:
ThriftMetastore配置
ThriftMetastore应该和实际使用JDBC的元数据存储进行通信,然后再通过如下方法启动metastore:
hive --service metastore &
确认元数据服务启动并正在执行:
netstat -an | grep 9083
tcp 0 0 0.0.0.0:9083 0.0.0.0:* LISTEN
客户端配置
像CLI这样的客户端需要直接和元数据存储通信:
hive.metastore.local
false
hive.metastore.uris
thrift://metastore_server:9083
这个变化对用户来说是透明的,不过,对于Hadoop安全来说有细微的差别,而且需要以用户的身份信息来执行元数据存储相关的操作。