全量导出至OSS

更新时间:
复制 MD 格式

本文介绍如何使用LTS平台的Web界面创建和管理Lindorm到OSS的全量数据导出任务。通过该功能,您可以将Lindorm数据库中的数据导出到阿里云OSS存储中,支持多种文件格式和灵活的导出配置。

前提条件

系统要求

  • 已开通LTS引擎和计算引擎。

  • 已开通宽表snapshot配置。如需开通,请联系LTS值班同学开启。

  • LTS引擎版本需升级到3.9.5 并且需要LTS同学加白开启该功能。

  • 确保源端Lindorm和目标OSS Bucket的网络连通性正常。

权限准备

  • Lindorm数据源权限:在作业中配置的账号能够访问需要导出的表。

  • OSS权限:提供的RAM账号确保拥有目标Bucket的读写权限。

操作步骤

步骤一:数据源配置

  1. 登录Lindorm管理控制台。

  2. 在页面左上角,选择实例所属的地域。

  3. 在实例列表页,单击目标实例ID或者目标实例所在行操作列的管理。

  4. 在左侧导航栏,选实例详情,在UI 访问区域,点击 LTS进入集群管理 UI。

    重要

    首次使用请重置密码,并将客户端 IP 添加至网络白名单。

  5. 创建数据源,分别创建Lindorm、Spark和OSS数据源(三个均需创建):

  6. 新建导出任务,在左侧导航栏中选择数据导出 > 导出任务列表,进入导出任务创建页面。

    • 在源数据源中选择需要导出数据的Lindorm实例,从下拉列表中选择已配置的Lindorm数据源。

    • 在目标数据源中选择需要导出的OSS数据源,从下拉列表中选择已配置的OSS数据源。

  7. 设置文件类型,可选的文件类型:

    • CSV:适合文本数据和通用场景。

    • Parquet:适合大数据分析场景,列式存储。

    • ORC:适合高性能查询场景。

  8. 配置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

参数列表:

参数名

类型

必填

说明

src

String

是

源数据源名称(Lindorm类型)

dst

String

是

目标数据源名称(OSS类型)

ossBucket

String

是

OSS Bucket名称

instances

String

是

Spark Executor实例数,必须为正整数

tableSpec

String

与sqlStatements二选一

表匹配规则

sqlStatements

String

与tableSpec二选一

自定义Spark SQL语句

fileType

String

否

导出文件格式,可选值:csv(默认)、parquet、orc

sparkAdditionalParams

String

否

Spark额外参数,格式:key1|value1,key2|value2

约束规则:

  • tableSpec和sqlStatements互斥,只能提供其中一个。

  • sqlStatements中禁止包含DROP、TRUNCATE、DELETE语句。

  • instances必须为大于0的整数。

成功响应:

{
  "success": "true",
  "msg": "<procId>"
}

失败响应:

{
  "success": "false",
  "errorCode": "<错误码>",
  "errorMsg": "<错误描述>"
}

错误码:

错误码

说明

API-DS-000

数据源不存在

API-EXPORT-001

OSS Bucket不能为空

API-EXPORT-002

表规则和SQL语句互斥,请只提供其中一个

API-EXPORT-003

表规则和SQL语句至少需要提供一个

API-EXPORT-004

SQL包含危险语句

API-BULKLOAD-009

Spark spec值不合法

API-BULKLOAD-011

instances参数不合法

API-100

服务器内部错误

示例:使用自定义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"
    }
  ]
}

返回字段说明:

字段

类型

说明

procId

String

任务唯一标识

name

String

任务名称,未设置时为procId

srcDS

String

源数据源名称

sinkDS

String

目标数据源名称

tableInfo

String

表信息:tableSpec原值、SQL中解析的源表名或"SQL自定义"

startTime

String

任务创建时间

runningTime

String

已运行时长(人类可读格式)

progress

String

进度,格式为"已完成数/总数"

successCnt

int

已完成的Job数

totalCnt

int

总Job数

state

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|false

HBase-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