引用maven
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0</version> </dependency>
参考代码
import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; public class TestHive { private static String driverName = "org.apache.hive.jdbc.HiveDriver";// jdbc驱动路径 private static String url = "jdbc:hive2://hadoop01.com:10000/asmp;principal=hive/[email protected]";// hive库地址+库名 // private static String user = "";// 用户名 // private static String password = "";// 密码 private static String sql = ""; private static ResultSet res; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { conn = getConn(); System.out.println(conn); stmt = conn.createStatement(); String tableName = "test_count_day";// hive表名 sql = "select * from " + tableName; System.out.println("Running:" + sql); res = stmt.executeQuery(sql); System.out.println("执行 select * query 运行结果:"); while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2)); } } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } catch (SQLException e) { e.printStackTrace(); System.exit(1); } finally { try { if (stmt != null) { stmt.close(); stmt = null; } if (conn != null) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } } } public static void authKrb5() { // 设置jvm启动时krb5的读取路径参数 System.setProperty("java.security.krb5.conf","src/main/resources/krb5.conf"); // 配置kerberos认证 Configuration conf = new Configuration(); conf.setBoolean("hadoop.security.authorization", true); conf.set("hadoop.security.authentication", "kerberos"); // System.out.println(System.getProperty("java.security.krb5.conf")); UserGroupInformation.setConfiguration(conf); try { UserGroupInformation.loginUserFromKeytab( "[email protected]", "src/main/resources/asmp.keytab"); } catch (IOException e) { e.printStackTrace(); } // System.out.println("Succeeded in authenticating through Kerberos!"); } private static Connection getConn() throws ClassNotFoundException, SQLException { //认证kerberos authKrb5(); Class.forName(driverName); Connection conn = DriverManager.getConnection(url); return conn; } }
运行结果
常见错误:
org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null, configuration:{use:database=default}) at org.apache.thrift.TApplicationException.read(TApplicationException.java:111) at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71) at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:156) at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:143) at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:583) at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:192) at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105) at java.sql.DriverManager.getConnection(DriverManager.java:571) at java.sql.DriverManager.getConnection(DriverManager.java:215) at HiveJdbcJobTest.main(HiveJdbcJobTest.java:28)
原因:
由于jdbc版本不对造成的,安装和集群一致的maven版本。