Hive之——Thrift服务
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使⽤HiveServer
Groovy是进⾏原型设计的理想选择,因为其很好的兼容Java,并提供了⼀个所见即所得(REPL)的编码过程
wget dl.bintray/groovy/maven/apache-groovy-sdk-2.5.6.zip
unzip apache-groovy-sdk-2.5.6.zip
下载好压缩包后,通过修改f⽂件,将所有的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
连接到HiveServer
从这个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.ansport.*;
groovy:000> transport = new TSocket("localhost", 10000);
thriftgroovy:000> protocol = new TBinaryProtocol(transport);
groovy:000> client = new HiveClient(protocol);
groovy:000> transport.open();
groovy:000> ute("show tables");
获取集状态信息
groovy:000> ClusterStatus();
结果集模式
在执⾏⼀个查询后,⽤户可以通过getSchema()⽅法获取到结果集的schema。如果⽤户在执⾏⼀个查询前调⽤这个⽅法的话,那么其将返
回⼀个null schema。
groovy:000> Schema();
groovy:000> ute("show tables");
groovy:000> Schema();
获取结果
当执⾏查询后,⽤户可以通过fetchOne()⽅法获取到结果集。并不建议通过Thrift接⼝来获取数据量⼤的结果。fetchOne()⽅法⽤于获取
⼀⾏数据:
groovy:000> client.fetchOne();
还可以通过fetchAll()⽅法以字符数组的形式获取整个结果集:
groovy:000> client.fetchAll();
获取执⾏计划
执⾏过⼀个查询之后,就可以使⽤getQueryPlan()⽅法来获取关于这个查询的状态信息。信息内容包括计数器的信息和job的状态信息:
groovy:000> ute("select * from time_to_serve");
groovy:000> QueryPlan();
元数据存储⽅法
Hive通过Thrift提供Hive元数据存储的服务。通常来说,⽤户应该不能够直接调⽤元数据存储⽅法直接对元数据进⾏修改,⽽应该通过
HiveQL语⾔让Hive来执⾏这样的操作。⽤户应该只能通过利⽤只读⽅法来获取表的元数据信息。例如
可以使⽤
get_partition_names(String, String, short)⽅法来确认查询可以使⽤的分区有哪些:
groovy:000> _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<String> check(){
List<String> bad = new ArrayList<String>();
for(String database : _all_databases()){
for(String table : _all_tables(database)){
try{
Table t = _table(database, table);
URI u = new Sd().getLocation());
if("MANAGED_TABLE".TableType()) && !u.getPath().contains("/user/hive/warehouse")){
System.out.TableName() + " is a non external table mounted inside /user/hive/warehouse");
bad.TableName());
}
}catch(Exception e){
}
}
}
return bad;
}
管理HiveServer
Hive CLI会在本地创建如⽂件名为.hivehistory这样的部件,以及会在/tmp⽬录和p.dir⽬录下创建⼀些条⽬
⽣成环境使⽤HiveServer
除了在本地安装完整的Hive客户端,还可以通过HiveServer服务来提交Job。在⽣产环境下使⽤HiveServer,通常客户端机器需要进⾏的形成执⾏计划和管理task的⼯作现在需要由服务端来完成。如果⽤户同时执⾏多个客户端的话,那么就会对于单个HiveServer造成太⼤的压⼒。⼀种简单的解决⽅案就是使⽤TCP负载均衡或者通过代理的⽅式为⼀组后⾯的服务器进⾏均衡连接。
可以通过haproxy⼯具来对众多的ThrfitServer服务器,并记录代理对应的虚拟服务器:
物理服务器配置
短域名主机名和端⼝
HiveService1 ample.pvt:10000
HiveService2 ample.pvt:10000
代理配置
主机名 IP地址和端⼝
安装Haproxy,以RHEL/CENTOS为例:
yum install haproxy
按照前⾯的清单来完成配置⽂件:
more /etc/haproxy/haproxy.cfg
listen hiveprimary 10.10.10.100:10000
balance leastconn
mode tcp
server ample.pvt:10000 check
server ample.pvt:10000 check
通过系统的init脚本来启动HAProxy。⼀旦确认可以正常执⾏后,那么就可以使⽤chkconfig命令将其加⼊到默认的系统启动过程中:
/etc/init.d/haproxy start
chkconfig haproxy on
清理
Hive提供了配置变量hive.start.cleanup.scratchdir,默认为false。将这个属性配置为true的话,那么就会每次重启HiveServer服务时清理掉临时⽬录
<property>
<name>hive.start.cleanup.scratchdir</name>
<value>true</value>
</property>
Hive ThriftMetastore
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这样的客户端需要直接和元数据存储通信:
<property>
<name&astore.local</name>
<value>false</value>
</property>
<property>
<name&astore.uris</name>
<value>thrift://metastore_server:9083</value>
</property>
这个变化对⽤户来说是透明的,不过,对于Hadoop安全来说有细微的差别,⽽且需要以⽤户的⾝份信息来执⾏元数据存储相关的操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论