Presto 0.100 Documentation

9.2. HTTP连接器示例

9.2. HTTP连接器示例

Example HTTP connector 的作用很简单:读取通过HTTP协议传递过来的以逗号分隔的数据。 例如,如果你有大量的CSV格式的数据,那么你可以使用Example HTTP Connector来进行这些数据的处理。通过Example HTTP Connector你可以方便的通过SQL查询来处理这些数据。

代码

Example HTTP Connector的源码可以在Presto源代码根目录下的presto-example-http目录下找到。

Maven工程

Example HTTP connector通过位于plugin工程根目录下的pom.xml文件来使用Maven进行编译。 Example HTTP connector可以通过Maven进行编译。其Maven配置文件是位于plugin根目录的pom.xml

工程依赖

Plugins依赖于Presto的SPI:

<dependency>
    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-spi</artifactId>
    <scope>provided</scope>
</dependency>

上面的scope之所以是provided是因为Presto已经提供运行时所使用的类,所以plugin不应该再将这些类重新编译打包。

除了上面的依赖之外,还需要Presto提供的一些其他依赖,例如:javax.inject和Jackson。 Jackson主要用于序列化处理,因此plugin必须使用Presto提供的版本。

根据自定义的plugin具体实现过程中使用到的类来添加其他依赖。Plugin使用独立的类加载器进行加载,这样plugin和其他的类是隔离的,因此plugin可以使用与Presto内部使用的类库不同版本的类库。

Plugin实现类

Example HTTP connector与其他的plugin相比,其实现非常的简单。在其实现中大部分的方法都在处理各种配置项,唯一一个关键的方法如下:

@Override
public <T> List<T> getServices(Class<T> type)
{
    if (type == ConnectorFactory.class) {
        return ImmutableList.of(type.cast(new ExampleConnectorFactory(getOptionalConfig())));
    }
    return ImmutableList.of();
}

ImmutableList 是Guava的一个工具类。

和所有的plugin一样,Example HTTP connector重写了getServices()方法,并且针对于请求ConnectorFactory类型服务的请求返回一个ExampleConnectorFactory实例。

ConnectorFactory Implementation

在Presto中,Connetor是通过ConnectorFactory创建的。并且Presto就是使用Connetor建立与各种数据源之间的连接的。

在ExampleConnectorFactory实现中,要做的第一件事情就是为connector指定名称。这个名称的作用与在Presto的配置文件中指定connector名称的作用是一样的。

@Override
public String getName()
{
    return "example-http";
}

connector factory中的实际工作实在create()方法中完成的。 在ExampleConnectorFactory类中,create()方法配置相应的connector,然后使用Guice创建相应的对象。下面就是一个没有参数验证和异常处理的create方法的简单实现:

// A plugin is not required to use Guice; it is just very convenient
Bootstrap app = new Bootstrap(
        new JsonModule(),
        new ExampleModule(connectorId));

Injector injector = app
        .strictConfig()
        .doNotInitializeLogging()
        .setRequiredConfigurationProperties(requiredConfig)
        .setOptionalConfigurationProperties(optionalConfig)
        .initialize();

return injector.getInstance(ExampleConnector.class);

Connector: ExampleConnector

Presto通过使用该类来获得connector提供的各种服务。

Metadata: ExampleMetadata

这个类的主要作用就是:获得table names,table metadata,column names,column metadata和connector提供的相关的schema信息。Presto也会使用ConnectorMetadata确保connector可以识别和处理给定的表名

The ExampleMetadata implementation delegates many of these calls to ExampleClient, a class that implements much of the core functionality of the connector.

Split Manager: ExampleSplitManager

split manager将一个表中的数据切分成一个或者多个split,并且分发给各个worker进行处理。在ExampleHTTPConnector中,每个表中包含一个或者多个指向实际数据的URI。ExampleSplitManager会针对于每个URI创建一个Split。

Record Set Provider: ExampleRecordSetProvider

record set provider 会创建一个record set,然后Record Set会创建一个Record cursor,而Record Cursor又会去获得实际的数据,最终返回给Presto。 ExampleRecordCursor通过HTTP从一个指定的URI中读取数据。每一行数据都被逗号分成相应的列,然后返回给Presto。