presto 转换静态catlog为动态catlog

admin 2个月前 (07-23) 科技 26 0

  近年来,基于hadoop的sql框架层出不穷,presto也是其中的一员.从2012年生长至今,依然保持年轻的活力(版本迭代依然很快),presto的相关先容,我们就不赘述了,信赖看官多对presto有或多或少的领会,详细的一些说明可以看官网(https://prestodb.io)的说明.

  presto自身功效和头脑富有先进性,虽然由于是内存盘算,稳定性方面另有很大提升间,但整体依然在adhoc方面有很好的竞争力.其中在catalog加载的方式上来说对照的固化,官方并没有做出动态的方案出来,导致在添加catalog后必须重启整个集群才可以将新添加的catalog数据源添加到presto中,这无疑在现实的生产环境中很不友好.尤其是在一些中台项目中,需要动态计划的器械异常多.这种模式的catalog添加方式显然不能知足我们的开发需要.

  因此,在环境的加持下,对presto的加载catlog的方式的源码举行了革新,使其具有热动态添加的功效.我们采用了外部数据库作为他的catlog资源库,对其举行热加载

 (1)添加restful API请求接口.

  为了使框架自己具有添加catalog的功效,需要使其自己具有Api接见接口的方式来来对catalog的资源举行调整的功效

1.新增CatalogResource类来实现api的请求接口
 2.新增TimiCatalogStoreConfig类来实现与数据库交互的持久层
  3.新增TimiCatalogStore类来替换原本的catlog加载类
   4.新增CatalogInfo类来实现对catalog Model信息的剖析

#1 CatalogResource
@Path("/presto/catalog")
pUBLic class CatalogResource{

 
@GET
@Path("test")
public Response test()
{
return Response.ok("Hello world").build();
}
}

  在SerVeRMAInModule类中setup方式,最后一行添加jaxrsBinder(binder).bind(CatalogResource.class);将添加的请求类添加进来,然后启动主服务,并确认所开启的presto的请求接口地址,默认端口是:8080请求http://localhost:8080/presto/catalog/test

 返回 "Hello world" 则示意restful API 接口添加乐成.

#2&NBsp;TimiCatalogStoreConfig 类中主要实现了读取数据库毗邻设置,以及详细执行的catalog执行动作,并使用jaxrsBinder(binder).bind(TimiCatalogStoreConfig.class);注入到项目启动的容器中.并将Announcer,disableDCatalogs,ConnectorManager注入到类中.详细实现

public class TimiCatalogStoreConfig {

    private final Announcer announcer;
    private static final Logger log = Logger.get(TimiCatalogStoreConfig.class);
    private final Set<String> disabledCatalogs;
    private final ConnectorManager connectorManager;
public TimiCatalogStoreConfig(Announcer announcer,Set<String> disabledCatalogs,ConnectorManager connectorManager ) { this.announcer = announcer; this.disabledCatalogs = ImmutableSet.copyOf(disabledCatalogs); this.connectorManager = connectorManager; } }

  然后就是实现对catlog增删查改动作,并将操作的结构实现到ConnectorManager中,

首先将Server中的CatalogStore替换成我们自定义实现的TimiCatalogStore并注入相关类

 @Inject
    public TimiCatalogStore(ConnectorManager connectorManager, Announcer announcer, StaticCatalogStoreConfig confiG.T.MiCatalogStoreConfig catalogStoreConfig) {
        this(connectorManager,
                announcer,
                config.getCatalogConfigurationDir(),
                firstNonNull(config.getDisabledCatalogs(), ImmutableList.of()),
                catalogStoreConfig
        );
    }

  然后实现loadCatalogs方式,首次挪用的时刻使用load();方式加载mysql中存储的所有catlog,然后使用ScheduledExecutorService准时的方式从mysql中提取有转变的catlog加载到presto的ConnectorManager中.

public static void updateConnectorIdAnnouncement(Announcer announcer, CatalogName connectorId)
    {
        //
        // This code was copied from PrestoServer, and is a hack that should be removed when the connectorId property is removed
        //
        // get existing announcement
        ServiceAnnouncement announcement = getPrestoAnnouncement(announcer.getServiceAnnouncements());
        // update connectorIds property
        Map<String, String> properties = new LinkedHashMap<>(announcement.getProperties());
        String property = nullToEmpty(properties.get("connectorIds"));
        Set<String> connectorIds = new LinkedHashSet<>(Splitter.on(',').trimResults().omitEmptyStrings().splitToList(property));
        connectorIds.add(connectorId.toString());
        properties.put("connectorIds", Joiner.on(',').join(connectorIds));
        // update announcement
        announcer.removeServiceAnnouncement(announcement.getId());
        announcer.addServiceAnnouncement(serviceAnnouncement(announcement.getType()).addProperties(properties).build());
        announcer.forceAnnounce();
    }

  在这里我们设定的1分钟从mysql库充更新一次catalog列表

        scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                reload();
            }
        }, 60, 60, TimeUnit.SECONDS);

  挪用reload方式准时读取

    public void reload() {

        try{
            //获取最新的catalogs
            Map<String, CatalogInfo> catalogInfos = catalogStoreConfig.load();

            catalogInfos.forEach(
                    (key, catalogInfo) -> {
                        if (!catalogInfoMap.containsKey(key)) {
                            //相同--catlog
                            try {
                                System.out.println("添加数据源"+JSON.toJSONString(catalogInfo));
//                                log.info("添加数据源:{}",JSON.toJSONString(catalogInfos.get(key)));
                                CatalogName catalogName = loadCatalog(catalogInfo);
                                updateConnectorIdAnnouncement(announcer,catalogName);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                        } else {
                            //差别catlog
                            if (!JSON.toJSONString(catalogInfoMap.get(key)).equals(JSON.toJSONString(catalogInfo))){
                                connectorManager.droPConnection(catalogInfo.getCatalogName());
                                try {
                                    System.out.println("添加数据源"+JSON.toJSONString(catalogInfo));
                                    CatalogName catalogName  = loadCatalog(catalogInfo);
                                    updateConnectorIdAnnouncement(announcer,catalogName);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }

                        }
                    }
            );
            catalogInfoMap.putAll(catalogInfos);

        }catch (Exception e){
            e.printStackTrace();
        }
    }

  从mysql库中取出来的catlog信息和对现有的catlog举行对比,如果是差别的catlog就添加到presto中,重复的catlog不添加,删除的catlog就从现有的catlog管理器中删除,以此来到达动态添加catlog的动作,不需要重启presto服务器.

  

,

Allbet官网

欢迎进入Allbet官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务

AllBetGaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:presto 转换静态catlog为动态catlog

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:657
  • 页面总数:0
  • 分类总数:8
  • 标签总数:964
  • 评论总数:246
  • 浏览总数:10116