如何开发Presto Listener

折月煮酒 提交于 2020-01-18 08:07:46

开发

  1. 新建2个类,分别实现EventListenerFactoryEventListener
  2. 自定义一个Plugin,实现com.facebook.presto.spi.Plugin,重写getEventListenerFactories,返回自定义EventListenerFactory的实例
  3. 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!