上次使用hdfs的时候解决了依赖包异常问题,但是因为hdfs的部署问题并没有完全调试通java远程调用。今天hdfs部署完成就急不可耐的试了一下,又发现了新的问题,报没有用户权限,真是一步一坑呀!寻求了一下百度,了解到hdfs采用了与POSIX系统类似的文件和目录的权限模型,所以要么在hdfs系统上配置用户及rw权限,要么用其他方法解决,考虑到对hdfs系统的解耦依赖,就探索从客户端解决,hdfs的缺省用户是root,那么能否让客户端模拟root呢?经过和一些同事沟通,果然有此方法,现在就把方法介绍一下。
权限异常
Permission denied: user=crazyicelee, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
从这个异常可以看出,客户端的用户是crazyicelee(jar运行的用户),要求的write权限,但是hdfs的节点上用户是root,从而判断用户没有权限,拒绝访问。
客户端修改访问用户
配置客户端访问的环境变量,设置HADOOP_USER_NAME为root,当然基于维护和安全考虑,还是要在hdfs服务端配置用户及权限。
@Bean
public HdfsService getHdfsService(){
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.set("fs.defaultFS",defaultHdfsUri);
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");
return new HdfsService(conf,defaultHdfsUri);
}
网友评论