首页 > 其他分享 >dremio SchedulerService 服务简单说明

dremio SchedulerService 服务简单说明

时间:2024-02-08 09:03:41浏览次数:33  
标签:dremio SchedulerService 调度 registry scheduler 简单 ModifiableSchedulerService clas

SchedulerService内部调度服务算是一个比较重要的模块,比如dremio的功能都依赖此模块(元数据获取,一些数据清理任务,反射加速)

参考实现子类

SchedulerService 实现也比较多,因为dremio 集群中的节点有多种角色,为了保证数据的一致性会对于不同集群角色的节点进行不同的处理
如下图


简单说明:
ModifiableSchedulerService: 字面意思也很清晰,就是支持调度任务的修改,支持添加任务组,以及对于任务组进行修改
LocalSchedulerService: 实际上就是统一由一个节点进行调度的,为了支持修改也扩展了ModifiableSchedulerService
参考初始化,可以看出就是我们实际日常部署的dremio 集群模式

 
if (isLeaderlessScheduler) {
      final ScheduleTaskGroup defaultTaskGroup = ScheduleTaskGroup.create("clustered-singleton-default", capacity);
      ModifiableSchedulerService distributedSchedulerService = null;
      if (isDistributedCoordinator) {
        distributedSchedulerService = new ClusteredSingletonTaskScheduler(defaultTaskGroup, getRootName(),
          clusterCoordinatorProvider, currentEndPoint);
      }
      final SchedulerService localSchedulerService = new SimpleLocalSchedulerService(capacity);
      ModifiableSchedulerService scheduler;
      scheduler = new RoutingSchedulerService(clusterServiceSetManagerProvider, localSchedulerService,
        distributedSchedulerService);
      registry.bind(SchedulerService.class, scheduler);
      registry.bind(ModifiableSchedulerService.class, scheduler);
    } else {
      registry.bind(SchedulerService.class, new LocalSchedulerService(
        capacity, clusterServiceSetManagerProvider, clusterElectionManagerProvider, currentEndPoint,
        isDistributedCoordinator));
    }

ClusteredSingletonTaskScheduler、ModifiableLocalSchedulerService、ModifiableWrappedSchedulerService、RoutingSchedulerService 等都实现了此接口
ClusteredSingletonTaskScheduler: 核心是对于一个任务只能在集群级别一个服务实例运行,主要应该场景是对于部署的dremio 环境不master的分布式模式
参考处理

 
 if (isLeaderlessScheduler) {
      final ScheduleTaskGroup defaultTaskGroup = ScheduleTaskGroup.create("clustered-singleton-default", capacity);
      ModifiableSchedulerService distributedSchedulerService = null;
      if (isDistributedCoordinator) {
        distributedSchedulerService = new ClusteredSingletonTaskScheduler(defaultTaskGroup, getRootName(),
          clusterCoordinatorProvider, currentEndPoint);
      }
      final SchedulerService localSchedulerService = new SimpleLocalSchedulerService(capacity);
      ModifiableSchedulerService scheduler;
      scheduler = new RoutingSchedulerService(clusterServiceSetManagerProvider, localSchedulerService,
        distributedSchedulerService);
      registry.bind(SchedulerService.class, scheduler);
      registry.bind(ModifiableSchedulerService.class, scheduler);
    } else {
      registry.bind(SchedulerService.class, new LocalSchedulerService(
        capacity, clusterServiceSetManagerProvider, clusterElectionManagerProvider, currentEndPoint,
        isDistributedCoordinator));
    }

ModifiableLocalSchedulerService: 实现了ModifiableLocalSchedulerService以及LocalSchedulerService 支持基于配置的线程池修改
主要是在ModifiableWrappedSchedulerService 中使用
RoutingSchedulerService:就是支持路由的,可以路由到不同调度服务,本地或者集群单一的调度服务
SimpleLocalSchedulerService:任务的执行调度只能在本地,从上边ClusteredSingletonTaskScheduler部分的使用以及RoutingSchedulerService 创建可以看出是统一基于RoutingSchedulerService管理的
ModifiableWrappedSchedulerService: 主要是一个包装
使用的地方,可以看出主要是元数据刷新调度的

 
  protected ModifiableSchedulerService getMetadataRefreshModifiableScheduler(SingletonRegistry registry,
                                                                             boolean isDistributedCoordinator,
                                                                             boolean isLeaderless) {
    return new ModifiableWrappedSchedulerService(
      ExecConstants.MAX_CONCURRENT_METADATA_REFRESHES.getDefault().getNumVal().intValue(),
      isDistributedCoordinator,
      "metadata-refresh-modifiable-scheduler-",
      () -> registry.provider(ClusterCoordinator.class).get(),
      () -> registry.provider(ClusterCoordinator.class).get(),
      () -> registry.provider(SabotContext.class).get().getEndpoint(),
      ExecConstants.MAX_CONCURRENT_METADATA_REFRESHES,
      registry.provider(OptionManager.class),
      () -> registry.provider(ModifiableSchedulerService.class).get(),
      isLeaderless);
  }

内部对于使用的调度是基于集群是支持leader的选举配置创建的

private ModifiableSchedulerService createModifiableSchedulerService() {
    if (leaderlessEnabled) {
      LOGGER.info("Using leaderless Clustered singleton");
      final ModifiableSchedulerService service = schedulerServiceProvider.get();
      service.addTaskGroup(ScheduleTaskGroup.create(taskGroupName, initialCapacity));
      return service;
    } else {
      LOGGER.info("Using leader election based Clustered singleton");
      return new ModifiableLocalSchedulerService(
        initialCapacity,
        taskGroupName,
        clusterServiceSetManagerProvider,
        clusterElectionManagerProvider,
        currentNodeProvider,
        isDistributedCoordinator,
        option,
        optionManagerProvider);
    }
  }

