开发
- 新建2个类,分别实现
EventListenerFactory
和EventListener
- 自定义一个Plugin,实现
com.facebook.presto.spi.Plugin
,重写getEventListenerFactories
,返回自定义EventListenerFactory的实例 - 在
resources
目录下新建文件夹META-INF/services
,在该目录下新建文件com.facebook.presto.spi.Plugin
,并追加自定义Listener的全类名
配置
在presto根目录的etc目录下新建event-listener.properties,并追加
// 必须,和EventListenerFactory.getName()保持一致
event-listener.name=custom-event-listener
// 非必须,key和value会被作为EventListenerFactory.create的入参,方便自己实现一些逻辑,不需要可不写,也可以有多个
custom.key1=value2
custom.key2=value2
部署
$ # 将jar包部署到presto 主节点上,只需要是主节点就行,无需分配至所有节点
$ cd $PRESTO_HOME
$ cd plugin
$ mkdir custom-event-listener
$ mv custom-event-listener-1.0.jar custom-event-listener/
$ # 配置event-listener.properties
$ touch event-listener.properties
$ echo "event-listener.name=custom-event-listener" >> event-listener.properties
$ echo "custom.key=value" >> event-listener.properties
$ # 重启presto主节点
$ bin/launcher restart
代码示例
MEventListener.java
package com.mfw.xxx;
import com.facebook.presto.spi.eventlistener.EventListener;
import com.facebook.presto.spi.eventlistener.QueryCompletedEvent;
public class MEventListener implements EventListener {
private final String cluster;
public MEventListener(String cluster) {
this.cluster = cluster;
}
// event中包含的信息很多,比如input、ouput,CPU、memory使用情况等,这里由于演示只做打印
@Override
public void queryCompleted(QueryCompletedEvent event) {
System.out.println("cluster = " + cluster)
}
}
MEventListenerFactory.java
package com.mfw.xxx;
import com.facebook.presto.spi.eventlistener.EventListener;
import com.facebook.presto.spi.eventlistener.EventListenerFactory;
import java.util.Map;
public class MEventListenerFactory implements EventListenerFactory {
@Override
public String getName() {
return "mfw-event-listener";
}
@Override
public EventListener create(Map<String, String> config) {
return new MEventListener(config.getOrDefault("mfw.cluster", "UNKNOWN"));
}
}
MPlugin.java
package com.mfw.xxx;
import com.facebook.presto.spi.Plugin;
import com.facebook.presto.spi.eventlistener.EventListenerFactory;
import java.util.ArrayList;
import java.util.List;
public class MPlugin implements Plugin {
@Override
public Iterable<EventListenerFactory> getEventListenerFactories() {
MEventListenerFactory factory = new MEventListenerFactory();
List<EventListenerFactory> list = new ArrayList<>();
list.add(factory);
return list;
}
}
com.facebook.presto.spi.Plugin
com.mfw.xxx.MPlugin
event-listener.properties
event-listener.name=mfw-event-listener
mfw.cluster=G1
部署成功后,当有SQL执行完成,就可以在日志文件里看到cluster = G1