0

我正在使用 Hadoop 的 HDFS 的 REST 接口作为通过网络存储文件的便捷方式。为了测试,我按照以下说明在我的 mac(10.8.5)上安装了 hadoop:

http://importantfish.com/how-to-install-hadoop-on-mac-os-x/

这就像一个魅力,我能够启动 hadoop 并运行一个基本测试:

hadoop-examples-1.1.2.jar pi 10 100

现在,我正在使用 python 客户端来处理与 webhdfs 之间的 HTTP 请求:

http://pythonhosted.org/pywebhdfs/

但是当我尝试创建一个目录时,我遇到了一个基本的权限错误:

from pywebhdfs.webhdfs import PyWebHdfsClient  
hdfs = PyWebHdfsClient()  
my_dir = 'user/hdfs/data/new_dir'  
hdfs.make_dir(my_dir, permission=755)  

回溯(最后一次调用):
文件“”,第 1 行,在
文件“/Library/Python/2.7/site-packages/pywebhdfs/webhdfs.py”中,第 207 行,在 make_dir
_raise_pywebhdfs_exception(response.status_code, response.text )
文件“/Library/Python/2.7/site-packages/pywebhdfs/webhdfs.py”,第 428 行,在 _raise_pywebhdfs_exception 中
引发错误。PyWebHdfsException(msg=message)
pywebhdfs.errors.PyWebHdfsException: {"RemoteException":{"exception" :"AccessControlException","javaClassName":"org.apache.hadoop.security.AccessControlException","message":"权限被拒绝:user=webuser, access=WRITE, inode=\"user\":mlmiller:supergroup:rwxr -xr-x"}}

我还尝试将用户指定为“hdfs”,而不是将 python lib 的默认设置为“webhdfs”,但得到了相同的结果。阅读 30 分钟后,我放弃了,并意识到我不了解 hdfs 用户、hadoop 安全性(我在安装指令后启用)以及我的 unix 用户和权限之间的相互作用。

4

2 回答 2

2

您需要让 PyWebHdfsClient 用户名与对您尝试写入的目录具有权限的 unix 用户匹配。启动namenode服务的用户默认是“超级用户”

我编写了您正在使用的 pywebhdfs 客户端,以满足工作需要。如果您有任何问题或想询问客户端本身的功能,请在 github 上留下问题,我可以解决。

https://github.com/ProjectMeniscus/pywebhdfs/issues

谢谢

于 2013-09-27T05:56:38.697 回答
1

在离开并阅读更多文档后想通了这一点。webdhfs 希望您指定一个与从 shell 启动 hdfs 的 unix 用户匹配的用户值。所以正确的python是:

from pywebhdfs.webhdfs import PyWebHdfsClient  
user = <specify_linux_user_who_launched_hadoop>
hdfs = PyWebHdfsClient(user_name=user)  
my_dir = '%s/data/new_dir' % user  
hdfs.make_dir(my_dir, permission=755)  
于 2013-09-25T23:44:14.003 回答