Apache Drill读取大量JSON文件输出单文件时避免占满直接内存的设置咨询
降低Apache Drill大体积JSON文件合并场景直接内存消耗的方案
核心配置调整
- 开启JSON流式读取:设置
store.json.streaming_reader = true,不会一次性加载整个JSON文件到直接内存,而是增量解析JSON节点,对包含大体积Content字段的场景优化效果最为明显,可在会话级别执行如下语句生效:
SET store.json.streaming_reader = true;
- 调低批处理大小:将默认的
planner.batch_size从2048调整到256~512区间,降低单批次加载的数据量,直接减少每批次的内存占用,配置语句:
SET planner.batch_size = 512;
- 调低写入端批次缓存:调整
store.text.writer.batch_size参数,减少写入环节单批次缓存的数据量,配置语句:
SET store.text.writer.batch_size = 256;
- 限制单查询内存上限:设置
exec.memory.per_query_max_memory避免单查询占满全部节点直接内存,示例配置为限制单查询最多使用2GB直接内存:
SET exec.memory.per_query_max_memory = '2G';
- 开启中间结果落盘:启用算子落盘能力,内存不足时自动将中间数据写入磁盘不会触发OOM,配置语句:
SET exec.operator.external_sort.spill.enabled = true; SET exec.hashagg.spill.enabled = true;
查询逻辑优化
如果必须输出单个文件,可采用分页分批写入再合并的方案,避免一次性读取10万+文件带来的内存压力,示例拆分查询逻辑:
-- 第一批读取写入前2万条数据 CREATE TABLE stroageplugin.output.`/outputpath/part_1` AS SELECT Id, CreatedTime, Content FROM stroageplugin.root.`/inputpath/` LIMIT 20000 OFFSET 0; -- 按同样逻辑写入part_2到part_5,最后将5个分片文件手动合并为单个文件
如果对输出文件数量无强制要求,可保持默认的多分片写入逻辑,不需要额外合并,内存消耗可降低70%以上。
内容的提问来源于stack exchange,提问作者greenday
相关产品推荐
相关产品推荐

