我有一个独立的 Flink 安装,我想在其上运行一个将数据写入 HDFS 安装的流作业。 HDFS 安装是 Cloudera 部署的一部分,需要 Kerberos 身份验证才能读取和写入 HDFS。由于我没有找到关于如何使 Flink 与受 Kerberos 保护的 HDFS 连接的文档,因此我不得不对该过程进行一些有根据的猜测。这是我到目前为止所做的:
- 我为我的用户创建了一个 key 表文件。
在我的 Flink 作业中,我添加了以下代码:
UserGroupInformation.loginUserFromKeytab("myusername", "/path/to/keytab");
最后,我使用
TextOutputFormat
将数据写入 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)
出于某些奇怪的原因,Flink 似乎尝试了 SIMPLE 身份验证,即使我调用了 loginUserFromKeytab
。我在 Stackoverflow ( Error with Kerberos authentication when executing Flink example code on YARN cluster (Cloudera) ) 上发现了另一个类似的问题,它有一个解释的答案:
Standalone Flink currently only supports accessing Kerberos secured HDFS if the user is authenticated on all worker nodes.
这可能意味着我必须在操作系统级别进行一些身份验证,例如使用 kinit
。由于我对 Kerberos 的了解非常有限,所以我不知道该怎么做。此外,我想了解在没有任何相关配置的情况下,在 kinit
之后运行的程序实际上如何知道从本地缓存中选择哪个 Kerberos 票证。
最佳答案
我不是 Flink 用户,但根据我在 Spark 和 friend 身上看到的情况,我的猜测是“在所有工作节点上进行了身份验证” 意味着每个 strong>工作进程有
a
core-site.xml
配置在本地 fs 上可用hadoop.security.authentication
设置为kerberos
(除其他外 东西)包含
core-site.xml
的本地目录添加到 CLASSPATH,以便 Hadoop 自动找到它Configuration
object [否则它将静默恢复为默认的硬编码值,duh]- 通过
kinit
进行隐式身份验证和默认缓存[为 Linux 帐户全局设置的 TGT,影响所有进程,duh] ## 或 ## 通过kinit
隐式身份验证和通过 KRB5CCNAME env 变量设置的“私有(private)”缓存(Hadoop 仅支持“FILE:”类型)## 或 ## 通过UserGroupInformation.loginUserFromKeytab()
进行显式身份验证|和本地 fs 上可用的 key 表
那个 UGI“登录”方法非常冗长,所以如果它确实在 Flink 尝试从 Configuration
启动 HDFS 客户端之前被调用,你会注意到。另一方面,如果你没有看到冗长的东西,那么你创建私有(private) Kerberos TGT 的尝试被 Flink 绕过了,你必须想办法绕过 Flink :-/
关于authentication - 如何在 flink 独立安装上进行 kerberos 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34596165/