我有一个启用Kerberos的Hadoop集群,我想使用集群外的windows/linux机器将文件放在HDFS上。
Hadoop管理团队为我提供了访问Hadoop和keytab文件的用户名,我应该如何在java代码中使用它们?
我在互联网上查阅了很多资源,但是没有一个提供从集群外访问kerberos hadoop的指南。
还有,是否有必要使用hadoop jar
运行代码?如果是,我将如何从集群外运行它
http://blog.rajeevsharma.in/2009/06/using-hdfs-in-java-0200.html
http://princetonits.com/technology/using-filesystem-api-to-read-and-write-data-to-hdfs/
我得到kerberos工作,现在能够生成票据
但是curl不工作(windows)
curl -i --negotiate u:qjdht93 "http://server:50070/webhdfs/v1/user/qjdht93/?op=LISTSTATUS"
给出错误为
HTTP/1.1 401 Authentication required
Cache-Control: must-revalidate,no-cache,no-store
Date: Mon, 01 Jun 2015 15:26:37 GMT
Pragma: no-cache
Date: Mon, 01 Jun 2015 15:26:37 GMT
Pragma: no-cache
Content-Type: text/html; charset=iso-8859-1
WWW-Authenticate: Negotiate
Set-Cookie: hadoop.auth=; Version=1; Path=/; Expires=Thu, 01-Jan-1970 00:00:00 G
MT; HttpOnly
Content-Length: 1416
Server: Jetty(6.1.26)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 401 Authentication required</title>
</head>
<body><h2>HTTP ERROR 401</h2>
<p>Problem accessing /webhdfs/v1/user/qjdht93. Reason:
<pre> Authentication required</pre></p><hr /><i><small>Powered by Jetty://</s
mall></i><br/>
<br/>
<br/>
请建议
可以通过hdfs命令实现。你所需要的只是namenode上的hadoop发行版和配置文件。
- 在客户端复制hadoop发行版。这意味着您必须将完整的hadoop包复制到客户机上。请参考这个
- 使用kinit命令从keytab获取用户票,这是java的命令行工具。
a.在客户端机器上安装jdk。
b.设置JAVA_HOME,见这里
c.在"c:windowskrb5.ini"目录下创建krb5.ini文件。该文件应包含以下信息:
REALM -服务器领域名称
kdcvalue—服务器主机名或ip地址
d。确保在windows机器的path变量中设置java bin路径。打开命令提示符,输入下面的命令获取用户票
kinit -k -t keytabfile username
- 现在你可以使用"hadoop fs -put src dest"或使用java将文件放入HDFS。