Presto源码解读----Presto如何加载catalog信息

presto加载catalog的逻辑

在这里插入图片描述

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);
    });
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值