本文介绍如何使用LTS平台的Web界面创建和管理Lindorm到OSS的全量数据导出任务。通过该功能,您可以将Lindorm数据库中的数据导出到阿里云OSS存储中,支持多种文件格式和灵活的导出配置。
前提条件
系统要求
已开通LTS引擎和计算引擎。
已开通宽表snapshot配置。如需开通,请联系LTS值班同学开启。
LTS引擎版本需升级到3.9.5 并且需要LTS同学加白开启该功能。
确保源端Lindorm和目标OSS Bucket的网络连通性正常。
权限准备
Lindorm数据源权限:在作业中配置的账号能够访问需要导出的表。
OSS权限:提供的RAM账号确保拥有目标Bucket的读写权限。
操作步骤
步骤一:数据源配置
登录Lindorm管理控制台。
在页面左上角,选择实例所属的地域。
在实例列表页,单击目标实例ID或者目标实例所在行操作列的管理。
在左侧导航栏,选实例详情,在UI 访问区域,点击 LTS进入集群管理 UI。
重要首次使用请重置密码,并将客户端 IP 添加至网络白名单。
创建数据源,分别创建Lindorm、Spark和OSS数据源(三个均需创建):
创建Lindorm宽表数据源:请参见添加Lindorm宽表数据源。
创建Spark数据源:请参见添加Spark数据源。
创建OSS数据源:请参见添加OSS数据源。
新建导出任务,在左侧导航栏中选择数据导出 > 导出任务列表,进入导出任务创建页面。
在源数据源中选择需要导出数据的Lindorm实例,从下拉列表中选择已配置的Lindorm数据源。
在目标数据源中选择需要导出的OSS数据源,从下拉列表中选择已配置的OSS数据源。
设置文件类型,可选的文件类型:
CSV:适合文本数据和通用场景。
Parquet:适合大数据分析场景,列式存储。
ORC:适合高性能查询场景。
配置OSS Bucket,指定导出文件存储的目标Bucket。
说明为确保数据能顺利导出,请确认满足以下条件:
该 Bucket 已经创建好。
当前账号拥有对该 Bucket 的写入权限。
您当前的网络环境能够正常访问该 Bucket 所在的区域。
步骤二:导出配置
导出配置提供两种方式,二选一:
如果导出整表、整集群、整库,则不需要填写导出配置中的SQL语句。此种方式不支持计算,只支持全表字段1:1导出(目前只支持非动态列的SQL表)。
如果需要使用SQL过滤语句,则不需要选择表,语句中需要使用
select xx from 数据库.表名 where xx的方式。此种方式可以自定义SQL进行数据过滤及ETL计算后导出。
选项A:表指定
使用示例:
*:导出整个Lindorm实例的所有表。test_ns:*:导出test_ns命名空间下的所有表。test_ns:user_info:仅导出user_info表。
选项B:SQL语句
禁止使用DROP、DELETE、TRUNCATE等危险语句,在SQL窗口中会做校验,此类危险语句将无法执行。
语法要求:Spark SQL。使用示例:
INSERT OVERWRITE DIRECTORY 'oss://xxx-beijing/lindorm2oss/{namespace}/{tablename}/{ts}' USING CSV SELECT * FROM {namespace}.`{tablename}`步骤三:Spark运行参数配置
执行器实例数
字段名称:Executor数量
说明:指定Spark作业的执行器实例数量 , 默认1个 Executor(4个并发同时读上游宽表)。
影响:实例数越多,并行度越高,导出速度越快,但会对源端实例有影响,建议采用默认值(1 Executor),观察源端监控调整。
Spark附加参数(可选)
用于优化Spark作业性能。默认无需填写。
步骤四:提交任务
提交前系统会自动验证以下内容:
必填字段是否完整。
数据源连接是否正常。
OSS Bucket权限是否足够。
表规范或SQL语法是否正确。
点击页面底部的创建按钮提交任务。
成功:自动跳转到任务列表页面。
失败:显示具体错误信息,需要根据提示修正配置。
任务监控与管理
在数据导出 > 导出任务列表中查看任务状态:
RUNNING:正在执行。
SUCCESS:执行成功。
FAILED:执行失败。
KILLED:被终止。
点击具体任务可以查看任务执行进度、处理的数据量、执行日志和错误信息(如有)。查看后需要数据库连接的账户名密码(可在控制台查看)。
导出文件结构
默认存储路径格式:
oss://{bucket}/lindorm2oss/{namespace}/{table}/{timestamp}/如需自定义路径,请使用SQL方式。
文件组织结构示例:
lindorm2oss/
├── namespace1/
│ ├── table1/
│ │ └── 20240101_120000/
│ │ ├── part-00000.csv
│ │ ├── part-00001.csv
│ │ └── _SUCCESS
│ └── table2/
│ └── 20240101_120000/
└── namespace2/
└── table1/
└── 20240101_120000/API提交任务
创建数据导出任务
请求:
POST /pro/proc/data-export/create
Content-Type: application/x-www-form-urlencoded参数列表:
参数名 | 类型 | 必填 | 说明 |
| String | 是 | 源数据源名称(Lindorm类型) |
| String | 是 | 目标数据源名称(OSS类型) |
| String | 是 | OSS Bucket名称 |
| String | 是 | Spark Executor实例数,必须为正整数 |
| String | 与sqlStatements二选一 | 表匹配规则 |
| String | 与tableSpec二选一 | 自定义Spark SQL语句 |
| String | 否 | 导出文件格式,可选值:csv(默认)、parquet、orc |
| String | 否 | Spark额外参数,格式: |
约束规则:
tableSpec和sqlStatements互斥,只能提供其中一个。sqlStatements中禁止包含DROP、TRUNCATE、DELETE语句。instances必须为大于0的整数。
成功响应:
{
"success": "true",
"msg": "<procId>"
}失败响应:
{
"success": "false",
"errorCode": "<错误码>",
"errorMsg": "<错误描述>"
}错误码:
错误码 | 说明 |
| 数据源不存在 |
| OSS Bucket不能为空 |
| 表规则和SQL语句互斥,请只提供其中一个 |
| 表规则和SQL语句至少需要提供一个 |
| SQL包含危险语句 |
| Spark spec值不合法 |
| instances参数不合法 |
| 服务器内部错误 |
示例:使用自定义SQL导出
curl -X POST 'http://lts-xxx-master1-001.lts.rds.aliyuncs.com:12311/pro/proc/data-export/create' \
--data-urlencode 'src=ld-xxx' \
--data-urlencode 'dst=oss-data-source' \
--data-urlencode 'fileType=csv' \
--data-urlencode 'ossBucket=xxx-oss' \
--data-urlencode 'instances=1' \
--data-urlencode 'sparkAdditionalParams=key|value' \
--data-urlencode 'sqlStatements=CREATE OR REPLACE TEMPORARY VIEW my_table_view AS SELECT * FROM lindorm_table.default.my_table;CREATE TABLE IF NOT EXISTS oss_my_table USING CSV LOCATION '\''oss://xxx-oss/lindorm2oss/default/my_table/1'\'' AS SELECT * FROM my_table_view LIMIT 0;INSERT OVERWRITE TABLE oss_my_table SELECT * FROM my_table_view;'查询运行中的导出任务
请求:
GET /pro/proc/data-export/running无需参数。
成功响应:
{
"success": "true",
"data": [
{
"procId": "proc-xxxxxxxx",
"name": "任务名称或procId",
"srcDS": "ld-xx",
"sinkDS": "oss-data-source",
"tableInfo": "default:my_table",
"startTime": "2026-03-18 14:30:00",
"runningTime": "1h 25m 30s 100ms",
"progress": "3/5",
"successCnt": 3,
"totalCnt": 5,
"state": "RUNNING"
}
]
}返回字段说明:
字段 | 类型 | 说明 |
| String | 任务唯一标识 |
| String | 任务名称,未设置时为procId |
| String | 源数据源名称 |
| String | 目标数据源名称 |
| String | 表信息:tableSpec原值、SQL中解析的源表名或"SQL自定义" |
| String | 任务创建时间 |
| String | 已运行时长(人类可读格式) |
| String | 进度,格式为"已完成数/总数" |
| int | 已完成的Job数 |
| int | 总Job数 |
| String | 任务状态(此接口固定为RUNNING) |
示例:
curl 'http://<host>:12312/pro/proc/data-export/running'返回示例:
{
"success": "true",
"data": [
{
"procId": "proc-20260318-001",
"name": "proc-20260318-001",
"srcDS": "ld-xxx",
"sinkDS": "oss-data-source",
"tableInfo": "default:my_table",
"startTime": "2026-03-18 10:00:00",
"runningTime": "4h 30m 15s 200ms",
"progress": "8/10",
"successCnt": 8,
"totalCnt": 10,
"state": "RUNNING"
}
]
}常见问题
Q:任务提交失败
A:可能原因:
数据源连接异常。
OSS权限不足。
表不存在或无访问权限。
解决方法:检查数据源连接状态,验证OSS Bucket权限,确认表名和命名空间正确。
Q:导出数据不完整
A:可能原因:
Spark资源不足导致任务中断。
数据写入过程中出现异常。
网络不稳定。
解决方法:查看资源实例,检查Spark日志定位具体错误,确保网络环境稳定。
Q:导出较慢
A:优化建议:
增加Executor实例数。
调整Spark资源配置。
考虑分批导出大量数据。
最佳实践
纯SQL表
使用SQL方式导出纯SQL表(不带动态列的SQL表):
INSERT OVERWRITE DIRECTORY 'oss://xxx-beijing/lindorm2oss/{namespace}/{tablename}/{ts}' USING CSV SELECT * FROM {namespace}.`{tablename}`提交参数:
spark.sql.lindorm.snapshot.maxSplitBytes|128m,spark.sql.ldps.lindorm.scan.snapshot.inferSchema|false,spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version|2,spark.hadoop.mapreduce.fileoutputcommitter.cleanup.skipped|false带动态列的SQL表
动态列需要手动做类型映射。动态列写入为String类型,String转为hex编码:
INSERT OVERWRITE DIRECTORY 'oss://xxx-beijing/lindorm2oss/{namespace}/{tablename}/{ts}' USING CSV SELECT p1, p2, c1, CAST(d3 AS STRING) AS d31, CAST(d5 AS STRING) AS d51, CAST(d6 AS STRING) AS d61 FROM {namespace}.`{tablename}`提交参数:
spark.sql.lindorm.snapshot.maxSplitBytes|128m,spark.sql.ldps.lindorm.scan.snapshot.inferSchema|false,spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version|2,spark.hadoop.mapreduce.fileoutputcommitter.cleanup.skipped|falseHBase-like表
INSERT OVERWRITE DIRECTORY 'oss://xxx-beijing/lindorm2oss/{namespace}/{tablename}/{ts}' USING PARQUET SELECT
to_hstring(ROW, 0, length(ROW)) AS ROW,
to_hstring(name, 0, length(name)) AS name,
to_hinteger(age, 0) AS age,
to_hlong(time, 0) AS time,
to_hshort(buycode, 0) AS buycode,
to_hfloat(price, 0) AS price,
to_hdouble(price2, 0) AS price2,
to_hboolean(isMale, 0) AS isMale
FROM {namespace}.`{tablename}`;提交参数:
spark.sql.lindorm.snapshot.maxSplitBytes|128m,spark.sql.ldps.lindorm.scan.snapshot.inferSchema|true,spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version|2,spark.hadoop.mapreduce.fileoutputcommitter.cleanup.skipped|false页面非SQL提交
HBase表、带动态列的SQL表
默认输出Base64编码后的字符串。建议使用SQL提交方式。
提交参数:
spark.sql.lindorm.snapshot.maxSplitBytes|128m,spark.sql.ldps.lindorm.scan.snapshot.inferSchema|true,spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version|2,spark.hadoop.mapreduce.fileoutputcommitter.cleanup.skipped|false纯SQL表、HType表
正常使用即可。表指定区域填写{namespace.tableName}即可。
提交参数:
spark.sql.lindorm.snapshot.maxSplitBytes|128m,spark.sql.ldps.lindorm.scan.snapshot.inferSchema|false,spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version|2,spark.hadoop.mapreduce.fileoutputcommitter.cleanup.skipped|false