hive 服务器客户端 理解

在hive的分布式安装中,网上对于客户端和服务器的理解感觉并没有很清晰。接下来将简单说一下个人理解,如果有错,请各位大佬尽管指出,只是一种学习讨论罢了。

第一,在安装hive的各个节点(包括master和slave)上,对应的配置文件/conf/hive-site.xml中,都有下面这样一个配置:

<property>  
        <name>javax.jdo.option.ConnectionURL</name>  
        <value>jdbc:mysql://192.168.140.122:3306/hive?createDatabaseIfNotExist=true</value>  
        <description>JDBC connect string for a JDBC metastore</description>      
 </property>

表示存储hive元数据的地址,可以是MySQL,当然也可以是其他的数据库。

第二,在网上的某些分布式安装中,slave节点其实通常安装的只是客户端,其/conf/hive-site.xml文件中比master节点多一个配置:

<property>
        <name>hive.metastore.uris</name>
        <value>thrift://192.168.140.122:9083</value>
 </property>

表示slave节点访问master节点提供的metastore服务,因此slave节点想要通过hive命令(默认等同于hive --service cli命令)启动客户端,需要master节点提前使用hive --servive metastore & 启动metastore服务(&表示在后台运行)。

此时的javax.jdo.option.ConnectionURL对于slave节点而言是没有意义的。

因此,上述配置存在的一个问题就是,假如master的metastore服务未启动或者意外down掉了,其他slave节点的hive客户端就无法读取元数据,出现以下的情况:

相当于还是一个单机hive配置而已。

想要完全分布式,就需要每个节点自己提供metastore服务,因此slave中的那个配置需要去掉,再次使用slave客户端读取元数据:

可以看到,在slave节点独自启动metastore服务之后就可以访问元数据了,并且不依赖于master的metastore服务。

如果在slave节点出现上述的异常,原因是之前在MySQL中为hive创建用户'hive'来访问hive的元数据时,对访问该数据库的IP地址授权的问题,可以如下修改授权:

进入MySQL命令行:

GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' IDENTIFIED BY 'hive';//两个hive分别对应hive-site.xml中的username和password

flush privileges;

注意之前在MySQL中肯定是创建过该hive用户的,且密码为hive。//   create user hive identified by 'hive';

在master节点中不需要使用hive --service metastore &命令就可以访问元数据,而slave节点必须自己使用命令才可以启动,这个暂时不知道什么原因,可能是MySQL也安装在master上?这个有待后序考虑验证。

有人肯定想说虽然你在不同节点上都启动了metastore服务,可以保证各自不相互依赖,但是元数据库(这里是MySQL)炸了怎么办?这个可以通过keepalived+mysql主主模式来实现高可用,hive-site.xml中IP地址就只需要填写keepalived提供的虚拟IP就可以了,这个详细可以去自己多了解,有很多资料。

第三,通常我们可能还需要使用jdbc连接hive,这时候就需要启动hiveserver2服务,一般而言,hiveserver2服务依赖于各节点访问的metastore服务。在使用hive --service hiveserver2 &命令启动之后使用jps,可以看到两个RunJar进程,表示启动成功。(意外的是,master中因为hiveserver2服务需要metastore服务的原因,自己又将其启动了!)

通常会出现各种问题:

例如:user: ** is not allowed to impersonate anonymous,这个通常是因为Hadoop的hdfs需要配置用户代理:

<property>
  <name>hadoop.proxyuser.**.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.**.groups</name>
 <value>hadoop</value>
</property>

重启hdfs或者直接重启hadoop集群,hive的两个服务:metastore和hiveserver2无需重启。

猜你喜欢

转载自blog.csdn.net/fyrcarry/article/details/84982289