配置Presto+Hive+Hadoop时加载Hadoop原生库失败求助
解决Presto启动时Hadoop Native库加载失败的问题
问题根源分析
从报错java.lang.UnsatisfiedLinkError: /tmp/xxx.tmp: failed to map segment from shared object来看,核心原因集中在两点:
- /tmp目录挂载了
noexec权限,导致无法执行临时生成的共享库文件 - Presto启动时未正确加载HADOOP_HOME环境变量,或Hadoop native库路径配置存在问题
具体解决步骤
1. 检查并修复/tmp目录挂载权限
先执行命令查看/tmp的挂载参数:
mount | grep /tmp
如果输出包含noexec,说明/tmp禁止执行文件,需调整挂载选项:
- 临时生效(重启后失效):
sudo mount -o remount,rw,exec /tmp
- 永久生效(修改
/etc/fstab):
编辑/etc/fstab,找到/tmp对应的行,删除noexec参数,保存后执行:
sudo mount -o remount /tmp
2. 确保Presto能正确读取Hadoop环境
当前jvm.config中使用了$HADOOP_HOME变量,但Presto launcher默认不会加载系统环境变量,可通过两种方式解决:
- 方式一:修改Presto的
bin/launcher脚本,在开头添加环境变量声明:
export HADOOP_HOME=/home/user/hadoopnode # 替换为你的Hadoop实际安装路径
- 方式二:直接在
jvm.config中写死native库的绝对路径,替换原有的-Djava.library.path=$HADOOP_HOME/lib/native为:
-Djava.library.path=/home/user/hadoopnode/lib/native
3. 验证Hadoop Native库的系统兼容性
Ubuntu 20.04依赖glibc 2.31,需确认集群的Hadoop版本native库适配该系统:
- 检查native库的依赖情况:
ldd /home/user/hadoopnode/lib/native/libhadoop.so
如果存在缺失的依赖包,执行以下命令补充安装:
sudo apt-get install libsnappy-dev liblz4-dev libzstd-dev
4. 自定义Presto临时目录(可选)
若不想修改/tmp挂载选项,可指定Presto使用专属临时目录:
在config.properties中添加配置:
hive.hadoop.tmp.dir=/home/user/presto/tmp
然后创建目录并赋予Presto运行用户读写权限:
mkdir -p /home/user/presto/tmp chown user:user /home/user/presto/tmp # 替换为你的Presto运行用户
验证修复效果
修改完成后重启Presto:
/bin/launcher stop /bin/launcher start
等待1-2分钟后查看运行状态:
/bin/launcher status
若显示running,再检查server.log确认无相关报错即可。
内容的提问来源于stack exchange,提问作者Muhammad Affan
相关产品推荐
相关产品推荐

