Skip to content

查询与治理选型 ​

查询服务要回答的两个问题 ​

  1. 重计算去哪跑? 看板查询归 Doris;临时 JOIN、探索式分析归 Spark,但不能让每个人自己起 Spark。
  2. 取数谁管权限? 应用和外部系统不能裸连数据库,必须有一个统一出口做认证、限流、脱敏、审计。

一、Kyuubi:SQL 服务化 ​

问题:开发和分析师经常要跑临时 SQL(多表 JOIN、窗口、抽样),这类查询不适合放 Doris——Doris 适合固定规则的看板查询,临时大查询会把 BE 打满,影响线上。

方案:Kyuubi 把 Spark SQL 做成多租户服务:

  • 用户通过 JDBC/ODBC 连 Kyuubi,提交 SQL;
  • Kyuubi 按队列/租户动态申请 Spark Executor;
  • 查询结束,资源释放;
  • 认证接 LDAP/Kerberos/SSO,权限可接 Ranger。

即查即用,不占常驻资源,这是它相对"给每个人发一个 Spark 集群"的核心价值。

落地要点:

  • 引擎类型选 Spark(也可接 Flink/Trino,但本栈只需要 Spark SQL);
  • 开动态资源分配,设最大 Executor 上限,防止一个大查询吃光集群;
  • 结果集大小限制 + 超时,避免把结果拉爆客户端;
  • 查询日志落 Loki,审计可查。

二、受控网关:怎么落,选什么 ​

很多方案只强调“对外只暴露网关一个地址”,但没有指定用什么做 SQL 层的脱敏与行级过滤。这是常见的设计空白。结论先说:不引入独立的 SQL 代理产品,把“网关”拆成三个执行点,各管一段。

推荐架构 ​

BI / 内部报表  ──JDBC(MySQL)──►  Doris FE(只读账号 + 行/列权限)
分析师 / 数仓  ──JDBC──────────►  Kyuubi(Spark SQL,多租户 + Ranger 策略)
应用 / 外部系统 ──HTTPS────────►  Envoy Gateway ──► 取数 API(参数化查询/字段白名单/限流)──► Doris / Kyuubi
执行点负责不负责
Doris FEBI 看板、MySQL 协议接入、库表/行列权限、审计日志临时大查询、跨源 JOIN
Kyuubi临时分析、Spark SQL 多租户、队列隔离、Ranger 行列策略看板高并发点查
Envoy Gateway + 取数 API应用/外部取数:认证、限流、字段白名单、参数化查询、审计通用 SQL 代理

为什么不上独立 SQL 代理 ​

方案能力问题结论
Doris 内置 RBAC + 行/列权限对 Doris 直连生效,开箱即用只管 Doris,管不了 Spark/KyuubiBI 侧主推
Kyuubi + Ranger统一行列级策略、审计、队列多一套 Ranger(DB + Solr),策略要维护SQL 侧主推
ShardingSphere ProxyMySQL 协议、SQL 改写、脱敏多一跳、SQL 方言兼容要压测、运维成本高备选,非必要不上
自研 SQL 网关完全贴合业务长期维护成本高,SQL 解析是坑不推荐
Envoy Gateway 当 SQL 网关能做 L4 转发和 TLS看不懂 SQL,做不了列脱敏只能管 HTTP

多一个 SQL 代理,就多一层 SQL 方言兼容和性能瓶颈。Doris 本身说 MySQL 协议、有行/列权限;Kyuubi 本身是多租户 SQL 服务、能接 Ranger。把职责放到执行点上,比造一个"万能网关"稳。

三段权限怎么落 ​

  1. 身份:所有入口接统一 OIDC/LDAP,禁匿名;Doris/Kyuubi 各自校验,网关只做 HTTP 侧的令牌校验。
  2. 表级:Polaris 管 Iceberg 表授权,Doris 管内表授权;引擎用 service principal,人用个人身份。
  3. 行/列级:BI 场景用 Doris 行/列权限;Spark/Kyuubi 场景用 Ranger 的 row filter / column mask;应用取数在 API 层做字段白名单,不把 SQL 暴露给调用方。
  4. 审计:Doris audit log + Kyuubi 查询日志 + 网关访问日志,统一进 Loki,按用户/表/时间可查。

