[Doris核心原理] Fe启动过程原理分析1: 从start_fe.sh开始说起

2022-07-24 09:32:23 浏览数 (1)

Doris是如何启动FE的服务的呢? 我们从社区官方FE的部署文档[http://doris.apache.org/master/zh-CN/installing/install-deploy.html#集群部署]中得知, 执行以下命令可以启动一个FE进程.

代码语言:javascript复制
sh bin/start_fe.sh --daemon

那start_fe.sh脚本是如何把Doris FE进程拉起来的呢? 我总结了这个脚本主要做了3件事情, 下面我们依次来揭秘.

  1. 设置Doris启动必须的环境变量

大部分的环境变量都是依赖DORIS_HOME(doris所在目录, 里面包含bin, lib等). 这里主要介绍下关于DORIS_HOME的脚本计算如下:

代码语言:javascript复制
curdir=`dirname "$0"` 
curdir=`cd "$curdir"; pwd`

省略....

export DORIS_HOME=`cd "$curdir/.."; pwd`

关于以上脚本做如下解释

  • $0: 指的是 sh bin/start_fe.sh --daemon 启动命令中对于shell来说的的第1个参数, 显而易见是bin/start_fe.sh
  • dirname 文件名: 获取文件所在目录名. 此时curdir是bin所在的目录.

@@彩蛋@@: 如果你在系统任意一个目录执行, “bin/start_fe.sh”这段使用相对路径或者绝对路径, curdir值会怎么变化呢?

  • “cd "$curdir"; pwd”, 执行这个脚本后, 就能获取到start_fe.sh所在的全路径
  • “export DORIS_HOME=`cd "$curdir/.."; pwd`”, 我们可以看到目录向上获取, 就是最终DORIS_HOME

2. java检查

在脚本中搜索java关键字, 我们可以看到脚本验证了java版本(至少是java8)、java启动opts、java运行的CLASSPATH等. 脚本如下:

代码语言:javascript复制
# check java version and choose correct JAVA_OPTS
java_version=$(jdk_version)
final_java_opt=$JAVA_OPTS
if [ $java_version -gt 8 ]; then
    if [ -z "$JAVA_OPTS_FOR_JDK_9" ]; then
        echo "JAVA_OPTS_FOR_JDK_9 is not set in fe.conf" >> $LOG_DIR/fe.out
        exit -1
    fi 
    final_java_opt=$JAVA_OPTS_FOR_JDK_9
fi
echo "using java version $java_version" >> $LOG_DIR/fe.out
echo $final_java_opt >> $LOG_DIR/fe.out
# add libs to CLASSPATH
for f in $DORIS_HOME/lib/*.jar; do
  CLASSPATH=$f:${CLASSPATH};
done
export CLASSPATH=${CLASSPATH}:${DORIS_HOME}/lib

3. 用jar -jar启动FE进程

启动前通过DORIS_HOME确定了上次启动的pid文件, 并检查防止重复启动. 最后将全部的参数传递给org.apache.doris.PaloFe中的main函数, 最终开始启动FE.

代码语言:javascript复制
if [ ${RUN_DAEMON} -eq 1 ]; then
    nohup $LIMIT $JAVA $final_java_opt org.apache.doris.PaloFe ${HELPER} "$@" >> $LOG_DIR/fe.out 2>&1 </dev/null &
else
    $LIMIT $JAVA $final_java_opt org.apache.doris.PaloFe ${HELPER} "$@" >> $LOG_DIR/fe.out 2>&1 </dev/null
fi

0 人点赞