首页 > 其他分享 >dremio DatasetSaver 服务说明

dremio DatasetSaver 服务说明

时间:2023-01-04 18:45:38浏览次数:57  
标签:dremio java exec DatasetSaver refresh 说明 catalog com

我以前简单写过关于元数据处理的说明(基于jprofiler+arthas 工具)会依赖namespace 服务
实际对于数据的操作都是通过SourceMetadataManager 执行的

DatasetSaver 服务提供的能力

  • 核心提供的能力

主要是包装DatasetSaver 处理元数据的保存,将获取到的元数据通过namespace 服务保存到底层存储中(由datastore 服务提供的),但是因为保存需要一个逻辑流程
所以dremio 包装了一个私有的saveUsingV1Flow 方法,同时还需要依赖DatasetMetadataSaver 进行实际元数据的存储处理,SourceMetadata 是基本上所有存储插件都会
实现的,比如jdbc 就实现了,间接的会调用插件提供的元数据处理(jdbc 一般会基于information_schema 处理),但是有些存储插件会再实现SupportsListingDatasets
进行数据集的处理(此类在非关系数据库使用的比较多,比如mongo,es 扩展中)

  • 参考类图

 

 

SourceMetadataManager 提供的功能

  • 定时调度,基于60s,唤醒任务,进行插件元数据的获取
  • 支持后台任务刷新以及对于即席查询任务的刷新(即席任务主要是首次添加数据源的时候以及测试的时候)
  • 基于每个存储扩展插件的刷新策略进行任务处理
    参考调用链

     

     


    实际内部执行的处理
 
private void wakeup() {
 
    monitor.onWakeup();
 
    // if we've never refreshed, initialize the refresh start times. We do this on wakeup since that will happen if this
    // node gets assigned refresh responsibilities much later than the node initially comes up. It does leave the gap
    // where we may refresh early if we do a refresh and then the task immediately migrates but that is probably okay
    // for now.
   // 判断是否是刷新过
    if (!initialized) {
      initializeRefresh();
      // on first wakeup, we'll skip work so we can avoid a bunch of distracting exceptions when a plugin is first starting.
      return;
    }
 
    try {
      bridge.refreshState();
    } catch (TimeoutException ex) {
      logger.debug("Source '{}' timed out while refreshing state, skipping refresh.", sourceKey, ex);
      return;
    } catch (Exception ex) {
      logger.debug("Source '{}' refresh failed as we were unable to retrieve refresh it's state.", sourceKey, ex);
      return;
    }
 
    if (!runLock.tryLock()) {
      logger.info("Source '{}' delaying refresh since an adhoc refresh is currently active.", sourceKey);
      return;
    }
    // 基于ManagedStoragePlugin.MetadataBridge 的刷新策略获取   
    try (Closeable c = AutoCloseableLock.ofAlreadyOpen(runLock, true)) {
      if ( !(fullRefresh.shouldRun() || namesRefresh.shouldRun()) ) {
        return;
      }
 
      final SourceState sourceState = bridge.getState();
      if (sourceState == null || sourceState.getStatus() == SourceStatus.bad) {
        logger.info("Source '{}' skipping metadata refresh since it is currently in a bad state of {}.",
            sourceKey, sourceState);
        return;
      }
     // 后台任务处理
      final BackgroundRefresh refresh;
      if(fullRefresh.shouldRun()) {
        refresh = new BackgroundRefresh(fullRefresh, true);
      } else {
        refresh = new BackgroundRefresh(namesRefresh, false);
      }
      refresh.run();
    } catch (RuntimeException e) {
      logger.warn("Source '{}' metadata refresh failed to complete due to an exception.", sourceKey, e);
    }
 
  }

soure插件对于DatasetSaver 的调用

dremio 包含了一个PluginsManager,可以管理所有的存储扩展,存储扩展为转换为ManagedStoragePlugin 包装类型的
ManagedStoragePlugin 依赖SourceMetadataManager ,每个SourceMetadataManager包含一个定时任务扫描处理(60s)
然后在内部基于此WakeupWorker 进行元数据的刷新(包含full 以及其他模式的)

  • 部分调用链
 
 @com.dremio.service.namespace.NamespaceServiceImpl$DatasetMetadataSaverImpl.savePartitionChunk()
    at com.dremio.exec.catalog.SafeNamespaceService$1.lambda$savePartitionChunk$0(SafeNamespaceService.java:342)
    at com.dremio.exec.catalog.ManagedStoragePlugin$SafeRunner.doSafe(ManagedStoragePlugin.java:1233)
    at com.dremio.exec.catalog.SafeNamespaceService$1.savePartitionChunk(SafeNamespaceService.java:342)
    at com.dremio.exec.catalog.CatalogUtil.savePartitionChunksInSplitsStores(CatalogUtil.java:62)
    at com.dremio.exec.catalog.DatasetSaverImpl.saveUsingV1Flow(DatasetSaverImpl.java:252)
    at com.dremio.exec.catalog.DatasetSaverImpl.save(DatasetSaverImpl.java:121)
    at com.dremio.exec.catalog.DatasetSaverImpl.save(DatasetSaverImpl.java:137)
    at com.dremio.exec.catalog.MetadataSynchronizer.tryHandleExistingDataset(MetadataSynchronizer.java:316)
    at com.dremio.exec.catalog.MetadataSynchronizer.handleExistingDataset(MetadataSynchronizer.java:234)
    at com.dremio.exec.catalog.MetadataSynchronizer.synchronizeDatasets(MetadataSynchronizer.java:206)
    at com.dremio.exec.catalog.MetadataSynchronizer.go(MetadataSynchronizer.java:136)
    at com.dremio.exec.catalog.SourceMetadataManager$RefreshRunner.refreshFull(SourceMetadataManager.java:441)
    at com.dremio.exec.catalog.SourceMetadataManager$BackgroundRefresh.run(SourceMetadataManager.java:555)
    at com.dremio.exec.catalog.SourceMetadataManager.wakeup(SourceMetadataManager.java:264)
    at com.dremio.exec.catalog.SourceMetadataManager.access$300(SourceMetadataManager.java:96)
    at com.dremio.exec.catalog.SourceMetadataManager$WakeupWorker.run(SourceMetadataManager.java:203)

