当前位置: 首页 > 知识库问答 >
问题:

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

鄢博简
2023-03-14

我有一个独立的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似乎尝试了SIMple身份验证,尽管我调用了loginUserFromKeytab。我在Stackoverflow上发现了另一个类似的问题(在YARN集群(Cloudera)上执行Flink示例代码时Kerberos身份验证错误),它有一个答案解释说:

    独立Flink目前仅支持访问安全KerberosHDFS,前提是用户在所有工作节点上都经过身份验证。

    这可能意味着我必须在操作系统级别进行一些身份验证,例如使用kinit。由于我对Kerberos的了解非常有限,我不知道该如何做。此外,我还想了解在kinit之后运行的程序如何在没有任何相关配置的情况下真正知道从本地缓存中选择哪个Kerberos票证。

  • 共有3个答案

    朱欣荣
    2023-03-14

    要从独立的Flink安装访问安全的HDFS或HBase安装,必须执行以下操作:

    • 登录到运行JobManager的服务器,使用kinit对Kerberos进行身份验证,然后启动JobManager(无需注销或在两者之间切换用户)

    据我所知,kinit正在登录当前用户,并在tmp的某处创建一个文件,其中包含一些登录数据。最静态的类UserGroupInformation在第一次加载该文件时会使用登录数据查找该文件。如果当前用户使用Kerberos进行身份验证,则该信息将用于针对HDFS进行身份验证。

    卫俊誉
    2023-03-14

    您还可以配置独立群集来处理身份验证,而无需在作业中添加其他代码。

    1. 导出HADOOP_CONF_DIR并将其指向core-site.xmlhdfs-site.xml所在的目录
    2. 添加到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'
    
    滕星纬
    2023-03-14

    我不是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不要创建正确的票证)