我有两个集群(集群1和集群2),并且都是通过Keratron身份验证进行保护的。我只能从这两个集群读取数据,并且不能更改任何这些集群上的配置文件。
我可以使用keytab文件和已经生成的用户ID访问一个集群,并且有一个keytab文件。
所以,我知道如何在集群1上使用keytab文件和java访问HDFS。
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://cloudera:8020");
conf.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("hdfs@CLOUDERA", "/etc/hadoop/conf/hdfs.keytab");
FileSystem fs = FileSystem.get(conf);
FileStatus[] fsStatus = fs.listStatus(new Path("/"));
for (int i = 0; i < fsStatus.length; i++) {
System.out.println(fsStatus[i].getPath().toString());
}
字符串
问题:我在集群2上没有keytab文件,但我可以使用kinit并从命令行访问HDFS(hdfs dfs -l s/ works)。但是,我想以编程方式访问HDFS。
问:有没有可能在某种程度上使用java访问HDFS而不使用keytab文件?我想如果我可以从命令行使用kinit并访问集群,那么应该有一些方法可以使用java访问而不使用keytab,但kinit生成缓存?
我尝试使用ktutil命令生成keytab文件,但存在预身份验证问题,我无权在配置文件中进行任何更改。
1条答案
按热度按时间bwleehnv1#
您可以使用ticket cache登录,您只需要在
UserGroupInformation
信息中添加该高速缓存路径即可。更具体地说:
1.运行:
kinit -f -p -c /Path/where/your/cache/will/be/created username@your_pricipal
1.更改对该高速缓存的权限。
完成后,就可以在代码中添加该高速缓存了:
在
Configuration
对象中添加所有与Hadoop相关的配置,并添加以下两项:字符串
它会让你登录。确保你真的导出你的缓存如上所示。使用
kdestroy
销毁旧的缓存,并创建一个新的。