已知问题全景指南:容错、语句限制与规避策略)
数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载导读本文基于 Apache Druid 官方文档整理druid-multi-stage-query扩展Druid 24.0 起引入中多阶段查询Multi-stage Query简称 MSQ任务引擎的完整已知问题清单覆盖任务运行时行为、SELECT/INSERT/REPLACE/EXTERN/WINDOW语句的限制并结合 extensions-core/multi-stage-query 模块源码解释每个限制的底层成因与对应的错误码、上下文参数帮助你在规划 SQL 批量摄取方案时提前规避坑点并在遇到报错时快速定位根因。背景MSQ 引擎与本文定位SQL-based ingestion 由 Apache Druid 内置的druid-multi-stage-query扩展提供它新增了一个可以运行 SQL 语句作为批处理任务的多阶段查询任务引擎。该引擎支持用INSERT、REPLACE语句批量装载数据并实验性地支持把SELECT查询作为批处理任务运行。关于如何选择批量摄取方法可参考ingestion methods 表关于加载扩展与权限要求使用EXTERN需要 EXTERNAL 资源的 READ 权限见 SQL-based ingestion 总览。MSQ 引擎引入了三个核心执行角色见 index.md 词汇表Controller类型为query_controller的索引服务任务每个查询有一个 controller 负责编排执行Worker类型为query_worker的任务实际执行查询每个查询可有多个 workerworker 内部利用处理线程池至多druid.processing.numThreads并行处理Stage / Partition / Shuffle执行阶段被跨 worker 并行化INSERT/REPLACE查询的最终阶段分区会直接成为 Druid 段segmentworker 之间按分区交换数据shuffle每个输出分区按聚类键排序。理解这些概念是消化下述已知问题的前提很多限制的本质是「controller 单点职责」「worker 本地临时存储」「stage 间 shuffle 数据规模」三者的边界约束。任务运行时的已知问题容错只实现了一半worker 可重启controller 不可MSQ 引擎的容错是部分实现的当 worker 被意外杀死时会被重新拉起relaunch而当controller 被意外杀死时不会被重新拉起。从源码看容错能力由上下文参数faultTolerance控制其定义与默认值位于 MultiStageQueryContext.javaCTX_FAULT_TOLERANCE faultTolerance默认false读取逻辑在isFaultToleranceEnabled()同文件 L200-L206。同时 reference.md 明确指出faultTolerance不能与显式设置为false的durableShuffleStorage同时使用启用 fault tolerance 前必须在服务器级别配置druid.msq.intermediate.storage.enabletrue的持久化存储。相关的重启次数限制也记录在 reference.md 的 Limits 表 中限制项值超限错误码单个 worker 的最大重启次数首次运行不计即最多运行 1 workerRelaunchLimit次2TooManyAttemptsForWorker整个作业跨所有 worker 的最大重启次数100TooManyAttemptsForJob实践建议controller 是查询编排的单点。对于长时间运行的批量摄取应尽量避免直接杀死 controller 任务如需取消请走/druid/indexer/v1/task/{taskId}/shutdownAPI对应Canceled错误码见 reference.md。worker 阶段输出占用本地磁盘可能撑爆druid.indexer.task.baseDirworker 任务的阶段输出存储在druid.indexer.task.baseDir指定的工作目录中。当某个 stage 产生大量输出数据时可能耗尽该目录所在磁盘的全部空间此时查询以UnknownError失败错误信息包含No space left on device对应错误码UnknownError的message字段见 reference.md。这与另一个限制相关联MSQ 引擎还有按 worker 的临时存储上限druid.indexer.task.tmpStorageBytesPerTask若配置的临时存储不足以启动某个 stage会返回NotEnoughTemporaryStorage错误错误详情字段suggestedMinimumStorage与configuredTemporaryStorage见 reference.md。实践建议为 Indexer / MiddleManager 规划druid.indexer.task.baseDir所在磁盘容量时把「中间 shuffle 数据 段生成临时文件」都算进去不能只按最终段大小估算遇到No space left on device时检查各 worker 节点磁盘清理历史任务遗留的临时文件若报错为NotEnoughTemporaryStorage按错误详情中的suggestedMinimumStorage调大druid.indexer.task.tmpStorageBytesPerTask。SELECT语句的已知问题GROUPING SETS未实现MSQ 引擎未实现GROUPING SETS。使用该特性的查询会返回QueryNotSupported错误。错误码的源码定义位于 QueryNotSupportedFault.java其CODE常量即QueryNotSupported属于BaseMSQFault的派生类型。在 reference.md 的错误码表 中对该错误的解释是QueryKit无法把给定的原生查询翻译成多阶段查询典型触发场景就是GROUPING SETS。规避思路改用多个GROUP BY查询再UNION ALL组合结果或改写为GROUP BY 常规聚合表达式。INSERT与REPLACE语句的已知问题不支持带列列表的 INSERT / REPLACE形如INSERT INTO tbl (a, b, c) SELECT ...的带列列表写法未实现。这是与标准 SQL 的一个重要差异规划查询时不要照搬传统数据库的写法。列按「名称」而非「位置」匹配INSERT ... SELECT和REPLACE ... SELECT在插入列时依据列名匹配这与 SQL 标准中「按位置插入列」的行为不同标准行为见 reference.md 的 INSERT 章节。实践建议在SELECT列表中显式使用AS为目标列赋名不要依赖 SELECT 子句中的列顺序。例如INSERT INTO target_table SELECT src.event_time AS __time, src.user_id AS user_id, src.event_type AS event_type FROM TABLE(EXTERN(...)) PARTITIONED BY DAY未覆盖 ingestion spec 的全部选项INSERT和REPLACE并不支持 ingestion spec 中的所有选项典型缺失项包括维度属性createBitmapIndex与multiValueHandling见 dimension 对象tuningConfig 属性indexSpec见 tuningConfig。不过请注意在上下文参数层面MSQ 提供了部分等效能力。例如 reference.md 的上下文参数表 中indexSpec可以作为MSQ 查询上下文参数INSERT/REPLACE传入用于段生成时的索引配置可传 JSON 字符串或对象包括前端编码front coding 配置segmentSortOrder可以控制段内行排序rowsPerSegment默认 3,000,000、rowsInMemory默认 100,000用于控制段生成时的内存与行数行为arrayIngestMode默认mvd建议array决定 ARRAY 类型值的存储方式。结论若某项原生 ingestion spec 能力在 MSQ 中找不到对应上下文参数说明该能力当前不受 SQL-based ingestion 支持需要评估改用原生批量摄取任务。EXTERN函数的已知问题不支持 schemaless无模式维度原生摄取中 inclusions / exclusions 提供的 schemaless 维度特性在 MSQ 中不可用。所有列及其类型必须通过EXTERN函数的signature参数显式声明。EXTERN的签名 JSON 形式见 reference.md 的 EXTERN 章节SELECT column FROM TABLE( EXTERN( Druid input source, -- 任意 Druid 输入源JSON 编码字符串 Druid input format, -- 任意 Druid 输入格式JSON 编码字符串 row signature -- JSON 编码的列描述符数组 ) )其中 signature 是列描述符数组每个描述符必须包含name和typetype 支持string、long、double、float用于把外部数据映射到 SQL 层。也可以使用带EXTEND子句的 SQL 风格写法如(timestamp VARCHAR, metricType VARCHAR, value BIGINT)。实践建议在摄取脚本中维护好外部文件的列清单与类型映射当输入 schema 变化时需同步更新 signature不能指望自动发现。匹配大量文件时可能耗尽 controller 内存EXTERN配合匹配大量文件的输入源时可能耗尽controller 任务的可用内存。这与 controller 承担全局编排、收集统计信息的设计有关文件数量越多controller 侧需要维护的元数据越多。实践建议将大文件集拆分为多个较小的EXTERN查询分批摄取关注 controller 任务所在进程的内存配置必要时提升其内存配额。EXTERN只用于外部文件访问 Druid 数据源请用FROMEXTERN引用的是外部文件。如果要访问 Druid 自身的 datasource例如做「库内转换」、基于现有表的INSERT ... SELECT应使用FROM datasource而不是EXTERN。详见 index.md 中关于 in-database transformation 的说明。WINDOW函数的已知问题MSQ 引擎对窗口函数有两项限制窗口内元素数量上限为 100,000。即单个窗口window中参与计算的行数不能超过 100,000 条。这与 MSQ 的 shuffle/帧frame设计相关——窗口计算需要把窗口内数据物化到内存中。上下文参数maxRowsMaterializedInWindow定义见 MultiStageQueryContext.java可用于控制窗口内物化的行数规模规避该限制时需在「窗口划分粒度」与「内存占用」之间权衡。为规避 MSQ 引擎中的leafOperators窗口函数在窗口 stage 之后会附加一个额外的 scan stage针对原生引擎存在非空leafOperator的场景。这意味着带窗口函数的查询在计划中会比普通查询多一个执行阶段可据此理解查询计划explain中多出的 stage这属于正常现象而非故障。配套参考错误码与限制速查本文涉及的已知问题最终都会落到 reference.md 的错误码表 与 Limits 表 上。与本文直接相关的条目汇总如下场景错误码关键字段 / 处置建议GROUPING SETSQueryNotSupported改写为多个GROUP BYUNION ALL磁盘空间耗尽UnknownError消息含 No space left on device扩容druid.indexer.task.baseDir所在磁盘临时存储不足NotEnoughTemporaryStorage调大druid.indexer.task.tmpStorageBytesPerTaskcontroller 被杀Canceled检查进程稳定性避免直接杀 controller空结果 INSERT/REPLACE当failOnEmptyInserttrueInsertCannotBeEmpty默认failOnEmptyInsertfalse空 INSERT 为 no-op建议阅读顺序先读概念页理解 MSQ 执行模型再结合参考手册查询语句语法、上下文参数与错误码最后回到本文核对各项已知限制示例页提供了可运行的实战查询。总结MSQ 引擎的已知问题可以归纳为四条主线编排层controller 无容错、大文件集撑爆 controller 内存、存储层worker 阶段输出占用druid.indexer.task.baseDir磁盘、临时存储上限、SQL 语义层无GROUPING SETS、无带列列表 INSERT/REPLACE、列按名称匹配、无 schemaless 维度、窗口上限 100,000、能力边界层ingestion spec 部分选项缺失。规划 SQL-based ingestion 时围绕这四条主线做容量预估、查询改写与错误码预案即可把已知问题对生产链路的影响降到最低。赞分享数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载相关推荐Apache Druid SQL-based Ingestion API 实战指南用 MSQ 任务引擎提交与运维 INSERT/REPLACE 任务Apache Druid SQL based Ingestion API 实战指南用 MSQ 任务引擎提交与运维 INSERT/REPLACE 任务 导读 本数据库OLAP大数据后端gVisor限制说明已知限制与不兼容特性gVisor限制说明已知限制与不兼容特性 概述 gVisor作为容器应用内核虽然提供了强大的安全隔离能力但在追求安全性的同时也存在一些已知的限制和不兼容特云原生容器运行时操作系统应用安全Apache Druid 多阶段查询MSQ任务引擎SQL 批量摄取完整指南Apache Druid 多阶段查询MSQ任务引擎SQL 批量摄取完整指南 本文围绕 Apache Druid 内置的 druid multi stage数据库OLAP大数据后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考