在使用java api来在hdfs上操作时,可能会产生Permission denied: user=xxx, access=WRITE,inode="/myData/apiCreate.txt":centos:superg错误。
错误产生原因:
====================
java程序运行的系统当下正在使用的用户名在hdfs上想要操作的目录下没有权限--->rwxrwxrwx=777
解决方法
=============
1.将hdfs上的目录的权限进行修改,使得当前的用户用于权限来做相应的操作
-------------------------------------------------------------
hdfs dfs -chmod o+r+w+x /directory
2.在java程序上临时将系统上的HADOOP_USER_NAME名称改hdfs上的管理员名称或者文件的创建用户(前提:创建用户也有相应的权限)
----------------------------------------------------------------------------------------------------
System.setProperty("HADOOP_USER_NAME", "centos") ;
操作代码
=============
package hdfs.api.operate;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.io.IOException;
/**
* 通过javaapi进行hdfs的文件和文件夹的创建
*
*/
public class CreateFileOrDirectory {
@Test
public void createFile(){
Configuration conf = new Configuration() ;
conf.set("fs.defaultFS", "hdfs://192.168.83.201:8020");
System.setProperty("HADOOP_USER_NAME", "centos") ;
try {
FileSystem fs = FileSystem.get(conf);
FSDataOutputStream fos = fs.create(new Path("/myData/apiCreate.txt"), true);
fos.write("使用java api在hdfs上创建对象".getBytes());
fos.close();
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建文件夹,使用hdfs dfs -chmod 777 /myData方法来解决ermission denied: user=xxx异常
*/
@Test
public void createDire(){
Configuration conf = new Configuration() ;
conf.set("fs.defaultFS", "hdfs://192.168.83.201:8020");
try {
FileSystem fs = FileSystem.get(conf);
fs.create(new Path("/myData/apiCreateDire"), false) ;
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}