【发布时间】:2016-06-01 07:36:11
【问题描述】:
我们有一个 Kerberised 集群,我正在尝试在 Oozie 中运行 Java 操作,并在其中建立与 Hive 的 JDBC 连接。此 JDBC 连接在没有 Kerberos 的沙盒上运行良好。
连接字符串如下所示,我在其中提供用户名和密码:
Connection con = DriverManager.getConnection("jdbc:hive2://W12345:10000/control;principal=hive/W12345.companynet.net@COMPANYNET.NET","user123","passw123");
Oozie 动作(奇怪地)成功完成,Java 动作日志没有出现任何错误:
1742 [main] INFO org.apache.hive.jdbc.Utils - Supplied authorities: W12345:10000
1742 [main] INFO org.apache.hive.jdbc.Utils - Resolved authority: W12345:10000
1766 [main] INFO org.apache.hive.jdbc.HiveConnection - Will try to open client transport with JDBC Uri: jdbc:hive2://W12345:10000/control;principal=hive/W12345.companynet.net@COMPANYNET.NET
<<< Invocation of Main class completed <<<
Oozie Launcher ends
1785 [main] INFO org.apache.hadoop.mapred.Task - Task:attempt_1464245290012_0129_m_000000_0 is done. And is in the process of committing
1847 [main] INFO org.apache.hadoop.mapred.Task - Task attempt_1464245290012_0129_m_000000_0 is allowed to commit now
1854 [main] INFO org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter - Saved output of task 'attempt_1464245290012_0129_m_000000_0' to hdfs://danskehadoop/user/user123/oozie-oozi/0000013-160527101253015-oozie-oozi-W/JavaAction--java/output/_temporary/1/task_1464245290012_0129_m_000000
1909 [main] INFO org.apache.hadoop.mapred.Task - Task 'attempt_1464245290012_0129_m_000000_0' done.
但实际上,Java 主程序没有正确完成执行(并且没有执行所需的查询),因为 JDBC 连接失败并出现我只能在 Hive 日志中看到的异常:
ERROR [HiveServer2-Handler-Pool: Thread-78363]: server.TThreadPoolServer (TThreadPoolServer.java:run(296)) - Error occurred during processing of message.
java.lang.RuntimeException: org.apache.thrift.transport.TSaslTransportException: No data or no sasl data in the stream
at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219)
at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$Server$TUGIAssumingTransportFactory$1.run(HadoopThriftAuthBridge.java:739)
at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$Server$TUGIAssumingTransportFactory$1.run(HadoopThriftAuthBridge.java:736)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:360)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1637)
at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$Server$TUGIAssumingTransportFactory.getTransport(HadoopThriftAuthBridge.java:736)
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:268)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.thrift.transport.TSaslTransportException: No data or no sasl data in the stream
at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:328)
at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41)
at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:216)
... 10 more
我实际上已连接到集群,并且已经对我的用户名进行了进一步的 kinit。
有人知道这个异常的原因是什么吗?
提前感谢您的帮助!
安东尼奥
【问题讨论】:
-
您的操作中似乎缺少 hadoop 配置,您能否尝试在您的 oozie 操作节点中提供 hive-site.xml 和 core-site.xml。这可能会解决您的问题。
-
"已经在我的用户名上完成了进一步的 kinit" -- 你是否在每个 YARN 节点上运行了
kinit,以便 Oozie 作业有机会获得本地票? -
“我实际上已连接到集群” -- Hive JDBC 驱动程序并不关心 Hadoop 配置和 Hadoop 委托令牌,它是 100% 原始 Thrift 协议(默认为二进制模式,因为您不在 URL 中请求 HTTP 模式);如果 URL 包含“主体”条目,则忽略任何用户/密码条目,驱动程序将使用 已将 JAAS 配置文件设置为 JVM 的默认值切换到 Kerberos 身份验证。看起来您需要对 JAAS 进行一些研究。
标签: authentication jdbc hive kerberos oozie