hive的客户端操作(jdbc链接)
最近在学习hive,今天学到hive的远程连接,以下是我在学习过程中遇到的一些问题,和大家分享一下:
首先,你如果要使用hive的远程连接,你得先开启hive的远程服务:之前我看视频以及一些资料上写的是在命令行输入:hive --service hiveserver 这个命令是基于0.10的版本(好像是),然后我的hive版本是2.2.0的,所以在这里会报错,以下是报错内容:
然后我网上查阅了一些资料,发现新版本的命令有变化:
hive --service hiveserver2
以下是执行这条命令的结果显示:
至此,我们的远程服务算是开启了。
下面是在本地代码编译器中编写的代码,其中包括一个HiveJDBC的操作utils以及一个HiveJDBC的demo
下面是HIVE
import java.sql.*;
public class HiveJDBCUtils {
private static String driver="org.apache.hadoop.hive.jdbc.HiveDriver";
private static String url="jdbc:hive2://hive所在的服务器的ip:10000/default";
//注册驱动
{
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
//获取链接
public static Connection getConnnection(){
try {
return DriverManager.getConnection(url);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//释放资源
public static void release(Connection conn, Statement st, ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
rs=null;
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
st=null;
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
conn=null;
}
}
}
}
下面是demo代码:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class HiveJDBCdemo {
public static void main(String[] args) {
Connection conn=null;
Statement st=null;
String sql="select * from testhive";
ResultSet rs=null;
try {
conn=HiveJDBCUtils.getConnnection();
st=conn.createStatement();
rs=st.executeQuery(sql);
//处理数据
while(rs.next()){
Integer id=rs.getInt(1);
String name=rs.getString(2);
System.out.println(id + " "+name);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
HiveJDBCUtils.release(conn,st,rs);
}
}
}
当然,如果你没有配置hadoop的core-site.xml文件的话,会报这个错误
User: hadoop is not allowed to impersonate anonymous(hadoop是我的主机名)
所以我们要在hadoop的core-site.xml文件中配置以下内容:
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
将hadoop.proxyuser,hadoop.groups以及hadoop.proxyuser.hadoop.hosts中hadoop字段改为上面报错内容的User:后的用户名,例如我这里是hadoop。
修改完毕之后重启hadoop集群。
然后可以在hive的bin目录下用:./beeline -u 'jdbc:hive2://localhost:10000/userdb' -n hadoop(这里改为你的用户名) 来进行测试,以下是测试成功的界面
我这里不知道怎么退出,最后ctrl + c了。
然后再次执行程序
得到了正确的结果,和hive中直接select 表返回的结果一样的
至此,远程连接hive并执行操作结束,希望能给大家带来帮助。