前言
想快速搭个报表看看业务情况,结果卡在数据接入这一关就耗了半天。各种数据源驱动版本不兼容、连接池配置一头雾水、想查个 S3 上的文件还得先写一堆 ETL 脚本——这些都算不上什么高深技术难题,但就是特别磨人。
这篇文章会从使用角度出发,聊一聊这个一站式大数据分析平台到底能做什么、怎么做的、以及实际用起来是什么样子。感兴趣的朋友可以直接拉到文末看源码。
项目介绍
DataVerge 是一站式大数据分析平台,覆盖了从数据接入、准备、建模、分析到展示的完整链路。项目采用插件化架构作为核心设计理念,仪表盘组件、字段类型、数据库驱动都可以独立扩展,既满足开箱即用,也允许按需定制。
平台的定位很明确——帮助中小团队、个人开发者、企业内部数据组快速搭建自助式 BI 环境。目前项目已经在实际生产环境中使用,每天承担着不少查询和分析任务。
在线演示环境:http://bi.dataverge.com.cn (域名备案中,暂时无法访问)
账号密码:admin / admin123
注意:每天 0 点会自动重置数据
项目功能
jdbc:s3:duckdb://,DuckDB 嵌入 JVM 直查 S3 对象存储 | ||
./dynamic-drivers 下,无需重启自动检测 | ||
项目特点
插件化架构:仪表盘组件、字段类型、数据库驱动均可独立扩展,不改动核心代码就能新增能力
零 ETL 直查 S3:通过自研 S3DuckDb 驱动,本地文件上传后无需清洗转换,直接用 SQL 查询 S3 上的文件,省去繁琐的数据导入流程
安全防护层层加固:从驱动加载隔离、JDBC 危险参数拦截到 JNDI 注入防护,每个环节都做了针对性处理,避免因添加数据源引入安全风险
连接池按用户隔离:每个用户独立维护连接池,避免相互影响,同时熔断器在异常情况下快速失败,防止故障蔓延
自定义驱动热加载:项目启动后会自动生成 dynamic-drivers 目录,把驱动 jar 包放进对应文件夹就能用,不用重启服务
灵活的数据集管理:原生 SQL 数据集支持参数化查询,保存后可在多个仪表盘复用,一处修改处处生效
数据口径统一管理:数据字典、数据格式、脱敏规则集中配置,保证整个平台对同一字段的理解是一致的
项目技术
项目代码
S3DuckDb 驱动核心
自定义 JDBC 驱动,让 DuckDB 能够直接查询 S3 上的 Parquet 文件:
publicclassS3DuckDbDriverimplementsDriver{privatestaticfinal String URL_PREFIX = "jdbc:s3:duckdb://";@Overridepublic Connection connect(String url, Properties info)throws SQLException {// 解析 S3 路径:jdbc:s3:duckdb://bucket/path/to/file.parquet S3Path s3Path = parseS3Url(url);// 初始化 DuckDB 连接 DuckDBConnection duckConn = DuckDBDriver.connect("jdbc:duckdb:", info );// 挂载 S3 文件为 DuckDB 外部表 duckConn.createStatement().execute( String.format("CREATE OR REPLACE VIEW %s AS " +"SELECT * FROM parquet_scan('%s')", s3Path.getTableName(), s3Path.getS3Url()) );returnnew S3DuckDbConnection(duckConn, s3Path); }}动态驱动加载器
驱动热加载的核心实现,监听目录变化自动加载新驱动:
@ComponentpublicclassDynamicDriverLoader{privatestaticfinal String DRIVER_BASE_PATH = "./dynamic-drivers";privatefinal Map<String, ClassLoader> driverClassLoaders = new ConcurrentHashMap<>();@PostConstructpublicvoidinit(){ createBaseDirectory(); scanAndLoadDrivers(); startDirectoryWatcher(); }privatevoidloadDriverFromDirectory(String driverName, File driverDir){ File[] jars = driverDir.listFiles((d, name) -> name.endsWith(".jar"));if (jars == null || jars.length == 0) return;// 创建隔离的 ClassLoader URL[] urls = Arrays.stream(jars) .map(this::toURL) .toArray(URL[]::new); ClassLoader isolatedLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());// 查找驱动类并注册 ServiceLoader<Driver> drivers = ServiceLoader.load(Driver.class, isolatedLoader);for (Driver driver : drivers) { DriverManager.registerDriver(new DriverProxy(driver)); } driverClassLoaders.put(driverName, isolatedLoader); }}熔断器实现
使用滑动窗口统计失败率,自动熔断保护:
publicclassCircuitBreaker{privatefinal SlidingWindowCounter counter = new SlidingWindowCounter(60);privatevolatile State state = State.CLOSED;privatefinaldouble failureRateThreshold = 0.5;privatefinalint minCallsRequired = 10;publicsynchronizedbooleanallowCall(){if (state == State.OPEN) {if (System.currentTimeMillis() - openTime > timeoutMs) { state = State.HALF_OPEN;returntrue; }returnfalse; }returntrue; }publicsynchronizedvoidrecordSuccess(){ counter.recordSuccess();if (state == State.HALF_OPEN) { state = State.CLOSED; } }publicsynchronizedvoidrecordFailure(){ counter.recordFailure();if (state == State.HALF_OPEN) { state = State.OPEN; openTime = System.currentTimeMillis();return; }if (state == State.CLOSED && counter.getTotalCalls() >= minCallsRequired) {double rate = counter.getFailureRate();if (rate >= failureRateThreshold) { state = State.OPEN; openTime = System.currentTimeMillis(); } } }}项目效果
数据源管理
数据源连接配置界面,支持多种数据源类型,可以添加表映射关系,自动检测字段信息:


数据面板(仪表盘)
拖拽式仪表盘设计界面,组件可自由布局,支持多种图表类型和交互筛选:

原生 SQL 数据集
在线编写 SQL,支持参数化查询,保存后可被多个仪表盘复用:

项目源码
Gitee:https://gitee.com/DataVerge/data-verge-web
总结
DataVerge 是一套完整的大数据分析平台解决方案,从数据接入到展示的每个环节都做了工程化落地的考量。插件化的架构设计让扩展变得简单,自研的 S3DuckDb 驱动解决了 S3 数据直查的痛点,完善的安全和连接池管理保障了生产环境可用性。
如果你正需要一套能快速部署、灵活扩展的 BI 工具,或者对 DuckDB + S3 的查询方案感兴趣,这个项目应该能给你一些参考价值。
关键词
#数据接入、#数据建模、数据分析、数据展示、#插件化架构、S3DuckDb、零ETL、连接池治理、熔断器、#动态驱动加载、#RBAC权限、数据脱敏、#仪表盘、DuckDB、Calcite、自助式BI
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!


方便大家交流、资源共享和共同成长
纯技术交流群、需要的小伙伴请扫码
有收获?不妨分享让更多人受益
关注「程序员开源栈」,共同提升技术实力




夜雨聆风