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


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

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

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


这种方法效果不错

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


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


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();
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值