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

时间:2016-01-04 17:06:09

标签: authentication hadoop kerberos apache-flink

我有一个独立的Flink安装,我想在其上运行一个将数据写入HDFS安装的流式作业。 HDFS安装是Cloudera部署的一部分,需要Kerberos身份验证才能读取和写入HDFS。由于我没有找到关于如何使用受Kerberos保护的HDFS进行Flink连接的文档,因此我必须对该过程进行一些有根据的猜测。这是我到目前为止所做的:

  • 我为我的用户创建了一个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(Error with Kerberos authentication when executing Flink example code on YARN cluster (Cloudera))上发现了另一个类似的问题,它有一个答案解释:

  

如果用户在所有工作节点上进行了身份验证,则Standalone Flink目前仅支持访问Kerberos安全HDFS。

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

3 个答案:

答案 0 :(得分:2)

我不是Flink用户,但基于我在Spark&朋友们,我的猜测是“在所有工作节点上进行身份验证”意味着每个工作进程都有

  1. 本地fs上提供的core-site.xml配置 hadoop.security.authentication设置为kerberos(其他 的东西)

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

  3. 通过kinit隐式身份验证和默认缓存 [Linux帐户全局设置TGT,影响所有流程,duh] ##或##隐式身份验证通过kinit以及通过KRB5CCNAME env变量设置的“私有”缓存(Hadoop仅支持“FILE:”类型)##或##通过UserGroupInformation.loginUserFromKeytab()进行显式身份验证以及本地fs上提供的密钥表
  4. UGI“登录”方法非常冗长,所以如果在Flink尝试从Configuration尝试启动HDFS客户端之前确实调用它,你会注意到。另一方面,如果你没有看到冗长的东西,那么Flink会绕过你创建私有Kerberos TGT的尝试,你必须找到绕过Flink的方法: - / < / p>

答案 1 :(得分:1)

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

  • 登录运行JobManager的服务器,使用kinit对Kerberos进行身份验证并启动JobManager(无需注销或切换用户)。
  • 登录运行TaskManager的每台服务器,使用kinit再次进行身份验证,然后启动TaskManager(再次使用同一用户)。
  • 登录到您要启动流式处理作业的服务器(通常是运行JobManager的同一台计算机),登录Kerberos(使用kinit)并使用/bin/flink run开始工作。

据我了解,kinit正在登录当前用户并在/tmp中的某个位置创建一个带有一些登录数据的文件。大多数静态类UserGroupInformation在第一次加载时使用登录数据查找该文件。如果当前用户使用Kerberos进行身份验证,则该信息用于对HDFS进行身份验证。

答案 2 :(得分:1)

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

  1. 导出private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if ( e.Value != null ) e.Value = ( (string)e.Value ).Trim(); } 并将其指向HADOOP_CONF_DIRcore-site.xml所在的目录
  2. 添加到hdfs-site.xml
flink-conf.yml
  1. 将预先捆绑的Hadoop添加到群集https://flink.apache.org/downloads.htmlsecurity.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> 目录中

在工作中唯一需要的依赖项是:

lib