我有一个独立的Flink安装,我想在其上运行一个将数据写入HDFS安装的流式作业。 HDFS安装是Cloudera部署的一部分,需要Kerberos身份验证才能读取和写入HDFS。由于我没有找到关于如何使用受Kerberos保护的HDFS进行Flink连接的文档,因此我必须对该过程进行一些有根据的猜测。这是我到目前为止所做的:
在我的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票证。
答案 0 :(得分:2)
我不是Flink用户,但基于我在Spark&朋友们,我的猜测是“在所有工作节点上进行身份验证”意味着每个工作进程都有
本地fs上提供的core-site.xml
配置
hadoop.security.authentication
设置为kerberos
(其他
的东西)
将包含core-site.xml
的本地目录添加到CLASSPATH中,以便Hadoop Configuration
对象自动找到它[它将静默恢复为默认的硬编码值,否则,咄]
kinit
隐式身份验证和默认缓存 [Linux帐户全局设置TGT,影响所有流程,duh] ##或##隐式身份验证通过kinit
以及通过KRB5CCNAME env变量设置的“私有”缓存(Hadoop仅支持“FILE:”类型)##或##通过UserGroupInformation.loginUserFromKeytab()
进行显式身份验证以及本地fs上提供的密钥表 UGI“登录”方法非常冗长,所以如果在Flink尝试从Configuration
尝试启动HDFS客户端之前确实调用它,你会注意到。另一方面,如果你没有看到冗长的东西,那么Flink会绕过你创建私有Kerberos TGT的尝试,你必须找到绕过Flink的方法: - / < / p>
答案 1 :(得分:1)
要从独立的Flink安装访问安全的HDFS或HBase安装,您必须执行以下操作:
kinit
对Kerberos进行身份验证并启动JobManager(无需注销或切换用户)。kinit
再次进行身份验证,然后启动TaskManager(再次使用同一用户)。kinit
)并使用/bin/flink run
开始工作。 据我了解,kinit
正在登录当前用户并在/tmp
中的某个位置创建一个带有一些登录数据的文件。大多数静态类UserGroupInformation
在第一次加载时使用登录数据查找该文件。如果当前用户使用Kerberos进行身份验证,则该信息用于对HDFS进行身份验证。
答案 2 :(得分:1)
您还可以将独立群集配置为为您处理身份验证,而无需在作业中添加其他代码。
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if ( e.Value != null )
e.Value = ( (string)e.Value ).Trim();
}
并将其指向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>
目录中在工作中唯一需要的依赖项是:
lib