Presto启动报错:No such file or directory

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命令的软链接
  • 具体原因分析,可以参考之前的博客:Linux上,多个JDK版本如何管理

2.2 解决办法

  • 使用大数据运维自己的JDK脚本安装方法,指定JDK版本、以yum install的方式安装JDK 8
  • 这种安装方式,会自动在/usr/bin目录下创建各种命令的软链接,包括javajavac

猜你喜欢

转载自blog.csdn.net/u014454538/article/details/131294535