Hadoop 3.2.2 minicluster初始化时测试用例遇权限拒绝错误
Hadoop 3.2.2 Minicluster 初始化权限问题解决建议
在IntelliJ中运行Spark项目的JUnit测试,通过hadoop-minicluster依赖初始化本地Hadoop集群时,Hadoop 2.7.3.2.6.5.0-292版本运行正常,但升级到3.2.2版本后测试失败,报错信息如下:
IOE creating namenodes. Permissions dump: path '/tmp/cluster1/data': absolute:/tmp/cluster1/data permissions: ---- path '/tmp/cluster1': absolute:/tmp/cluster1 permissions: drwx path '/tmp': absolute:/tmp permissions: drwx path '/': absolute:/ permissions: dr-x java.io.IOException: Failed to save in any storage directories while saving namespace. at org.apache.hadoop.hdfs.server.namenode.FSImage.saveFSImageInAllDirs(FSImage.java:1241) ~[hadoop-hdfs-3.2.2.jar:?] at org.apache.hadoop.hdfs.server.namenode.FSImage.saveFSImageInAllDirs(FSImage.java:1198) ~[hadoop-hdfs-3.2.2.jar:?] at org.apache.hadoop.hdfs.server.namenode.FSImage.format(FSImage.java:190) ~[hadoop-hdfs-3.2.2.jar:?] at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:1230) ~[hadoop-hdfs-3.2.2.jar:?] at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:427) ~[hadoop-hdfs-3.2.2.jar:?]
最初使用Mac临时目录/private/var/...出现错误,改为tmp后仍存在权限问题,且无sudo运行权限,以下是可行的解决建议:
指定项目内可控目录作为集群存储路径
避开系统级的/tmp或/User等受限目录,直接使用项目内的相对目录(如./target/hadoop-cluster-data),当前用户对该目录拥有完全读写权限。初始化Minicluster时显式配置存储目录:Configuration conf = new Configuration(); // 配置namenode存储目录 conf.set("dfs.namenode.name.dir", new File("./target/hadoop-nn").getAbsolutePath()); // 配置datanode存储目录 conf.set("dfs.datanode.data.dir", new File("./target/hadoop-dn").getAbsolutePath()); // 传入配置初始化集群 MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf).build();临时禁用Hadoop权限校验(仅测试环境)
Hadoop 3.x权限校验比2.x更严格,可在测试配置中关闭权限检查:conf.set("dfs.permissions.enabled", "false"); conf.set("dfs.permissions.superusergroup", System.getProperty("user.name"));注意:该方式仅适用于本地测试,生产环境绝对禁止使用。
手动创建并配置临时目录权限
如果坚持使用/tmp目录,在测试启动前手动创建子目录并赋予权限:File dataDir = new File("/tmp/cluster1/data"); if (!dataDir.exists()) { dataDir.mkdirs(); dataDir.setReadable(true, false); dataDir.setWritable(true, false); dataDir.setExecutable(true, false); }不过Mac的
/tmp存在系统自动清理机制,稳定性不如项目内目录。检查IntelliJ运行权限
确保IntelliJ以当前普通用户启动,运行配置中的"Working directory"设置为项目根目录,未添加特殊权限或环境变量限制。
内容的提问来源于stack exchange,提问作者mbr
相关产品推荐
相关产品推荐