调度任务的执行

调度服务的核心是对于定义的调度策略对于特定任务的执行

  • Schedule
    Schedule 的定义主要包含了调度的执行模式,比如定时周期执行类的任务,以及在什么啥时候触发执行(前置条件)
  • 主要使用调度的模块

如下图,可以看到是不少模块都使用了,比如反射加速,namespace,catalog 服务,source 的元数据管理,清理job 结果,系统配置同步
本地job 制定状态的监控,nessie repo的维护,sql 运行session 清理,系统统计服务,系统iceberg 表清理,移除获取token 任务

说明

对于任务执行部分,我只是简单说明了下,可以结合上图,结合实际源码了解不同服务模块是如何使用调度服务的,通过以上简单说明,我们可以看出
dremio的调度服务还是很重要的,不少服务都有使用

参考资料

services/scheduler/src/main/java/com/dremio/service/scheduler/SchedulerService.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java
services/scheduler/src/main/java/com/dremio/service/scheduler/Schedule.java

标签:dremio,SchedulerService,调度,registry,scheduler,简单,ModifiableSchedulerService,clas
From: https://www.cnblogs.com/rongfengliang/p/18009475

相关文章

  • 构建简单物体
    一.前言我们的空气曲棍球游戏已经取得了很大的进展,桌子已经放到了一个很好的角度,并且由于使用了纹理,更加好看了。然而,我们现在是用的点去代替木槌,它们实际看起来还不像木槌,许多应用都是通过合并简单的物体去构建更复杂的物体,我们在这篇文章中将学会如何绘制木槌以及桌子中间......
  • Rider 2023:打造高效.NET项目的智能IDE,让开发更简单mac/win版
    JetBrainsRider2023激活版下载是一款专为.NET开发者打造的强大集成开发环境(IDE)。这款IDE提供了丰富的功能,旨在帮助开发者更快速、更高效地编写、调试和测试.NET应用程序。→→↓↓载Rider2023mac/win版 Rider2023在保持了其一贯的智能代码补全、代码导航和重构工具的同......
  • go简单部署到ubuntu
    一、概述做了一个简单的服务用来下载文件,这里主要使用来下载apk,然后生成一个二维码给用户下载apk使用。 二、步骤1.在ubuntu上安装go环境并配置环境变量(网上一大堆)2.在Windows交叉打包一个可以运行在ubuntu上的可执行文件。打包命令file_download_service:可......
  • 简单的斐波那契数列通过chan实现生产者消费者模型
    1.实现斐波拉契数列写一个函数返回长度为n的斐波拉契slice数组funcfi(nint)[]int{ ifn<=0{ return[]int{} } fibs:=make([]int,n) fibs[0]=0 ifn>1{ fibs[1]=1 fori:=2;i<n;i++{ fibs[i]=fibs[i-1]+fibs[i-2] } } returnfibs}......
  • dremio FileSystem 简单说明
    dremio尽管对于文件系统的使用很多底层都是hdfs的(s3,发射加速),dremio为了减少直接依赖hdfs,自己抽象了一个FileSystem接口对于不同的实现可以方便进行扩展,当然和刚才说的一样,不少底层依赖的是hdfs的FileSystem参考子类如下图简单说明:FilterFileSystem实现了FileSy......
  • 超简单!手把手实现axum简易中间件
    axum是Rust语言tokio生态中的重要一环,以轻量、模块化、易用而闻名于世。它的中间件系统集成自另一个叫tower的框架,这就意味着如果我们要写axum的中间件的话,就得了解一下这个tower的各个核心概念,并学习它的用法。但是,很多时候我们可能只是想写一点简单的小工具,为了小需求去学习一个......
  • harmonyOS基础(二)-简单认识UIAbility
    大家好!我是黑臂麒麟,一位6年的前端工程师;随着鸿蒙4.0的发布。鸿蒙的社区壮大,而且市场越来越对harmonyOS认可度越来越高。现很多大公司开始需要招聘鸿蒙应用开发工程师,待遇都非常好。以后中心厂跟进,也可以赶上红利;之前一直想入坑鸿蒙,但犹豫徘徊,2024不在等待,只争朝夕学,勇往直前。系统......
  • 用Java编译一个简单计算器
    作业写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。思路推荐:写4个方法,加减乘除利用循环+switch进行用户交互传递需要操作的两个数输出结构packagecom.hongyi.method;importjava.util.Scanner;//写一个计算器,要实现加减乘除功能,......
  • 【CPL-2023】W2笔记-变量、类型、简单IO
    int类型范围-2^31~2^31-1UB未定义行为2^31-1+1的话会发生未定义行为,产生溢出时时未定义行为编译器的开发者可以以任意的行为来应对c标准中的未定义行为int型默认保持32比特/0或者%0会产生UB(未定义行为)/0为了兼容多个厂商的除法器而存在UB,有些除法器抛出错误,有......
  • python简单加解密
    有的内容并不怕别人看,但仍想简单加解密一下,可以考虑以下代码:defencrypt(text):encrypted_text=""forcharintext:unicode_value=ord(char)+10#在原有的Unicode值上加上10encrypted_text+=chr(unicode_value)returnencrypted_tex......