1. 问题描述
1.1 无法通过sudo -u presto启动
-
使用低版本的Presto时,在root用户下,通过如下命令切换到presto用户、启动Presto服务:
sudo -u presto /install_dir/bin/launcher start # 或直接restart,包含stop和start操作 sudo -u presto /install_dir/bin/launcher restart
-
测试0.280版本的Presto时,照旧使用该方法启动Presto服务
-
从简单的启动详情看,服务成功启动,PrestoServer进程号为26113
Not running Started as 26113
-
但通过
jps | grep ”PrestoServer"
时,却发现没有对应进程,即Presto服务实际并未成功启动 -
同时,在launcher.log中发现一行错误日志
ERROR: [Errno 2] No such file or directory
1.2 添加-v
获取错误详情
-
在启动命令中,添加了
-v
选项,以查看错误详情,最终在launcher.log中出现如下错误信息:ERROR: [Errno 2] No such file or directory Traceback (most recent call last): File "install_path/bin/launcher.py", line 449, in main handle_command(command, o) File "install_path/bin/launcher.py", line 332, in handle_command start(process, options) File "install_path/bin/launcher.py", line 286, in start os.execvpe(args[0], args, env) File "/usr/lib64/python2.7/os.py", line 353, in execvpe _execvpe(file, args, env) File "/usr/lib64/python2.7/os.py", line 380, in _execvpe func(fullname, *argrest) OSError: [Errno 2] No such file or directory
-
根据错误堆栈,阅读install_path/bin/launcher.py,最后发现可能是在执行
java -cp ...
命令以启动Presto服务时报错['java', '-cp', 'install_path/lib/*', '-server', '-Xmx45G', '-Xms45G', '-XX:+UseG1GC', '-XX:G1HeapRegionSize=32M', '-XX:+UseGCOverheadLimit', '-XX:+ExplicitGCInvokesConcurrent', '-XX:+ExitOnOutOfMemoryError', '-XX:+PrintGCDetails', '-XX:+PrintGCDateStamps', '-Xloggc:/data/presto/var/log/gc.log', '-XX:+UseGCLogFileRotation', '-XX:NumberOfGCLogFiles=8', '-XX:GCLogFileSize=24M', '-XX:+PrintGCApplicationStoppedTime', '-Dlog.output-file=/data/presto/var/log/server.log', '-Dnode.data-dir=/data/presto', '-Dnode.id=worker-10-102-147-2', '-Dnode.environment=production', '-Dlog.enable-console=false', '-Dlog.levels-file=install_path/etc/log.properties', '-Dconfig=install_path/etc/config.properties', 'com.facebook.presto.server.PrestoServer']
-
同时,笔者发现:直接切换到presto用户、再启动Presto服务,是能成功的
1.3 与真正原因擦肩而过
- 虽然网上有找到类似问题:OSError: [Errno 2] No such file or directory #7879,Presto的contributor也给了一个可能的原因
- 但笔者认为JDK的安装不应该存在问题,因为JDK的安装是重装系统时,系统运维一起安装的
2. 问题的排查
2.1 寻求系统运维帮助
- 由于对Python不是很熟悉,之前同样的启动方式并未遇到该问题,再加上这是新装机的物理机,因此求助系统运维的同事帮忙排查问题
- 系统运维在一番排查后,他们也怀疑JDK的安装不对,导致使用sudo启动Presto服务时找不到
java
命令 - 最终,系统运维排查出了原因:
- 他们帮忙安装的JDK服务,纯粹是模拟JDK的手动安装,不会在/usr/bin目录下生成
java
命令的软链接 - 虽然/usr/bin在/etc/sudoers中的secure_path下,但是
java
命令不在 - 以前的机器能通过sudo -u presto启动服务,是因为/usr/bin在存在
java
命令的软链接
- 他们帮忙安装的JDK服务,纯粹是模拟JDK的手动安装,不会在/usr/bin目录下生成
- 具体原因分析,可以参考之前的博客:Linux上,多个JDK版本如何管理
2.2 解决办法
- 使用大数据运维自己的JDK脚本安装方法,指定JDK版本、以
yum install
的方式安装JDK 8 - 这种安装方式,会自动在/usr/bin目录下创建各种命令的软链接,包括
java
、javac
等