Presto 基于 Airlift 构建的分布式 SQL 查询引擎,在 Presto 中 Airlift 起着举足轻重的作用,如果 Presto 是座大厦,那么 Airlift 就是大厦的地基。
Airlift 是一个可配置的、开箱即用的工具包,帮助开发者提升工作效率,将精力专注于业务实现。Airlift 提供的工具众多,今天会从基础的 configuration、 bootstrap 和 concurrent 开始介绍。
1. configuration
通过注解的方式,将配置文件中的数据绑定到配置类中,Presto 节点启动时就是通过 configuration 模块加载 etc 目录下的 config.properties 文件,获取节点配置信息。
这里将 mysql 的连接信息 配置在文件 config.properties 中:
首先定义配置类,使用注解 @Config 绑定配置文件的属性:
编写 guice moudle 创建绑定关系:
实际集成:
输出结果:
2. bootstrap
对象生命周期管理,在 Presto 中用于 Hive、Druid、Hudi 和 Kudu 连接器的生命周期管理,主要目的就是在对象初始化和销毁时执行特定的处理逻辑,注解 @PostConstruct 标识初始化方法,@PreDestroy 标识销毁算法。
创建 module 建立绑定:
实际集成:
输出结果:
3. concurrent
本质上是对通过 Executors 创建出来的线程池进行了容错处理,同时还提供了线程安全的缓存工具类。
这里主要介绍 BoundedExecutor 线程池,在 Presto 中出场次数最多,主要作用是让线程数量在一个合理的、可伸缩的安全范围之内,内部实现原理:
明确设置线程的最大数量,消除 Executors.newCachedThreadPool 中最大线程数等于 Integer.MAX_VALUE 的风险;
内部维护 ConcurrentLinkedQueue 缓冲队列;
任务会直接放入缓冲队列中,如果队列中任务数未达到预设的最大数量,执行队列首个任务,执行完毕首位移除;如果已经等于或大于最大数量直接退出。
额外介绍 ThreadLocalCache 线程安全的缓存工具类,该类保证缓存的永远是最新数据,使用时需要指定缓存数量和键对应值的获取逻辑:
领取专属 10元无门槛券
私享最新 技术干货