当我按照网上教程安装好hadoop、hive、mysql并最后通过hive命令能进入hive命令行界面后,我准备用jdbc连接hive进行简单查询,但发现光完成上面的还不够,需要进一步配置,以下是一些我的记录。
HiveServer2
HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。目前基于Thrift RPC的实现是HiveServer的改进版本,并支持多客户端并发和身份验证。启动hiveServer2服务后,就可以使用jdbc,odbc,或者thrift的方式连接。 用java编码jdbc或则beeline连接使用jdbc的方式,据说hue是用thrift的方式连接的hive服务。
用jdbc连接hive需要验证,验证方式需要在hive-site.xml($HIVE_HOME/conf/hive-site.xml)中配置验证方式:
此处可以设为NONE和CUSTOM,前者为不需要验证,后者是用户名和密码验证
<property>
<name>hive.server2.authentication</name>
<value>NONE</value><!--或者CUSTOM-->
</property>
当设置为CUSTOM时需要做进一步的配置:
1、需要自定义验证类去实现org.apache.hive.service.auth.PasswdAuthenticationProvider接口,自定义的类的包路径为org.apache.hadoop.hive.contrib.auth,并打成jar包拷贝到$HIVE_HOME/lib目录下,以下是我在网上找的实现类,亲测可用:
maven需要引入的jar包:
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-service -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-service</artifactId>
<version>2.3.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.2</version>
</dependency>
实现类代码:
package org.apache.hadoop.hive.contrib.auth;
import javax.security.sasl.AuthenticationException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.slf4j.Logger;
/**
* @Author:
* @Date: 2019-7-30 9:56
*/
public class CustomPasswdAuthenticator implements org.apache.hive.service.auth.PasswdAuthenticationProvider{
private Logger LOG = org.slf4j.LoggerFactory.getLogger(CustomPasswdAuthenticator.class);
private static final String HIVE_JDBC_PASSWD_AUTH_PREFIX="hive.jdbc_passwd.auth.%s";
private Configuration conf=null;
@Override
public void Authenticate(String userName, String passwd)
throws AuthenticationException {
LOG.info("user: "+userName+" try login.");
String passwdConf = getConf().get(String.format(HIVE_JDBC_PASSWD_AUTH_PREFIX, userName));
if(passwdConf==null){
String message = "user's ACL configration is not found. user:"+userName;
LOG.info(message);
throw new AuthenticationException(message);
}
if(!passwd.equals(passwdConf)){
String message = "user name and password is mismatch. user:"+userName;
throw new AuthenticationException(message);
}
}
public Configuration getConf() {
if(conf==null){
this.conf=new Configuration(new HiveConf());
}
return conf;
}
public void setConf(Configuration conf) {
this.conf=conf;
}
}
2、继续在hive-site.xml中添加配置
<!--配置上面自定义的验证实现类-->
<property>
<name>hive.server2.custom.authentication.class</name>
<value>org.apache.hadoop.hive.contrib.auth.CustomPasswdAuthenticator</value>
</property>
<!-- 配置登录用户名和密码 root1即用户名,123456789即密码-->
<property>
<name>hive.jdbc_passwd.auth.root1</name>
<value>123456789</value>
</property>
配置完后重启HiveServer2,再通过./beeline($HIVE_HOME/bin下)测试连接
hiveServer2的启动方式有2种:
1、$HIVE_HOME/bin/hiveserver2
或者
2、$HIVE_HOME/bin/hive --service hiveserver2
测试成功的截图:
以下是自己测试时遇到的一些问题
1、最开始不知道可以用beeline测试连接,直接用jdbc进行连接,报了一个错(不知道用beeline测试会不会报同样的错误):User root is not allowed to impersonate anonymous
这个报错需要在hadoop的core-site.xml($HADOOP_HOME/etc/hadoop/core-site.xml)文件中需要配置对应的hadoop代理用户,
Hadoop.proxyuser.root.hosts配置项名称中root部分为报错User:* 中的用户名部分
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
配置完需要重启hadoop才能生效,我用的是hadoop2.6.5版本,所以我可以在$HADOOP_HOME/sbin目录下找到stop-all和start-all脚本,执行即可关闭和启动,并且可以jps查看是否启动成功,我在运行stop-all脚本时发现jps下的hadoop进程没有关闭,于是我直接kill了。。。启动能正常启动。
2、errorCode 500164:Error initialized or created transport for authentication: Peer indicated failure: Error validating the login
0-不需要密码,1-krb验证,2-用户名验证,3-用户名和密码验证
以上是这次用jdbc连接hive遇到的一些问题和怎么解决的,记录一下,方便以后查看