测试阶段怎么做 ​

  • 不装 Ranger、不装 SQL 代理。Ranger 要带 DB + Solr,短期测试不值当。
  • Doris 建一个只读账号,只在内网用;Kyuubi 可不装(用 spark-sql 代替)。
  • 外部取数不开放;如果一定要演示,写一个 20 行的 REST 服务,只执行参数化查询 + 字段白名单。
  • 把"生产要补 Ranger"写进验收清单,别把测试期的简化当成最终方案。

底线:不要让外部系统直连 Doris。宁可只开 HTTP 取数,也不要留一个没有脱敏的 JDBC 口子。

三、OpenMetadata:元数据与血缘 ​

对比 ​

维度OpenMetadataDataHubApache Atlas
部署与运维单体服务 + PostgreSQL + 可选搜索索引,栈内组件即可承载依赖消息队列、搜索、图库等多个组件依赖 HBase / Solr,技术栈老旧
连接器覆盖内置数十种连接器,Iceberg / Doris / Kafka / PostgreSQL 直接接入连接器较多,Iceberg 血缘需额外配置以 Hadoop 生态为主
血缘能力表级与列级血缘,可从 Iceberg 快照与 OpenLineage 事件自动采集采集链路更长以手工登记为主
质量与治理内置数据质量测试质量能力需外接无质量模块
AI 侧接口原生提供面向 AI 应用的元数据上下文接口需自行封装无
许可Apache-2.0Apache-2.0Apache-2.0

结论:OpenMetadata 部署轻、连接器覆盖广、原生带质量模块与 AI 侧接口;DataHub 仅作为备选。

落地要点 ​

  1. 先接三类源:Iceberg(Polaris)、Doris、Kafka,把核心链路的表先纳管。
  2. 血缘靠事件,不靠手工:Spark/Flink 作业开 OpenLineage 上报,OpenMetadata 消费事件生成血缘;手工登记只用于外部系统。
  3. 质量测试从关键表开始:主键唯一、空值率、行数波动、枚举值域,不要一上来铺全表。
  4. 搜索索引可重建:ES 挂了不影响元数据本身,重建索引即可。

四、可观测:指标、日志、告警 ​

组件分工 ​

组件职责
Prometheus拉取/接收指标,存 TSDB
Alertmanager告警分组、抑制、按级别路由
Grafana统一看板,指标与日志同一界面
Alloy采集日志(也支持指标),替代 Promtail
Loki日志存储,按标签索引

标签规范(必须先定) ​

cluster, env, namespace, app, component, instance

指标和日志共用同一套标签,才能"从告警点进日志"。标签别放高基数字段(用户 ID、SQL 文本),否则 Loki 会爆。

告警分级 ​

级别定义响应例子
P1业务不可用15 分钟内Doris FE 全挂、Kafka 不可写、Polaris 不可用
P2功能降级1 小时内入湖延迟 > 30 min、BE 磁盘 > 85%
P3需要关注次日快照未过期、证书 30 天内到期

必须有的看板 ​

  1. 链路健康:CDC 延迟、Kafka lag、Flink checkpoint 时长与失败数、入湖文件数。
  2. 查询健康:Doris QPS / P99 / 慢查询、Kyuubi 队列等待。
  3. 存储健康:S3 容量与请求错误率、Ceph OSD 状态、PG 连接数与慢查询。
  4. 平台健康:节点 CPU/内存/磁盘、Pod 重启次数、证书过期时间。

许可提醒 ​

Grafana、Loki、Alloy 都是 AGPL-3.0。内部部署不触发分发义务;如果这套平台要作为产品交付给客户,需要法务复核,或换成 Apache-2.0 的替代(如 OpenSearch Dashboards + Fluent Bit + VictoriaMetrics 的组合)。

结论 ​

决策点结论备选备注
临时 SQLKyuubi直连 Spark Thrift Server多租户、动态资源
HTTP 出口Envoy GatewayAPISIX / Traefik认证、限流、审计
SQL 出口(BI)Doris 只读账号 + 行/列权限—MySQL 协议,接入成本最低
SQL 出口(分析)Kyuubi + RangerSpark Thrift Server + Ranger行列级脱敏、审计
应用取数REST 取数 APIGraphQL / 预计算宽表参数化查询、字段白名单
独立 SQL 代理不引入ShardingSphere Proxy多一跳、兼容性风险
元数据OpenMetadataDataHub部署轻、血缘自动
血缘采集OpenLineage手工登记作业侧埋点
指标Prometheus + AlertmanagerVictoriaMetrics云原生标准
日志Alloy + LokiFluent Bit + ES与指标同标签
看板Grafana—注意 AGPL