首页 > 其他分享 >dremio 从S3StoragePlugin看一个存储插件的开发模式

dremio 从S3StoragePlugin看一个存储插件的开发模式

时间:2024-02-25 09:03:30浏览次数:18  
标签:插件 pluginType java 实现 dremio new optimizerContext S3StoragePlugin

以前对于S3StoragePlugin 有过简单的说明,以下结合S3StoragePlugin 说明下如何开发一个存储扩展

一些标准模式

  • 选择实现的存储插件的接口

比如s3的因为实际上就是文件系统,所以S3StoragePlugin 实现了FileSystemPlugin 接口的,同时可以复用不少已有的实现(比如表创建,修改,删除相关的),但是s3 有特殊性,S3StoragePlugin 做了一些重写

  • getDatasetHandle 实现
    这个属于一个标配,可以知道存储插件中dataset 的path 信息
  • getDatasetMetadata 实现
    与getDatasetHandle类似也是一个标配
  • listPartitionChunks 实现
    与getDatasetHandle类似也是一个标配
  • containerExists 实现
    与getDatasetHandle类似也是一个标配
  • SupportsListingDatasets 实现
    属于可选,mongo以及jdbc 存储插件都实现了此接口
  • SupportsExternalQuery 接口实现
    属于一个可选,jdbc 实现了此接口,方便进行外部查询
  • 实现规则工厂方法

FileSystemPlugin的实现如下,可以看到可以配置,但是有一个默认实现

 public Class<? extends StoragePluginRulesFactory> getRulesFactoryClass() {
    return context.getConfig().getClass("dremio.plugins.dfs.rulesfactory", StoragePluginRulesFactory.class, FileSystemRulesFactory.class);
 }

getRulesFactoryClass 类在dremio 中还是比较重要的,会影响到查询计划的具体执行
FileSystemRulesFactory 提供的核心规则如下,主要是对于逻辑计划以及物理计划的优化规则,详细的可以查看具体实现

public Set<RelOptRule> getRules(OptimizerRulesContext optimizerContext, PlannerPhase phase, SourceType pluginType) {
 
    switch(phase){
      case LOGICAL:
        ImmutableSet.Builder<RelOptRule> builder = ImmutableSet.builder();
        builder.add(new FileSystemDrule(pluginType));
 
        if(optimizerContext.getPlannerSettings().isPartitionPruningEnabled()){
          builder.add(new PruneScanRuleFilterOnProject<>(pluginType, FilesystemScanDrel.class, optimizerContext));
          builder.add(new PruneScanRuleFilterOnScan<>(pluginType, FilesystemScanDrel.class, optimizerContext));
          builder.add(new PruneScanRuleFilterOnSampleScan<>(pluginType, FilesystemScanDrel.class, optimizerContext));
        }
 
        return builder.build();
 
      case PHYSICAL:
        return ImmutableSet.<RelOptRule>of(
            new IcebergMetadataFilesystemScanPrule(pluginType, optimizerContext),
            new EasyFilesystemScanPrule(pluginType),
            new ParquetFilesystemScanPrule(pluginType),
            new IcebergFilesystemScanPrule(pluginType, optimizerContext),
            new DeltaLakeFilesystemScanPrule(pluginType, optimizerContext),
            new DeltaLakeFilesystemHistoryScanPrule(pluginType),
            ConvertCountToDirectScan.getAggOnScan(pluginType),
            ConvertCountToDirectScan.getAggProjOnScan(pluginType),
            new TableFilesFunctionScanPrule(pluginType),
            new FileSystemTableOptimizePrule(optimizerContext),
            new FileSystemVacuumTablePrule(optimizerContext),
            new VacuumCatalogPrule()
            );
 
      default:
        return ImmutableSet.<RelOptRule>of();
 
    }
  }
  • subscan 实现

dremio 不管任何存储扩展实际上都会是表的处理,需要进行scan,只是不同的scan 会有一些优化规则,比如文件系统的就有不少的实现

  • 对应subscan 的ProducerOperator.Creator 实现

因为s3基于了FileSystemPlugin 里边的实现不少,此Creator是在PipelineCreator中结合实际的规则选择合适的实现, 我简单介绍一个parquet 的
参考实现(ParquetOperatorCreator),里边会关联到具体的reader 处理,也是dremio 如何获取外部source 数据的地方,对于文件系统包含了不少
实现,jdbc 的就相对简单了,直接就是jdbc 的查询处理

public class ParquetOperatorCreator implements Creator<ParquetSubScan> {
  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ParquetOperatorCreator.class);
 
  @Override
  public ProducerOperator create(FragmentExecutionContext fragmentExecContext, final OperatorContext context, final ParquetSubScan config) throws ExecutionSetupException {
    final Stopwatch watch = Stopwatch.createStarted();
    try {
      ParquetSplitReaderCreatorIterator creator = new ParquetSplitReaderCreatorIterator(fragmentExecContext, context, config, true);
      logger.debug("Took {} ms to create Parquet Scan.", watch.elapsed(TimeUnit.MILLISECONDS));
      return creator.createScan();
    } catch (Exception ex) {
      throw new ExecutionSetupException("Failed to create scan operator.", ex);
    }
  }
 
  public RecordReaderIterator getReaders(FragmentExecutionContext fragmentExecContext, final OperatorContext context, final ParquetSubScan config) throws ExecutionSetupException {
    ParquetSplitReaderCreatorIterator creator = new ParquetSplitReaderCreatorIterator(fragmentExecContext, context, config, true);
    return new PrefetchingIterator(creator);
  }
 
}

