1.场景描述
spark在集成了kyuubi-spark-authz插件功能后,可以通过ranger-audit模块输出审计日志,这里我们选择log4j2日志输出。
在spark on yarn模式中,因为没有一个统一的服务端(类似HiveServer或HDFS NameNode),所以每次通过spark-submit提交一个任务后,都会初始化对应的log4j2 context,包括初始化对应的日志文件。
在log4j2初始化过程中,默认创建的日志文件权限为644。这就有一个问题,如果在节点A使用user1提交一个spark任务,则文件输出到logfile1,logfile1的属主为user1,其他用户无法访问。此时,如果在同一个节点上使用user2去提交一个任务,使用同一个日志文件输出,就会出现“Permission not permitted”的问题。
2.问题分析
问了满足多个不同用户往同一个文件写日志的需求,我们通过log4j2中的filePermissions参数来实现,把日志文件设置为666即可。参数解释可参考官方文档https://logging.apache.org/log4j/2.12.x/manual/appenders.html。
filePermissions的引入带来了新的问题,就是在设置权限时,调用了操作系统的chmod命令,如果操作用于不是当前日志文件的属主,就会输出以下错误日志。
Could not define attribute view on path "/var/logs/spark/audit.log" get /var/logs/spark/audit.log: 不允许的操作 java.nio.file.FileSystemException: /var/logs/spark/audit.log: 不允许的操作
需要注意的是,虽然有错误日志的输出,但是并不影响任务的正常运行,只影响日志的输出。
这里问题的的根源在赋权的操作,需要将此操作替替换。
通过添加createOnDemand参数即可解决,只有在需要的时候才创建文件,并进行赋权。