从 JSON 到 JSONL,Apache SeaTunnel 如何解决HTTP 大数据传输的内存难题?

如果这个HTTP请求的数据量过大,那么对于服务端和客户端的压力就非常大,如何解决这个问题呢?
178712262176952b03a3968dd6297

https://github.com/apache/SeaTunnel

点击蓝字



关注我们

转载自 | 数仓生态圈

SeaTunnel可以从HTTP中获取数据,一般来说,HTTP会返回一个JSON格式的字符串,SeaTunnel解析JSON后分解出来数据类型,然后输出到目标系统中。

常规来说是没有问题,但是如果这个HTTP请求的数据量过大,对于服务端和客户端的压力就非常大,那么如何解决这个问题呢?那就需要使用流式处理方式JSONL,边生成数据边发送,这样就不需要一次性把数据都放入内存,减少内存的使用量。例如从数据库里面获取1个月的订单,如果总共100万条数据,那么我们可以一次只取5天的数,循环获取和输出,那么就不需要一次性的把100万条数据放入内存中。

一、JSON与JSONL的输出格式

1、JSON

通过HTTP返回JSON样式的数据如下


[  {    "id": 1,    "name": "a"  },  {    "id": 2,    "name": "b"  }]

返回的内容整体是一个JSON格式,数据处理会把返回的整个数据进行处理

2、JSONL

通过HTTP返回JSONL样式的数据如下


{"id":1,"name":"a"}{"id":2,"name":"b"}

返回的内容整体不是一个JSON格式,而是每行一个JSON类型,并且通过换行来分割其他JSON。

二、区分返回格式的参数

参数

描述

enable_multi_lines

true

读取JSONL格式

enable_multi_lines(默认值)

false

读取JSON格式


三、举例

1、先做一个HTTP测试服务,返回上面2种格式


[root@localhost]# curl http://localhost:3000[  {    "id": 1,    "name": "aaa"  },  {    "id": 2,    "name": "bbb"  }][root@localhost]# curl http://localhost:3000/jsonl{"id":1,"name":"aaa"}{"id":2,"name":"bbb"}

2、JSON格式的配置


env {  parallelism = 1  job.mode = "BATCH"}source {  Http {    plugin_output = "http"    url = "http://localhost:3000"    method = "GET"    format = "json"    enable_multi_lines = false    schema = {      fields {        id = int        name = string      }    }  }}sink {  Console {    parallelism = 1  }}

输出结果


2026-07-04 18:13:09,073 INFO  [.a.s.c.s.c.s.ConsoleSinkWriter] [st-multi-table-sink-writer-1] - subtaskIndex=0  rowIndex=1:  SeaTunnelRow#tableId=Optional[http] SeaTunnelRow#kind=INSERT : 1, aaa2026-07-04 18:13:09,073 INFO  [.a.s.c.s.c.s.ConsoleSinkWriter] [st-multi-table-sink-writer-1] - subtaskIndex=0  rowIndex=2:  SeaTunnelRow#tableId=Optional[http] SeaTunnelRow#kind=INSERT : 2, bbb

3、JSONL格式的配置


source {  Http {    plugin_output = "http"    url = "http://localhost:3000/jsonl"    method = "GET"    format = "json"    enable_multi_lines = true    schema = {      fields {        id = int        name = string      }    }  }}

返回结果和上面相同,如果把enable_multi_lines改为false,那么结果只会有第一条数据,后面的数据没有获取到。

四、总结

如果是常规的HTTP服务返回1个JSON格式的字符串时,那么就不用管这个参数,它默认就是false。如果是流式的JSONL输出格式,那么一定要记住设置enable_multi_lines参数为true。

Apache SeaTunnel

Apache SeaTunnel是一个云原生的多模态、高性能海量数据集成工具。北京时间 2023 年 6 月1 日,全球最大的开源软件基金会ApacheSoftware Foundation正式宣布SeaTunnel毕业成为Apache顶级项目。目前,SeaTunnel在GitHub上Star数量已达9k+。SeaTunnel支持在云数据库、本地数据源、SaaS、大模型等170多种数据源之间进行数据实时和批量同步,支持CDC、DDL变更、整库同步等功能,更是可以和大模型打通,让大模型链接企业内部的数据。




同步Demo

MySQL→Doris | MySQLCDC | MySQL→Hive | HTTP → Doris | HTTP → MySQL | MySQL→StarRocks|MySQL→Elasticsearch |Kafka→ClickHouse

新手入门

SeaTunnel 让数据集成变得 So easy!/ 3 分钟入门指南
0 到 1 快速入门 /初探/深入理解
分布式集群部署 | CDC数据同步管道 | Oracle-CDC
图片

最佳实践

同程旅行中控技术天翼云多点OPPO | 清风马蜂窝孩子王哔哩哔哩唯品会众安保险兆原数通 | 亚信科技|映客|翼康济世|信也科技|华润置地|Shopee|京东科技|58同城|互联网银行|JPMorgan
图片

测试报告

SeaTunnel VS GLUE | VS Airbyte | VS DataX|SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比
图片

源码解析

Zeta引擎源码解析(一) |(二) |(三)| API 源码解析 |2.1.1源码解析|封装 Flink 连接数据库解析





仓库地址:
https://github.com/apache/seatunnel
网址:
https://seatunnel.apache.org/
Apache SeaTunnel 下载地址:
https://seatunnel.apache.org/download
衷心欢迎更多人加入!
我们相信,在Community Over Code(社区大于代码)、「Open and Cooperation」(开放协作)、「Meritocracy」(精英管理)、以及「多样性与共识决策」The Apache Way 的指引下,我们将迎来更加多元化和包容的社区生态,共建开源精神带来的技术进步!
我们诚邀各位有志于让本土开源立足全球的伙伴加入 SeaTunnel 贡献者大家庭,一起共建开源!
提交问题和建议:
https://github.com/apache/seatunnel/issues
贡献代码:
https://github.com/apache/seatunnel/pulls
订阅社区开发邮件列表 :
dev-subscribe@seatunnel.apache.org
开发邮件列表:
dev@seatunnel.apache.org
加入 Slack:
https://join.slack.com/t/apacheseatunnel/shared_invite/zt-3uouszk3m-PtLLNyZsJVqE5Gb6gn24mA
关注 X.com:
https://x.com/ASFSeaTunnel


178712262492510eaca9d9dfb380e
1787122626091a26525f5d4ce5255
17871226277260dd435c276856ecc