我是一个Java用户,提交作业的Hadoop MapReduce的时候,它使用Kerberos的Hadoop进行身份验证,并在成功的陈述有创建,并通过与作业提交的Hadoop代替(出于安全原因,Kerberos票据的委托令牌通过Hadoop的)。 现在这项工作正在作为我,但这份工作本身需要使用Kerberos请求发送到其他服务的Hadoop之外。 现在我没有的Kerberos TGT对Hadoop和我无法得到服务票据。
有反正我可以通过Kerberos票据与工作? (我知道这可能是危险的,因为我们不希望通过周围的秘密),JobConf可以通过串来串对,以Hadoop的,但我要的TGT转换成JSON字符串,并在工作运行恢复呢?
或者是有可能使用委托令牌改革TGT?
我试图谷歌,但没有太多的信息,任何人都可以帮忙吗? 谢谢。
** Editted:* *
貌似有这样做,而没有经过TGT到的Hadoop没有简单的方法,所以我要通过经工作配置图传递TGT作为字符串的Hadoop(仅字符串)试试下面的方法,并转换成字符串返回到TGT对象当工作在Hadoop中运行。 值得关注的是,我要在网络上,这是不是最好的做法和非常Hadoop的原因没有通过周围的Kerberos安全一个凭据传递。 如果我可以重新使用改革TGT传递到Hadoop的获得服务票,我会尽量给TGT串尽可能进行加密,以避免安全问题。
于是开始在本地机器上工作之前,该代码将是这样的:
import sun.security.krb5.Credentials;
Credentials tgt = Credentials.acquireTGTFromCache(null, null); // Make sure kinit is done before this
String tgtStr = tgt.convertToJsonString(); //Need to implement this
Job job = new Job("Test");
JobConf jobConf = job.getJobConf();
jobConf.set("tgtStr", tgtStr);
job.addTask(Test.class, "run", null);
job.submit();
job.waitForCompletion(true);
然后在作业的函数Hadoop的运行将是这样的:
Configuration conf = TaskContext.get().getConfiguration();
String tgtStr = conf.get("tgtStr");
Credentials tgt = reformTGTFromString(tgtStr);//Need to implement this
Credentials serviceTicket = Credentials.acquireServiceCreds(servicePrincipal, tgt); //This is to get any service ticket
所以,我需要实现两个功能,流TGT对象(Credentials.class)为字符串,然后改回对象。
任何人都知道这更好的解决办法? 谢谢。