authentication - 如何在 flink 独立安装上进行 kerberos 身份验证?

标签 authentication hadoop kerberos apache-flink

我有一个独立的 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>工作进程有

  1. a core-site.xml配置在本地 fs 上可用 hadoop.security.authentication设置为 kerberos (除其他外 东西)

  2. 包含core-site.xml 的本地目录添加到 CLASSPATH,以便 Hadoop 自动找到它 Configuration object [否则它将静默恢复为默认的硬编码值,duh]

  3. 通过 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/

相关文章:

python - 使用 TLS 和 Python 进行身份验证

database - HBase 错误 - 分配 -ROOT- 失败

apache-spark - 如何在没有 kerberos 的情况下启动 spark 3.0.0 kubernetes 工作负载?

hadoop - Hive Server2 ACID 事务不起作用

Hadoop 0.2 : How to read outputs from TextOutputFormat?

java - Kerberos Spring javax.security.auth.login.LoginException : Unable to obtain password from user

authentication - 发送客户端证书如何不将客户端暴露给模拟

python - liferay 6.2GA2 使用 python suds 客户端进行 SOAP 验证

php - 使用 SSL 域登录非 ssl 域上的 webapp

java - 在 HIVE UDF 中返回 ArrayList<String>