注意定义唤醒处理是在master 节点执行的, 构造函数可以看出来

if(isMaster) {
  // we can schedule on all nodes since this is a clustered singleton and will only run on a single node.
  // 基于了可修改modifiableScheduler 
  this.wakeupTask = modifiableScheduler.schedule(
      Schedule.Builder.everyMillis(WAKEUP_FREQUENCY_MS)
        .asClusteredSingleton("metadata-refresh-" + sourceKey)
        .build(),
        new WakeupWorker()); // 进行刷新,内部会DatasetSaverImpl 以及namespace 服务进行数据处理以及实际元数据的写入存储
} else {
  wakeupTask = null;
}

参考资料

sabot/kernel/src/main/java/com/dremio/exec/catalog/DatasetSaver.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/DatasetSaverImpl.java
https://www.cnblogs.com/rongfengliang/p/16795124.html
services/namespace/src/main/java/com/dremio/service/namespace/NamespaceService.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/SourceMetadataManager.java
sabot/kernel/src/test/java/com/dremio/exec/catalog/TestDatasetSaverImpl.java
sabot/kernel/src/test/java/com/dremio/exec/catalog/TestSourceMetadataManager.java
connector/src/main/java/com/dremio/connector/metadata/DatasetMetadata.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/ManagedStoragePlugin.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/PluginsManager.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/CatalogServiceImpl.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/MetadataSynchronizer.java
connector/src/main/java/com/dremio/connector/metadata/SourceMetadata.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/DatasetManager.java

标签:dremio,java,exec,DatasetSaver,refresh,说明,catalog,com
From: https://www.cnblogs.com/rongfengliang/p/17025724.html

相关文章

  • KS进行定制化安装,ks脚本说明
    在/var/lib/cobbler/kickstarts/目录下会生成sample_end.ks文件,这个文件就是安装系统时的默认配置文件,我们可以进行修改,来完成自己的个性化配置,配置文件详解如下关键字......
  • DSP+ZYNQ硬件说明手册【XQTyer】
    【开源资料】XQTyer硬件说明手册.pdf链接:https://share.weiyun.com/7TufhN89密码:2f4mvy    XQ6657Z35/45-EVM(XQTyer评估板)是一款基于TIKeyStone架构C6000......
  • EasyAR4.0使用说明(五)----3D物体跟踪
    3D物体跟踪总体上是和平面图像跟踪差不多的,设置,包括程序控制,识别多个对象。区别只是目标对象的不同。总体说明3D物体跟踪对3D物体的纹理,也就是表面的图案的丰富程度是有要求......
  • Ansible when: result.stdout.find使用说明【原创】
    0代表成功,-1代表失败when:result.stdout.find('JAVA_HOME')==-1当文件中没有JAVA_HOME关键字时执行,等于失败才执行,结果没有JAVA_HOME关键字时执行when:result.stdout.......
  • 《Unity3D平台AR开发快速上手--基于EasyAR4.0》随书资源和相关说明
    新手《Unity3D平台AR开发快速上手–基于EasyAR4.0》上市了,现在京东和淘宝都有卖。书分为2个部分,第一部分是EasyAR4.0基础内容和使用,第二部分是利用EasyAR的稀疏空间地图做室......
  • 《Unity2018AR与VR开发快速上手》随书内容资源相关说明
    我的第二本书,《Unity2018AR与VR开发快速上手》终于上市了,现在天猫和京东都有卖。随书资源的百度盘链接被关闭了,只给了个“此链接分享内容可能因为涉及侵权、色情、反动、低......
  • dremio datastore简单说明
    datastore实际上是进行数据存储的实现(主要是配置以及元数据相关的)不少服务都使用到了此功能(namespace,catalog,user,job)实际上dremio官方对于dremio的部署(软件版,尤其......
  • Linux环境下java环境变量配置简单说明
    第一步:到jdk包的路径下tar-xvfjdk-8u121-linux-x64.tar.gz-C/usr/lib/jvm第二步:cd/usr/lib/jvmls-ls查看下 第三步:配置环境变量vim/etc/profile按键i进入插入......
  • Linux系统 免密ssh登录配置及解释说明
    一、在需要登录的源机器上生成密钥(比如从A登录到B和C,就需要在A源机器上生成密钥,然后把公钥文件内容,复制到B和C目标机器上)(这就好比公司的指纹锁,你需要把你的指纹录入进去,......
  • dremio 表函数简单说明
    dremio对于表函数的处理实际上还是基于了apcahecalcite,只是对于dremio来说,使用相对不是很多目前dremio比较多的就是外部查询,还有就是关于iceberg的一些支持函数参......