Spark 3.3.0独立集群Java程序读取挂载驱动器文件时权限拒绝
Spark 3.3.0独立集群模式下Java应用目录权限异常问题
问题背景
我在Spark 3.3.0独立集群中运行Java应用,需定期读取挂载驱动器内的文件。应用以spark用户运行,挂载驱动器由其他团队管理,已将spark用户加入4BANK组,目标目录权限如下:
drwxrwx--- 300 4BANK input
其中300为目录所有者,4BANK为所属用户组。
通过命令行以spark用户身份可正常访问input目录下的文件,但运行Java应用时抛出权限拒绝异常:
java.nio.file.AccessDeniedException: /home/ftpnis/FM/input
我在应用中添加日志输出当前用户及目录权限信息:
10:42:03 INFO javaconnect.spooldir.domain.FileProcessor: Owner: 300 10:42:03 INFO javaconnect.spooldir.domain.FileProcessor: Group: 4BANK 10:42:03 INFO javaconnect.spooldir.domain.FileProcessor: Permissions: [OWNER_READ, GROUP_EXECUTE, OWNER_WRITE, GROUP_WRITE, GROUP_READ, OWNER_EXECUTE] 10:42:03 INFO javaconnect.spooldir.domain.FileProcessor: The file is not readable. 10:42:03 INFO javaconnect.spooldir.domain.FileProcessor: The file is not writable. 10:42:03 INFO javaconnect.spooldir.domain.FileProcessor: Current User: spark 10:42:03 INFO javaconnect.spooldir.domain.FileProcessor: Groups: spark 4BANK gbdcs gbdpmx
日志显示spark用户确实属于4BANK组,目录组权限也包含读、写、执行权限,但应用判定目录不可读。另外,用其他拥有相同权限的用户在客户端模式运行应用可正常访问,仅集群模式下出现问题。
解决方向
1. 重启Spark Worker进程刷新组信息
用户组变更后,已运行的进程不会自动加载新的组配置。集群模式下,Spark Worker进程负责启动Executor,需:
- 重启所有集群节点上的Spark Worker服务,让Worker进程重新读取
spark用户的组列表。 - 验证Worker进程的组信息:找到Worker进程ID,执行
cat /proc/<pid>/status | grep Groups,确认输出包含4BANK对应的GID。
2. 检查远程挂载目录的权限配置
如果挂载的是NFS等远程共享目录,需排查:
- 共享服务器的
squash规则:确认是否开启root_squash/all_squash导致spark用户权限被映射为匿名用户。 - 挂载参数:查看
mount命令输出,确认是否有uid/gid强制指定,导致实际访问时组权限未生效。
3. 检查Spark文件系统访问配置
Spark默认可能通过Hadoop FileSystem抽象访问本地文件,需:
- 在Spark配置中添加
spark.hadoop.fs.file.impl=org.apache.hadoop.fs.LocalFileSystem,强制使用本地文件系统实现,避免Hadoop权限检查干扰。 - 若应用直接使用Java NIO访问文件,检查代码中权限判断逻辑是否存在bug(比如错误忽略组权限)。
4. 同步集群节点的用户组配置
确认所有Spark集群节点上的spark用户都已加入4BANK组:
- 在每个Worker节点执行
id spark,检查输出的组列表是否包含4BANK,避免部分节点未同步导致Executor权限不足。
内容的提问来源于stack exchange,提问作者Petar Markov
相关产品推荐
相关产品推荐

