我的环境是,公司同事给的AWS 的三台机器。每台机器有公司内网,和外网
代码正常,看后文
问题一:报错 Receive timed out, 或者 connect time out
原因: 其实就是没有连接上hiveserver. 同事没有打开UDP 端口。我的win7_hosts文件没有添加机器的外网ip 和别名。
解决:打开UDP 端口,配置hosts 文件。
问题二: Login failure for hive@DEV.COM from keytab src/main/resources/hive.keytab: javax.security.auth.login.LoginException: Unable to obtain password from user
原因 没有找到 keytab文件。
解决方法:使用绝对路径。
所以需要检查一下几点
1. Hive server 那台机器的UDP 端口。和本机 hosts 文件。
2. keytab 文件生成后,登录一下,检查没有问题,再复制到windows 来使用
3.注意keytab 文件的应用路径。
4 我的pom.xml配置:
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.3</version> </dependency>
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.sql.*; public class HiveConn { private static String JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver"; private static String CONNECTION_URL ="jdbc:hive2://h1.dev.com:10000/;principal=hive/h1.dev.com@DEV.COM"; static { try { Class.forName(JDBC_DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { Class.forName(JDBC_DRIVER); //登录Kerberos账号 System.setProperty("java.security.krb5.conf", "D:\\keytab\\krb5.conf"); Configuration configuration = new Configuration(); configuration.set("hadoop.security.authentication" , "Kerberos" ); UserGroupInformation. setConfiguration(configuration); UserGroupInformation.loginUserFromKeytab("hive@DEV.COM", "D:\\keytab\\hive2.keytab"); System.out.println("Kerberos 验证通过"); Connection connection = null; ResultSet rs = null; PreparedStatement ps = null; try { connection = DriverManager.getConnection(CONNECTION_URL); ps = connection.prepareStatement("select * from stu"); rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); } } catch (Exception e) { e.printStackTrace(); } } }