一、简介
同Hive Hook一样,Presto也支持自定义实现Event Listener,用于侦听Presto引擎执行查询时发生的事件,并作出相应的处理。我们可以利用该功能实现诸如自定义日志记录、调试和性能分析插件,帮助我们更好的运维Presto集群。但是不同于Hive Hook的是,在Presto集群中,一次只能有一个Event Listener处于活动状态。
Event Listener作为Plugin监听以下事件:
- Query Creation(查询建立相关信息)
- Query completion (success or failure)(查询执行相关信息,包含成功查询的细节信息,失败查询的错误码等信息)
- Split completion (success or failure)(split执行信息,同理包含成功和失败的细节信息)
了解Hook及Listener模式的朋友对于其步骤应该很清楚了,我们只需要:
- 实现Presto Event Listener和EventListenerFactory接口。
- 正确的打包我们的jar。
- 部署,放到Presto指定目录,修改配置文件。
二、实现步骤
- 添加pom依赖,如下
<presto.version>0.273.3</presto.version> <dependency> <groupId>com.facebook.presto</groupId> <artifactId>presto-spi</artifactId> <version>${presto.version}</version> </dependency>
- 实现EventListener,该类是我们的核心逻辑所在,供包含上面所说的三个事件:
public interface EventListener{ //query创建的详细信息 default void queryCreated(QueryCreatedEvent queryCreatedEvent) { } //query执行的详细信息 default void queryCompleted(QueryCompletedEvent queryCompletedEvent) { } //split执行的详细信息 default void splitCompleted(SplitCompletedEvent splitCompletedEvent) { } }
- 实现EventListenerFactory创建我们自己实现的EventListener
public interface EventListenerFactory { String getName(); EventListener create(Map<String, String> config); }
- 实现Plugin接口,实现getEventListenerFactories()方法,获取我们自己实现的EventListenerFactory
public class NwdEventListenerPlugin implements Plugin { @Override p