天天看点

Presto源码解读----Presto如何加载catalog信息presto加载catalog的逻辑presto启动入口初始化catalog加载器的bean和配置类初始化加载catalog信息入口catalog connector管理

presto加载catalog的逻辑

Presto源码解读----Presto如何加载catalog信息presto加载catalog的逻辑presto启动入口初始化catalog加载器的bean和配置类初始化加载catalog信息入口catalog connector管理

presto启动入口

模块:presto-server-main

类及方法:io.prestosql.server.PrestoServer.main(String[] args)

代码片段:

public final class PrestoServer
{
    private PrestoServer() {}

    public static void main(String[] args)
    {
        String javaVersion = nullToEmpty(StandardSystemProperty.JAVA_VERSION.value());
        String majorVersion = Splitter.on('.').split(javaVersion).iterator().next();
        Integer major = Ints.tryParse(majorVersion);
        if (major == null || major < 11) {
            System.err.println(format("ERROR: Presto requires Java 11+ (found %s)", javaVersion));
            System.exit(100);
        }

        String version = PrestoServer.class.getPackage().getImplementationVersion();
        // 启动presto服务
        new Server().start(firstNonNull(version, "unknown"));
    }
}
           

初始化catalog加载器的bean和配置类

模块:presto-main

类及方法:io.prestosql.server.ServerMainModule.setup(Binder binder)

代码片段:

// 初始化catalog加载器的bean
binder.bind(StaticCatalogStore.class).in(Scopes.SINGLETON);
// 加载配置
configBinder(binder).bindConfig(StaticCatalogStoreConfig.class);
           

初始化加载catalog信息入口

模块:presto-main

类及方法:io.prestosql.server.Server.doStart(String prestoVersion)

代码片段:

try {
    Injector injector = app.strictConfig().initialize();

    logLocation(log, "Working directory", Paths.get("."));
    logLocation(log, "Etc directory", Paths.get("etc"));

    injector.getInstance(PluginManager.class).loadPlugins();
    // 初始化加载catalog信息
    injector.getInstance(StaticCatalogStore.class).loadCatalogs();

    // TODO: remove this huge hack
    updateConnectorIds(injector.getInstance(Announcer.class), injector.getInstance(CatalogManager.class));

    injector.getInstance(SessionPropertyDefaults.class).loadConfigurationManager();
    injector.getInstance(ResourceGroupManager.class).loadConfigurationManager();
    injector.getInstance(AccessControlManager.class).loadSystemAccessControl();
    injector.getInstance(PasswordAuthenticatorManager.class).loadPasswordAuthenticator();
    injector.getInstance(EventListenerManager.class).loadEventListeners();
    injector.getInstance(GroupProviderManager.class).loadConfiguredGroupProvider();
    injector.getInstance(CertificateAuthenticatorManager.class).loadCertificateAuthenticator();

    injector.getInstance(Announcer.class).start();

    injector.getInstance(ServerInfoResource.class).startupComplete();

    log.info("======== SERVER STARTED ========");
}
catch (Throwable e) {
    log.error(e);
    System.exit(1);
}
           

catalog connector管理

创建catalog connector

模块:presto-main

类及方法:io.prestosql.connector.ConnectorManager.createCatalog(String catalogName, String connectorName, Map<String, String> properties)

代码片段:

public synchronized CatalogName createCatalog(String catalogName, String connectorName, Map<String, String> properties)
{
    requireNonNull(connectorName, "connectorName is null");
    InternalConnectorFactory connectorFactory = connectorFactories.get(connectorName);
    checkArgument(connectorFactory != null, "No factory for connector '%s'.  Available factories: %s", connectorName, connectorFactories.keySet());
    return createCatalog(catalogName, connectorFactory, properties);
}
           

删除catalog connector

模块:presto-main

类及方法:io.prestosql.connector.ConnectorManager.dropConnection(String catalogName)

代码片段:

public synchronized void dropConnection(String catalogName)
{
    requireNonNull(catalogName, "catalogName is null");

    catalogManager.removeCatalog(catalogName).ifPresent(catalog -> {
        // todo wait for all running transactions using the connector to complete before removing the services
        removeConnectorInternal(catalog);
        removeConnectorInternal(createInformationSchemaCatalogName(catalog));
        removeConnectorInternal(createSystemTablesCatalogName(catalog));
        handleResolver.removeCatalogHandleResolver(catalogName);
    });
}
           

继续阅读