例如在HDFS上创建/input目录,Java代码如下:
package HDFS;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
/**
* Created by leboop on 2019/1/18.
*/
public class TestMKDir {
public static void main(String[] args) throws IOException {
// 配置NameNode节点地址
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://192.168.189.112:9000");
//创建客户端
FileSystem fs = FileSystem.get(configuration);
fs.mkdirs(new Path("/input"));
fs.close();
}
}
执行程序,运行结果如图:
发现Permission denied: user=********, access=WRITE, inode="/input":root:supergroup:drwxr-xr-x
只有root用户有w权限。其他用户只有rx权限。
解决方法:
(1)设置环境变量
在创建客户端前设置HADOOP_USER_NAME环境变量的值为root,以冒充root用户欺骗HDFS,代码如下:
System.setProperty("HADOOP_USER_NAME","root");
也可以利用开发工具设置环境变量,以IDEA开发工具为例,具体做法如下:
(2)设置Java的VM运行时-D参数,具体做法是在VM options中填入-D参数,如图:
(3)配置hdfs-site.xml,将dfs.permissions参数设置为false,默认是true,具体如下:
<property>
<!-- 权限检查 -->
<name>dfs.permissions</name>
<value>false</value>
</property>
(4)设置其他用户有w权限,具体执行如下命令:
hdfs dfs -chmod 777 /
这样drwxr-xr-x,变为drwxrwxrwx。随便折腾。