sbt执行IntegrationTest/test调用HBaseTestingUtility启动迷你HDFS集群无法创建目录
问题根因
该问题是sbt隔离执行测试进程的默认umask配置和Hadoop迷你集群权限规则冲突导致:
- sbt执行
IntegrationTest/test任务时默认开启进程隔离(fork = true),fork出的测试进程默认umask值配置非常严格,会导致新创建的目录权限为无任何读写权限的----状态 - IntelliJ IDEA运行测试时继承的是当前操作系统用户的默认umask(通常为
0022),创建的目录权限正常,因此不会报错
解决方案
以下方案按生效优先级从高到低排列:
- 方案1:修改sbt集成测试任务的JVM启动参数,直接指定Hadoop权限掩码
在项目的build.sbt中添加如下配置:IntegrationTest / test / fork := true IntegrationTest / test / javaOptions ++= Seq( "-Dfs.permissions.umask-mode=022", "-Dhadoop.security.umask.mode=022" ) - 方案2:在初始化测试工具类时手动传入权限配置
在调用启动迷你集群方法前,手动给HBaseTestingUtility实例的配置添加umask参数:// Java示例 HBaseTestingUtility testUtil = new HBaseTestingUtility(); testUtil.getConfiguration().set("fs.permissions.umask-mode", "022"); testUtil.getConfiguration().set("hadoop.security.umask.mode", "022"); // 启动迷你集群 testUtil.startMiniCluster();// Scala示例 val testUtil = new HBaseTestingUtility() testUtil.getConfiguration.set("fs.permissions.umask-mode", "022") testUtil.getConfiguration.set("hadoop.security.umask.mode", "022") testUtil.startMiniCluster() - 方案3:临时调整执行sbt命令时的系统umask
执行测试命令前先修改当前shell会话的umask值:umask 0022 && sbt IntegrationTest/test - 备用方案:测试场景下可临时关闭HDFS权限校验(不建议生产关联测试使用)
在配置中添加如下参数:testUtil.getConfiguration().setBoolean("dfs.permissions.enabled", false);
内容的提问来源于stack exchange,提问作者Aleksandr Vinokurov
相关产品推荐
相关产品推荐

