前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Doris核心原理] -- FE启动过程原理分析2 -- 启动类PaloFe.java

[Doris核心原理] -- FE启动过程原理分析2 -- 启动类PaloFe.java

作者头像
小伟
发布2022-07-24 09:32:43
8060
发布2022-07-24 09:32:43
举报
文章被收录于专栏:魔都程序缘魔都程序缘

整个Doris Fe的启动是通过start_fe.sh调用org.apache.doris.PaloFe.main(String[] args)函数开始的. main()函数中初始化和启动了Fe全部的服务, 如下图所示:

下面依次简单讲解这个图中发生的核心初始化逻辑: PaloFe.java的初始化过程, 其他类的初始化见其他文章

1. 处理启动参数

这里主要通过parseArgs(args)方法将 start_fe.sh 传递过来的参数转化为CommandLineOptions对象, 方便后续处理. 比如第7点.

2. 处理PID文件

pid文件主要是防止启动相同的Fe进程. 在启动Fe时会检查pid文件所在目录是否存在fe.pid文件, 存在的话告诉用户已经启动一个进程了. 不存在的话则获取当前Fe启动进程号, 写入该文件.

3. 加载fe.conf

fe.conf我们都知道是Fe的配置文件, 通过以下代码将fe文件路径传入init()方法后初始化.

代码语言:javascript
复制
new Config().init(dorisHomeDir + "/conf/fe.conf");

这个方法以Properties文件的格式读取fe.conf文件, 并将内容加载到ConfigBase.java类中的一个静态变量props中.

代码语言:javascript
复制
public static Properties props;  
public static Class<? extends ConfigBase> confClass;    
public void init(String propfile) throws Exception {
    props = new Properties();
    confClass = this.getClass();
    props.load(new FileReader(propfile));
    replacedByEnv();
    setFields();
}
  • confClass = this.getClass(): 这个主要是获取当前类的class信息, 并保存到全局变量confClass中, 这里是Config.java的class, 以待后用.
  • replacedByEnv(): 这个方法会将配置文件中的配置value为shell变量的的数据从系统环境变量中取出, 替换为真实的值保存在props中. 为啥这么做呢, 目前我还有点没有想明白.(难解1).
  • setFields(): 这个方法会将配置加载完成的props变量中的key、value按照key名字与Config.java中打了@ConfField标记的字段名相同的方式, 设置对应的value. 具体是通过setConfigField()方法设置的具体value.

4. 校验java版本

这个比较简单, 主要代码在JdkUtils.checkJavaVersion()中, 大家可以自行查看.

5. 初始化日志配置

这里通过Log4jConfig.initLogging()方法实现, 逻辑比较简单, 唯一难解的是log4j的配置文件模板是HARD CODE在java代码中的, 从目前java的方便处理和主要处理方法来看, 基本都是放在一个配置文件中.

这里也有一个非常棒的地方, 每个模块可以单独配置日志生效级别, 原理是log4j的verbose modules机制, 具体是实现方式可以google关键字: StrSubstitutor+Interpolator了解

6. DNS缓存过期设置

代码语言:javascript
复制
java.security.Security.setProperty("networkaddress.cache.ttl" , "60");

7.处理bdb查看命令

在PaloFe.java中, 可以通过命令行查看当前doris Fe的编译信息和bdb中的一些信息. 主要通过dorischeckCommandLineOptions()方法实现.

查看FE的编译信息. cmdLineOpts变量是第1点中解析命令行参数的结果. 代码如下:

cmdLineOpts.runBdbTools(), 如果是运行的bdb工具, 则会根据命令, 去bdb中查询结果, 打印, 关闭控制台. 注意System.exit(0)与System.exit(-1)的区别.

代码语言:javascript
复制
BDBTool bdbTool = new BDBTool(Catalog.getCurrentCatalog().getBdbDir(), cmdLineOpts.getBdbToolOpts());
if (bdbTool.run()) {
   System.exit(0);
} else {
   System.exit(-1);
}

8. 初始化Fe服务

这里是通过调用FrontendOptions.init()方法实现的, 逻辑是获取了当前服务器可以提供Fe服务的ip或者host.

9. 初始化Fe执行环境

这里的执行环境, 我理解为主要是jdbc协议的执行环境. 通过ExecuteEnv.setup()方法实现. ConnectScheduler.java这个类是jdbc连接管理的主要场地, 这里规定了最大的jdbc连接数, 这些连接如何执行(线程池)、如何验证用户、如何授权等.

10. Catalog初始化

这个是Fe中最复杂的一个初始化, 通过Catalog.getCurrentCatalog().initialize(args)方法初始化. 这里面主要初始化了元数据加载、editlog回放等, 后面会单独讲解.

11. 启动Qe服务、Fe Thrift服务、Http服务

这些是Fe中的核心服务,

  • Qe服务实际上是一个jdbc服务, 也即是执行sql协议层.
  • Fe Thrift服务, 也就是本身的Fe服务, 是一个RPC服务, 可以被Be等远程调用.
  • Http服务, 包含了目前Fe的UI页面, Restful的接口

12. 注册线程池监控器

Fe中很多服务是通过线程池初始化的并执行的, 这里初始化了这些线程池的核心监控指标管理器.

Catalog初始化是最复杂的, 也是核心的. 下一篇文章会详细讲解.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 魔都程序缘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档