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件事情, 下面我们依次来揭秘.
- 设置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