在我的服务器应用程序中,我从我的Java应用程序连接到Kerberos安全的Hadoop集群.我正在使用各种组件,如HDFS文件系统,Oozie,Hive等.在应用程序启动时,我打电话
UserGroupInformation.loginUserFromKeytabAndReturnUGI( ... );
Run Code Online (Sandbox Code Playgroud)
这将返回我的UserGroupInformation实例,并将其保留为应用程序生命周期.在执行特权操作时,我将其启动ugi.doAs(action).
这工作正常,但我想知道是否以及何时更新kerberos票UserGroupInformation?我找到了一种方法UserGroupInformation.checkTGTAndReloginFromKeytab(),似乎只要它接近到期就会更新机票.我还发现这种方法正在被各种Hadoop工具调用WebHdfsFileSystem,例如.
现在,如果我希望我的服务器应用程序(可能运行数月甚至数年)永远不会体验票证过期,那么最佳方法是什么?提出具体问题:
checkTGTAndReloginFromKeytab在需要时调用的各种Hadoop客户端吗? checkTGTAndReloginFromKeytab在我的代码中自己打电话吗?ugi.doAs(...)或者更确切地设置定时器之前这样做并定期调用它(多久一次)?我有一个独立的 Flink 安装,我想在其上运行一个将数据写入 HDFS 安装的流作业。HDFS 安装是 Cloudera 部署的一部分,需要 Kerberos 身份验证才能读取和写入 HDFS。由于我没有找到有关如何使 Flink 与受 Kerberos 保护的 HDFS 连接的文档,因此我不得不对该过程进行一些有根据的猜测。这是我到目前为止所做的:
在我的 Flink 工作中,我添加了以下代码:
UserGroupInformation.loginUserFromKeytab("myusername", "/path/to/keytab");
Run Code Online (Sandbox Code Playgroud)最后我使用 aTextOutputFormat将数据写入 HDFS。
当我运行作业时,出现以下错误:
org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBE
ROS]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:106)
at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:73)
at org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:1730)
at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1668)
at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1593)
at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:397)
at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:393)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:393)
at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:337)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:908)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:889)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:786)
at org.apache.flink.runtime.fs.hdfs.HadoopFileSystem.create(HadoopFileSystem.java:405)
Run Code Online (Sandbox Code Playgroud)
出于某种奇怪的原因,Flink 似乎尝试了 SIMPLE 身份验证,即使我调用了loginUserFromKeytab …
我需要安排一个与安全的hbase交互的oozie Java操作,所以我需要为Java操作提供hbase凭据.我使用的是安全的hortonworks 2.2环境,我的工作流XML如下所示
<workflow-app xmlns="uri:oozie:workflow:0.4" name="solr-wf">
<credentials>
<credential name="hbase" type="hbase">
</credential>
</credentials>
<start to="java-node"/>
<action name="java-node" cred="hbase">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<main-class>com.test.hbase.TestHBaseSecure</main-class>
<arg>${arg1}</arg>
</java>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
Run Code Online (Sandbox Code Playgroud)
我还修改了oozie属性以包含HbaseCredentials类
oozie.credentials.credentialclasses=hcat=org.apache.oozie.action.hadoop.HCatCredentials,hbase=org.apache.oozie.action.hadoop.HbaseCredentials
Run Code Online (Sandbox Code Playgroud)
但我无法运行它抛出错误的工作,下面是堆栈跟踪
java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
at org.apache.oozie.action.hadoop.HbaseCredentials.copyHbaseConfToJobConf(HbaseCredentials.java:60)
at org.apache.oozie.action.hadoop.HbaseCredentials.addtoJobConf(HbaseCredentials.java:49)
at org.apache.oozie.action.hadoop.JavaActionExecutor.setCredentialTokens(JavaActionExecutor.java:1054)
at org.apache.oozie.action.hadoop.JavaActionExecutor.submitLauncher(JavaActionExecutor.java:913)
at org.apache.oozie.action.hadoop.JavaActionExecutor.start(JavaActionExecutor.java:1135)
at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:228)
at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:63)
at org.apache.oozie.command.XCommand.call(XCommand.java:281)
at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:323)
at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:252)
at org.apache.oozie.service.CallableQueueService$CallableWrapper.run(CallableQueueService.java:174)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
其他工作运行良好,只有hbase交互失败的工作.我已经在我的lib目录中包含了所有的hbase jar,我无法弄清楚这个问题.
更新的workflow.xml:
<workflow-app xmlns="uri:oozie:workflow:0.4" name="${appName}">
<credentials>
<credential name="hbase-cred" …Run Code Online (Sandbox Code Playgroud)