说明

以上是结合一个实现,简单的串下dremio 存储插件实现应该做的一些事情,实际内部的处理可以多结合源码学习

参考资料

https://www.cnblogs.com/rongfengliang/p/17150854.html
sabot/kernel/src/main/java/com/dremio/exec/store/dfs/FileSystemRulesFactory.java
plugins/s3/src/main/java/com/dremio/plugins/s3/store/S3StoragePlugin.java
sabot/kernel/src/main/java/com/dremio/exec/store/StoragePluginRulesFactory.java
sabot/kernel/src/main/java/com/dremio/exec/physical/base/SubScan.java
sabot/kernel/src/main/java/com/dremio/exec/store/parquet/ParquetOperatorCreator.java
connector/src/main/java/com/dremio/connector/metadata/SourceMetadata.java
connector/src/main/java/com/dremio/connector/metadata/extensions/SupportsListingDatasets.java

标签:插件,pluginType,java,实现,dremio,new,optimizerContext,S3StoragePlugin
From: https://www.cnblogs.com/rongfengliang/p/18015047

相关文章

  • UE5工具管理插件——UserToolBox
    视频链接:https://www.bilibili.com/video/BV1Vu4m1N75U/?spm_id_from=333.1007.tianma.41-3-161.click&vd_source=0b48a4de5d48210298dd8b91fa633329UserToolBoxUserToolBox是一个可以管理蓝图脚本和Python命令,python脚本的插件1启动插件2创建选项卡3修改选项卡的名字可......
  • pytest简易教程(33):pytest常用插件 - 多重校验(pytest-assume)
     pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846应用场景对同一用例,要执行多个断言,查看断言是否都成功哪怕某个断言失败,后面断言依然能执行(assert实现不了) 插件安装pipinstall pytest-assume 使用方式pytest.assume(表达式)如果使用assert......
  • pytest简易教程(34):pytest常用插件 - 测试报告(pytest-html)
     pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846关于pytest-html通过命令行方式,生成xml/html格式的测试报告,存储于用户指定路径报告会覆盖上一次的 插件安装pipinstallpytest-html 使用方式命令行格式:pytest--html=./report/report.html......
  • ssts-hospital-web-master项目实战记录十二:项目迁移-架构库和插件库
    记录时间:2024-02-24架构库和插件库1.架构库(1)common.js (2)web.*.js 2.插件库待建设 一、Html项目js文件目录结构(VS2015)  二、Vue项目ts文件目录结构(VS Code)1.架构库 2.插件库   翻译搜索复制......
  • pytest简易教程(28):pytest常用插件 - 重复测试(pytest-repeat)
     pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846使用场景某功能不稳定,重复执行多次,以便复现问题 插件安装安装:pipinstallpytest-repeat 使用方式一:命令行参数参数:--count:重复运行次数,必填--repeat-scope:默认function,还可以是class......
  • pytest简易教程(29):pytest常用插件 - 控制函数执行顺序(pytest-ordering)
     pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846 应用场景用例执行顺序,默认是按照从上到下的顺序进行执行的,详见:https://www.cnblogs.com/uncleyong/p/17956862如果想自定义执行顺序,也就是改变执行优先级,那么可以使用pytest-ordering 插件安装pi......
  • pytest简易教程(30):pytest常用插件 - 随机执行(pytest-random-order)
     pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846应用场景用来验证用例在随机(无序)执行时是否正常 插件安装pipinstallpytest-random-order 使用方式加参数:--random-order 示例#!/usr/bin/envpython#-*-coding:utf-8-*-#@Author......
  • pytest简易教程(27):pytest常用插件 - 失败重试(pytest-rerunfailures)
     pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846关于插件pytest有很多第三方插件:https://docs.pytest.org/en/latest/reference/plugin_list.html#plugin-list总共1300多个,一般最近1年内有更新的都是常用的。 使用场景针对运行不通过的用例运行重......
  • windows11系统下ppt突然打不开,报错“PowerPoint启动时提示上次启动失败是否启用安全模
    问题描述:windows11系统下ppt突然打不开,报错:PowerPoint启动时提示上次启动失败是否启用安全模式...ppt文件是正常的,我发到其他设备上是可以正常打开的。我把office卸载了用腾讯文档也无法打开ppt文件。点击用安全模式打开后无反应,即无错误提示也没有打开ppt。以上情况说明:......
  • 使用通义灵码插件提高开发效率
    目录概述功能特性安装准备工作VSCode安装IDEA安装使用指南续写代码代码注释写单元测试解释代码含义优化代码问答排查异常总结引用概述通义灵码是阿里云开发的一个编码助手,基于AI大模型,提供代码智能生成,智能问答等功能,旨在加快编码,提高开发效率。功能帮你续写代码帮你写代码......