我有一个独立的Flink安装,我想在上面运行一个流作业,将数据写入HDFS安装。HDFS安装是Cloudera部署的一部分,需要Kerberos身份验证才能读取和写入HDFS。由于我没有找到关于如何使Flink连接到受Kerberos保护的HDFS的文档,因此我不得不对该过程进行一些有根据的猜测。以下是我目前所做的:
>
在我的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上发现了另一个类似的问题(在YARN集群(Cloudera)上执行Flink示例代码时Kerberos身份验证错误),它有一个答案解释说:
独立Flink目前仅支持访问安全KerberosHDFS,前提是用户在所有工作节点上都经过身份验证。
这可能意味着我必须在操作系统级别进行一些身份验证,例如使用kinit。由于我对Kerberos的了解非常有限,我不知道该如何做。此外,我还想了解在kinit之后运行的程序如何在没有任何相关配置的情况下真正知道从本地缓存中选择哪个Kerberos票证。
要从独立的Flink安装访问安全的HDFS或HBase安装,必须执行以下操作:
据我所知,kinit正在登录当前用户,并在tmp的某处创建一个文件,其中包含一些登录数据。最静态的类UserGroupInformation在第一次加载该文件时会使用登录数据查找该文件。如果当前用户使用Kerberos进行身份验证,则该信息将用于针对HDFS进行身份验证。
您还可以配置独立群集来处理身份验证,而无需在作业中添加其他代码。
HADOOP_CONF_DIR
并将其指向core-site.xml
和hdfs-site.xml
所在的目录flink-conf.yml
security.kerberos.login.use-ticket-cache: false
security.kerberos.login.keytab: <path to keytab>
security.kerberos.login.principal: <principal>
env.java.opts: -Djava.security.krb5.conf=<path to 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'
我不是Flink用户,但根据我对Spark的了解
>
一个core-site.xml
配置在本地fs上可用,hadoop.security.authentication
设置为kerberos
(以及其他内容)
包含核心站点的本地目录。xml添加到类路径中,以便Hadoop配置对象自动找到它[它将自动还原为默认的硬编码值,否则,duh]
UGI“login”方法极其冗长,因此如果它确实是在Flink尝试从配置启动HDFS客户端之前调用的,您会注意到。另一方面,如果看不到详细的内容,则Flink会绕过您创建私有Kerberos TGT的尝试,您必须找到绕过Flink的方法:-/
我已经在Kubernetes上建立了Spark独立集群,并试图连接到Kubernetes上没有的Kerberized Hadoop集群。我已经将core-site.xml和hdfs-site.xml放在Spark集群的容器中,并相应地设置了HADOOP_CONF_DIR。我能够成功地在Spark容器中为访问Hadoop集群的principal生成kerberos凭据缓存。但是当我运行spark-s
我正在运行一个squid代理服务器(CentOS 5),我正试图通过我们的AD服务器(Windows server 2008)使用kerberos。 我遵循了以下说明:http://wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos 为服务器设置一个keytab,这一切都运行良好。 当我尝试从客户端PC使用代理时,会出现问题,它会立即
我有一个.NETWCF客户端与Java服务器组件进行对话。服务器端身份验证通过配置为反向代理的中间Apache服务器完成。 NET客户端的配置如下: Apache配置为需要Kerveros身份验证: 如果我在Windows 7上启动我的应用程序,一切都按预期工作:. NET客户端使用Kerberos,Apache验证客户端,我可以使用Spring Security性访问客户端凭据。 如果我在Win
15/02/06 15:17:12警告IPC.Client:连接到服务器时遇到异常:javax.security.sasl.saslexception:GSS initiate失败[由GSSException:未提供有效凭据(机制级别:找不到任何Kerberos tgt导致)]LS:本地异常失败:java.io.ioException:javax.security.sasl.saslexcepti
我正在开发一个Web应用程序,它是rest客户端并使用rest服务(API)来执行任何操作。我集成了apache shiro以使用工作正常的jdbc领域执行身份验证。 现在,我正在寻找一种使用apacheDS LDAP执行身份验证的解决方案。我计划使用kerberos身份验证,但我没有找到任何有用的文章或示例来使用apache shiro实现kerberos身份验证。 我发现apache shir
使用这个例子,我的连接几乎可以工作 http://blogs.nologin.es/rickyepoderi/index.php?/archives/105-oracle-driver-and-kerberos.html 我使用的是Java7,但使用另一个没有问题。有没有一种方法可以用jvm正确读取票证(参见jdk中的kinit不要创建正确的票证)