Java API操作hdfs踩坑实录

使用Java API出现以下异常:org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr-x 


原因:windows本地的用户名是Administrator 与hadoop的用户名不一致 导致没有写权限而被系统拒绝

解决方法:

(1)最简单粗暴的方法 可以修改hdfs下所有目录和文件的权限为777 如:hdfs dfs -chmod 777 /

但是这种方法不太安全 因此在生产环境下不可能这么设置 自己搭建集群学习时可以选择

(2)修改hadoop的配置文件:conf/hdfs-core.xml, 找到 dfs.permissions 的配置项 , 将value值改为 false

<property>
<name>dfs.permissions</name>
<value>false</value>
<description>
If "true", enable permission checking in HDFS.
If "false", permission checking is turned off,
but all other behavior is unchanged.
Switching from one parameter value to the other does not change the mode,
owner or group of files or directories.
</description>

</property>

然后重启hadoop进程(这种方法不一定管用)

(3)修改虚拟机参数:右击项目->Run As ->Run Configurations

Java API操作hdfs踩坑实录

这种方法简单 具体效果不作评价

(4)将windows当前用户修改为与hadoop用户一致(如root) 这种方法虽然可行 但是总感觉不太方便

(5)直接在代码中指定用户

Java API操作hdfs踩坑实录

这种方法效果不错

(6)在windows中添加key为HADOOP_USER_NAME的环境变量 值与hadoop用户保持一致 修改完重启eclipse,不然可能不生效

Java API操作hdfs踩坑实录

个人最推荐最后一种方法 效果立竿见影


2. 在使用java api操作hadoop时 上传文件没有问题 但是当下载数据的时候就抛出了一个空指针异常

代码如下:

// 下载文件
public void download() throws Exception
{
fs.copyToLocalFile(new Path("/README.txt"), new Path("C:/Users/Administrator/Desktop"));
fs.close();
}

解决方法:修改代码如下

// 下载文件
public void download() throws Exception
{
fs.copyToLocalFile(false, new Path("/README.txt"), new Path("C:/Users/Administrator/Desktop"), true);
fs.close();
}