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