Nifi在int环境启动因缺失snappyjava失败但dev环境正常的问题问询
根因分析
- snappy依赖加载触发逻辑差异
snappy-java不是NiFi的启动强制依赖,只有当运行时需要处理snappy压缩格式的数据/配置时才会触发类加载。int环境之前运行过旧版NiFi,且你将容器内/data/nifi目录持久化挂载到了宿主,旧版本运行时大概率开启了内容仓库、溯源仓库的snappy压缩,或是有处理器配置了snappy压缩规则,即使你已经更新了镜像和flow文件,NiFi启动时仍会尝试读取历史持久化数据,因此触发snappy依赖加载;而dev环境是全新部署无历史数据,自然不会触发该依赖加载,不会出现相关报错。 - 文件不存在的直接原因
snappy-java运行时会自动将对应平台的.so动态库解压到JVM的java.io.tmpdir目录,NiFi默认将该路径配置为/data/nifi/work。int环境的该目录是旧版NiFi运行时创建的,目录所属用户/权限和新版容器内运行NiFi的用户不匹配,导致NiFi进程没有写入权限,无法解压生成目标so文件,最终抛出FileNotFoundException异常。
解决方案
- 如果你不需要保留旧版NiFi的历史数据,直接清空宿主服务器上挂载的
/data/nifi目录,之后重新部署即可,全新目录会自动生成符合权限要求的work子目录。 - 如果你需要保留历史数据,先进入NiFi容器执行
ls -ld /data/nifi/work查看目录权限,确认和容器内NiFi运行用户的UID/GID不匹配后,执行chown -R <nifi运行用户>:<nifi运行用户组> /data/nifi修复权限,重启服务即可恢复。 - 临时解决方案可以在NiFi的
bootstrap.conf中添加JVM启动参数-Dorg.xerial.snappy.tempdir=/tmp,将snappy的动态库解压路径修改为容器内默认有写入权限的/tmp目录,跳过work目录的权限问题。
内容的提问来源于stack exchange,提问作者dsollen
相关产品推荐
相关产品推荐

