java api读取集群hive数据(kerberos认证)

引用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版本。

猜你喜欢

转载自blog.csdn.net/lhxsir/article/details/80519816
今日推荐