故障现象:
最近hiveserver2突然出现了问题,症状表现为,通过beeline无法访问。错误的信息提示,找不到任何TGT。明显和kerberos身份认证有关。
与此同时,hdfs也出现类似的问题。查询hdfs,提示找不到任何TGT。
虽然在多台机器上出现了类似问题,但是服务似乎都是正常的。而且最关键的一件事情是,文件还能够稳定的从交换平台传过来。
如何解决 ?
由于问题出在beeline上,所以还是从beeline入手进行问题分析。
-
hiveserver2的ldap身份认证,没有问题,仍然可以正常通过beeline访问。
-
hiveserver2的kerberos身份认证,也不是存在很大问题,主要是beeline访问不了,自己写的客户端还是可以访问的。例如以下这段程序:
package com.pear; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Main { private static String driverName = "org.apache.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } String JDBC_DB_URL = "jdbc:hive2://uatmaster01:10000/default;principal=hive/_HOST@MCIPT.COM;auth=kerberos"; Connection con = DriverManager.getConnection(JDBC_DB_URL); Statement stmt = con.createStatement(); String sql = "select * from empdata where id=1"; ResultSet res = stmt.executeQuery(sql); System.out.println("Running: " + sql); while (res.next()) { System.out.println(res.getString(1)); System.out.println(res.getString(2)); } res.close(); stmt.close(); con.close(); } }
执行以上程序,需要注意将相关的jar包,都放在classpath里。所有,最好写一个脚本:
for f in /opt/cloudera/parcels/CDH/jars/*.jar; do CLASSPATH=${CLASSPATH}:$f; done java -cp $CLASSPATH:. -Djavax.security.auth.useSubjectCredsOnly=false com.pear.Main
这样运行时,会提示输入用户名和密码,如果输入正确,则可以正常访问hiveserver2.
或者设置环境变量:
export HADOOP_OPTS='-Djavax.security.auth.useSubjectCredsOnly=false' hdfs dfs -ls /
使用能够impersonate他人的帐户(去core-site.xml里找proxyuser),然后发现列目录也正常了。