易君召
发布于 2026-08-18 / 作者:易君召 / 2 阅读
0

Apache SeaTunnel:使用 JSONL 解决 HTTP 大数据传输内存 OOM 难题

场景痛点:HTTP 接口返回超大 JSON 数组,传统一次性全量加载整个 JSON 报文到 JVM 内存,大报文直接触发 OOM,无法拉取百万级、GB 级接口数据。

一、原有 HTTP Source 的问题

早期 SeaTunnel HTTP Source format=json 的工作模式:

  1. HTTP 接口完整响应全部下载到内存,得到完整大 JSON 字符串;

  2. 将整个完整 JSON 一次性解析成完整 JsonObject/JsonArray 对象;

  3. 再遍历数组输出一条条数据记录。

致命缺陷

  • 如果接口返回[{"...}, {...}, {...}]十万 / 百万条的 JSON 数组,整个响应体几十 GB,全部加载进 JVM 堆,内存直接打爆 OOM;

  • 数据量越大,内存占用与报文总大小成正比,调大 Xmx 也治标不治本;

  • 分页 API 也无法彻底规避,单页返回上万条大对象依然内存压力巨大。

二、JSONL(JSON Lines)方案是什么

JSONL 格式:每行一条独立 JSON 对象,无外层数组包裹,换行符分割,示例:

json

{"id":1,"name":"a"}
{"id":2,"name":"b"}
{"id":3,"name":"c"}
  • 不需要等待全部响应接收完毕;

  • 流式按行读取 HTTP response 输入流,读一行、解析一行、输出一条记录,不需要把全量报文放入内存

关键:HTTP 服务端返回application/jsonlines,响应体是流式 JSONL,SeaTunnel 直接对 InputStream 逐行解析,内存只维持很小缓冲区。

三、SeaTunnel JSONL HTTP Source 核心能力

新增format = jsonl,基于 HTTP response InputStream 流式解析,边下载边解析,不缓存完整报文

核心优势

  1. ✅ 内存占用稳定,和总数据量无关,仅由缓冲区大小决定,GB 级接口响应也不会 OOM;

  2. ✅ 支持 Batch 流式拉取 HTTP 接口 JSONL 数据流;

  3. ✅ 逐行映射 SeaTunnel 行记录,直接下游写入 Doris、MySQL、Hive 等;

  4. ✅ 支持 schema 定义、字段映射、过滤转换;

  5. ❗前提:后端接口必须输出标准 JSONL 格式,不能返回外层包裹的 JSON 数组

配置示例(HOCON)

hocon

source {
  Http {
    url = "http://api.example.com/bigdata/stream"
    method = "GET"
    headers {
      Accept = "application/jsonlines"
    }
    format = "jsonl"  # 开启JSONL流式解析
    schema {
      fields {
        id = BIGINT
        name = STRING
        create_time = TIMESTAMP
      }
    }
  }
}

sink {
  Doris {
    ...
  }
}

四、两种模式对比

表格

模式

format=json

format=jsonl

读取方式

完整下载全部 body,一次性解析完整 JSON

HTTP 输入流逐行流式解析,边读边处理

内存模型

内存保存完整报文,内存随总数据膨胀

仅缓冲区,内存恒定,与总条数无关

接口返回格式

标准 JSON 数组 [{},{}]

JSON Lines,每行一个 JSON 对象

大数据表现

大报文极易 OOM

适合百万 / 千万级大规模数据

适用场景

小接口、分页小批量

大批量导出、流式数据接口

五、现实业务约束与改造方案

很多业务接口只返回传统 JSON 数组{"code":200,"data":[{}]},不支持 JSONL 输出,有两条路径:

  1. 服务端改造(最优):接口增加流式输出接口,返回 JSONL,不要组装外层大数组;

  2. 中间代理层:开发轻量代理服务,消费原接口大 JSON 数组,流式拆解转为 JSONL 输出,再给 SeaTunnel 读取;

  3. 不推荐:单纯调大 JVM 堆 -Xmx16g,数据持续上涨依然会 OOM,资源成本高。

六、配套注意事项

  1. 网络稳定性:长 HTTP 连接,网络中断需要重试机制;

  2. 分页场景:JSONL 适合流式导出接口;普通分页 API 还是需要 page 循环调用;

  3. Checkpoint:JSONL HTTP Source 为 batch 读取,无 offset,不支持 exactly‑once;需要业务侧做幂等;

  4. 换行符:JSONL 标准是\n换行,注意接口返回不要混用\r\n

  5. 二进制大文件:超大非 JSON 数据,使用format=binary分片下载模式。

七、总结

传统format=json全报文加载模型,受限于 JVM 堆内存;JSONL 是流式迭代模型,把内存压力从计算引擎转移到服务端输出侧。

当需要从 HTTP 接口同步千万级大量业务数据,优先推动服务端输出 JSON Lines,使用 SeaTunnel format=jsonl,彻底解决大 JSON 报文 OOM 问题,不需要疯狂调高 JVM 堆内存。


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/apache-seatunnel-jsonl-http-large-data-oom-solution

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/