问题现象
通过Hadoop集群外的电脑操作HDFS时,提示permission denied。
原因分析
老版本hadoop可以通过设置hadoop.job.ugi属性来获取对hdfs的操作权限,但是Clouder CDH3B3开始后hadoop.job.ugi不再生效。
解决办法
1、修改core-site.xml文件,增加以下两个属性
<property>
<name>hadoop.proxyuser.[集群外电脑登录用户名].groups</name>
<value>[能操作hdfs的集群用户名,多个用户之间用英文逗号间隔]</value>
<description>Allow the superuser oozie to impersonate any members of the group group1 and group2 and so on</description>
</property>
<property>
<name>hadoop.proxyuser.[集群外电脑登录用户名].hosts</name>
<value>[允许操作hdfs的集群外服务器IP地址,多个地址之间用英文逗号间隔]</value>
<description>The superuser can connect only from host1 and host2 and so on to impersonate a user</description>
</property>
2、通过使用UserGroupInformation.doAs来实现对hdfs的操作,代码如下:
public static boolean createFile(final String path, final boolean overwrite)
throws IOException {
UserGroupInformation ugi = UserGroupInformation.createProxyUser(
"hadoop", UserGroupInformation.getLoginUser());
try {
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
String uri = "hdfs://10.154.100.100:9000";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path f = new Path(path);
fs.create(f, overwrite);
fs.close();
return null;
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}