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

wj8zmpe1  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(1029)

我有一个独立的flink安装在上面,我想运行一个流作业,将数据写入hdfs安装。hdfs安装是cloudera部署的一部分,需要kerberos身份验证才能读写hdfs。因为我没有找到关于如何使flink连接到受kerberos保护的hdfs的文档,所以我不得不对这个过程进行一些有根据的猜测。以下是我迄今为止所做的:
我为我的用户创建了一个keytab文件。
在我的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似乎尝试简单的身份验证,尽管我打过电话 loginUserFromKeytab . 我在stackoverflow上发现了另一个类似的问题(在yarn cluster(cloudera)上执行flink示例代码时kerberos身份验证出错),其答案解释如下:
standalone flink当前仅支持在所有工作节点上对用户进行身份验证的情况下访问kerberos安全的hdfs。
这可能意味着我必须在操作系统级别进行一些身份验证,例如 kinit . 因为我对kerberos的了解非常有限,所以我不知道该怎么做。我也想了解一下程序是如何运行的 kinit 实际上知道在没有任何配置的情况下从本地缓存中选择哪个kerberos票证。

qcuzuvrc

qcuzuvrc1#

要从独立的flink安装访问受保护的hdfs或hbase安装,必须执行以下操作:
登录运行jobmanager的服务器,使用 kinit 并启动jobmanager(无需注销或在两者之间切换用户)。
登录到运行taskmanager的每台服务器,使用 kinit 并启动taskmanager(同样,使用相同的用户)。
登录到要从中启动流式处理作业的服务器(通常是运行jobmanager的同一台计算机),登录到kerberos(使用 kinit )开始你的工作 /bin/flink run .
在我看来, kinit 正在登录当前用户并在中的某个位置创建文件 /tmp 一些登录数据。大多数是静态类 UserGroupInformation 在第一次加载时正在查找包含登录数据的文件。如果使用kerberos对当前用户进行了身份验证,则该信息将用于针对hdfs进行身份验证。

ac1kyiln

ac1kyiln2#

您还可以配置独立集群来处理身份验证,而无需在作业中添加其他代码。
出口 HADOOP_CONF_DIR 把它指向 core-site.xml 以及 hdfs-site.xml 位于
添加到 flink-conf.yml ```
security.kerberos.login.use-ticket-cache: false
security.kerberos.login.keytab:
security.kerberos.login.principal:
env.java.opts: -Djava.security.krb5.conf=

将预绑定的hadoop添加到 `lib` 群集的目录https://flink.apache.org/downloads.html
工作中唯一需要的依赖项是:

compile "org.apache.flink:flink-java:$flinkVersion"
compile "org.apache.flink:flink-clients_2.11:$flinkVersion"
compile 'org.apache.hadoop:hadoop-hdfs:$hadoopVersion'
compile 'org.apache.hadoop:hadoop-client:$hadoopVersion'

nle07wnf

nle07wnf3#

我不是一个flink用户,但是根据我在spark&friends上看到的情况,我猜“在所有工作节点上进行身份验证”意味着每个工作进程
core-site.xml 本地fs上可用的配置 hadoop.security.authentication 设置为 kerberos (除其他外)
本地目录包含 core-site.xml 添加到类路径中,以便hadoop自动找到它 Configuration 对象[它将静默地还原为默认的硬编码值,否则,duh]
隐式身份验证 kinit 默认缓存[tgt为linux帐户全局设置,影响所有进程,duh]###或###通过 kinit 以及通过krb5ccname env变量设置的“私有”缓存(hadoop仅支持“file:”type)###或通过 UserGroupInformation.loginUserFromKeytab() 本地fs上有一个键标签
ugi“login”方法非常冗长,因此如果它确实是在flink尝试从 Configuration ,你会注意到的。另一方面,如果您没有看到详细的内容,那么您创建私有kerberos tgt的尝试将被flink绕过,您必须找到绕过flink的方法:-/

相关问题