通过LTS操作页面提交数据导入任务

云原生多模数据库 Lindorm支持通过多种方式批量快速导入数据,本文介绍在如何通过LTS操作页面提交任务。

创建任务

  1. 登录LTS操作页面,具体操作参见开通并登录LTS

  2. 在左侧导航栏,选择数据源管理 > 添加数据源,添加以下数据源。

  3. 在左侧导航栏中,选择导入Lindorm/HBase > 通用导入

    说明
    • 3.8.12.4.3版本前的LTS请选择导入Lindorm/HBase > Bulkload

    • LTS的版本可在Lindorm管理控制台实例详情页的配置信息区域查看。

  4. 单击创建任务,配置以下参数。

    配置项

    参数

    描述

    选择数据源

    源数据源

    选择添加的ODPS数据源或者HDFS数据源。

    目标数据源

    选择添加的Lindorm宽表数据源。

    文件类型(非必选)

    数据源为HDFS/OSS时需要选择读取的文件类型。

    均衡分区

    采样百分比,具体说明可参见均衡分区

    1. 点击“均衡分区”选项,开启均衡分区的能力。

    2. 在输入框中输入1-100整数数字,来表示采样百分比(推荐值:1%-5%)。

    插件配置

    Reader配置

    读插件配置可参考Reader插件配置示例

    Writer配置

    写插件配置可参考Writer插件配置示例

    作业运行参数配置

    Executor数量

    输入Executor的数量。

    任务的最大并发度等于 4 × Executor数量,请根据实际资源和负载需求谨慎配置 Executor数量。

    spark配置

    输入Spark配置,可不填写。参数可参考计算引擎作业配置说明

    spark UDF

    使用自定义的UDF。仅支持Java开发的UDF,Jar包请通过计算引擎控制台上传,可参考通过控制台上传文件

  5. 单击创建

  6. Bulkload页面单击任务名查看快速导入数据任务。

    • 单击任务名,可以查看Spark任务的UI界面。

    • 单击详情,可以查看Spark任务的执行日志。

    任务详情页

    说明

    源数据源迁移到Lindorm宽表,在Lindorm宽表中不同分区的数据分布均匀的情况下,数据容量为100 GB(压缩比为1:4)压缩后导入大概需要1个小时,根据具体情况不同可能会有区别。

查看任务运行状态

查看任务进度

  1. 点击任务名列中的链接进入详情页。

    image.png

  2. 等任务成功启动后,点击具体任务链接。

    image.png

    说明

    任务启动需要一定时间,期间任务链接可能打不开,请耐心等待。

  3. 查看任务的整体进度。

    image.png

查看任务日志

支持通过多种方式查看任务日志,包括控制台查看失败日志、完整日志文件下载、以及运行日志实时跟踪,便于您按需排查问题。

  • 当任务失败后,在任务详情中直接查看FAILED日志。

    image.png

  • 在任务详情中下载完整日志。

    image.png

  • 在任务进度页面中查看运行日志。

    image.png

均衡分区

应用场景

本功能专为批量数据导入(Bulkload)模式设计,适用于以下典型场景:

  1. 初始建表数据导入阶段
    当新建宽表首次进行数据导入时,系统默认配置的分区数量可能无法匹配海量数据分布特性。若直接导入,数据将在有限的分区中集中堆积,形成局部负载热点,导致吞吐效率下降。

  2. 非均匀数据源处理场景
    当源数据本身存在分布不均衡时,常规分区策略会使数据在特定分区堆积,引发热点任务拖慢整体进度,影响批量导入效率。

技术原理

本功能通过动态分区优化算法实现数据均衡分布,包含三阶段智能处理流程:

  1. 采样分析阶段
    系统抽取原始数据集1%-5%的样本,分析其分布特征。

  2. 分区调整阶段
    基于分析结果,系统动态调整分区策略,确保数据均匀分布。

  3. 全量导入阶段
    在完成分区动态调整后,系统对全量数据启动分布式并行导入任务。

Reader插件配置示例

MaxCompute任务配置示例

源数据源为MaxCompute,MaxCompute数据的读插件配置示例。

{
  "table": "test",
  "column": [ 
    "id",
    "intcol",
    "doublecol",
    "stringcol",
    "string1col",
    "decimalcol"
  ],
  "partition": [
     "ds=20250820,hh=12"  
  ],
  "numPartitions":10 
}

参数

描述

是否必选

默认值

table

MaxCompute表名。

column

需要导入的ODPS列名。

partition

  • 非分区表不写;

  • 分区表必须配置分区信息,且只能配置一个分区。

numPartitions

读取源表时的最大并发度,不写则系统自动计算。

读取数据需要消耗MaxCompute项目的Tunnel Slot资源,请仔细评估;若Slot资源不足,会导致任务失败。
参考文档:数据传输服务概述

Parquet文件任务配置示例

源数据源为HDFS,Parquet文件的读插件配置示例。

{
  "filePath":"parquet/",
  "column": [   //parquet文件中的列名
    "id",
    "intcol",
    "doublecol",
    "stringcol",
    "string1col",
    "decimalcol"
  ]
}

参数

描述

是否必选

默认值

filePath

数据所在的路径,有以下四种情况:

  1. 单独某个文件路径,例如:/tables/search_info/ds=20250820/part-*.parquet

  2. 单级数据目录,例如:/tables/search_info/ds=20250820,路径下面全是数据文件,没有子目录。

  3. 多级数据目录,例如:/tables/search_info/

  • 会读取:

    • 路径下的数据文件;

    • 以及所有“分区样式”的子目录(col=value 多级都可),并把这些目录名解析成分区列。

  • 不会读取:

    • 非分区样式的任意深度子目录。

  • 会忽略:

    • 名称以“.”或“_”开头的文件/目录(例如 _SUCCESS、_temporary、.DS_Store 等)。

  1. 以上多个目录或者文件的拼接,不同路径之间使用“,”分隔,例如:/tables/search_info/ds=20250820,/tables/search_info/ds=20250821

column

需要导入的列名。

basePath

指定分区数据集的根目录,通常在需要获取分区列的时候使用。

  • 例:/table/date=2025-09-01/hour=10/1.parquet, /table/date=2025-09-02/hour=11/2.parquet

  • 设置"basePath":"/table" 后,会识别出分区列 date、hour,否则通常拿不到这些分区列。

int96RebaseMode

int96时间戳解析方式,解析旧版本int96类型需设置为:"LEGACY"。

pathGlobFilter

路径过滤器,支持glob模式的文件路径过滤,例如:*.parquet,只读取parquet文件。

CSV文件任务配置示例

源数据源为HDFS,CSV文件的读插件配置示例。

重要

CSV为纯文本格式文件,配置任务时需要在"schema"中显式地声明所有字段的类型

{
  "filePath":"csv/",
  "header": false,
  "delimiter": ",",
  "schema": [
    "id|string",
    "intcol|int",
    "doublecol|double",
    "stringcol|string",
    "string1col|string",
    "decimalcol|decimal"
  ],
  "column": [
    "id",
    "intcol",
    "doublecol",
    "stringcol",
    "string1col",
    "decimalcol"
  ]
}

参数

描述

是否必选

默认值

filePath

数据所在的路径,有以下四种情况:

  1. 单独某个文件路径,例如: "/tables/search_info/ds=20250820/part-*.csv"。

  2. 单级数据目录,例如: "/tables/search_info/ds=20250820",路径下面全是数据文件,没有子目录。

  3. 多级数据目录,例如: "/tables/search_info/"。

  • 会读取:

    • 路径下的数据文件;

    • 以及所有“分区样式”的子目录(col=value 多级都可),并把这些目录名解析成分区列。

  • 不会读取:

    • 非分区样式的任意深度子目录。

  • 会忽略:

    • 名称以“.”或“_”开头的文件/目录(例如 _SUCCESS、_temporary、.DS_Store 等)。

  1. 以上多个目录或者文件的拼接,不同路径之间使用“,”分隔,例如: "/tables/search_info/ds=20250820,/tables/search_info/ds=20250821"。

schema

申明csv文件的所有列名和类型,格式为:列名|类型,例如:"id|string"。在申明时需要注意:

  1. 需要写上文件中所有的列;

  2. 顺序需与文件中字段顺序保持一致。

basePath

指定分区数据集的根目录,通常在需要获取分区列的时候使用。

  • 例:/table/date=2025-09-01/hour=10/1.parquet, /table/date=2025-09-02/hour=11/2.parquet。

  • 设置"basePath":"/table" 后,会识别出分区列 date、hour,否则通常拿不到这些分区列。

column

需要导入的列名,必须存在于上述schema申明中 。

nullValue

把字段中等于指定字符串的值识别为 null。例如CSV中经常使用 “NULL” 或 “\N” 表示空值,可设置:"nullValue":"NULL" "nullValue":"\N"

mode

异常数据处理模式。

  • PERMISSIVE:尽量解析,列数不足补 null;遇到格式问题尽可能容错,不抛异常。

  • DROPMALFORMED:丢弃解析失败或列数不匹配的行,不报错。

  • FAILFAST:遇到坏行立即抛异常,终止读取。

PERMISSIVE

timestampFormat

时间戳格式,若字段以时间戳类型解析时为必填,例如: "yyyy-MM-dd HH:mm:ss"。

dateFormat

日期格式,若字段以日期类型解析时为必填,例如:"yyyy-MM-dd"

pathGlobFilter

路径过滤器,支持glob模式的文件路径过滤,例如:*.csv,只读取csv文件。

ORC文件任务配置示例

源数据源为HDFS,ORC文件的读插件配置示例。

{
  "filePath":"orc/",
  "column": [
    "id",
    "intcol",
    "doublecol",
    "stringcol",
    "string1col",
    "decimalcol"
  ]
}

参数

描述

是否必选

默认值

filePath

数据所在的路径,有以下四种情况:

  1. 单独某个文件路径,例如:/tables/search_info/ds=20250820/part-*.orc

  2. 单级数据目录,例如:/tables/search_info/ds=20250820,路径下面全是数据文件,没有子目录。

  3. 多级数据目录,例如:/tables/search_info/

  • 会读取:

    • 路径下的数据文件;

    • 以及所有“分区样式”的子目录(col=value 多级都可),并把这些目录名解析成分区列。

  • 不会读取:

    • 非分区样式的任意深度子目录。

  • 会忽略:

    • 名称以“.”或“_”开头的文件/目录(例如 _SUCCESS、_temporary、.DS_Store 等)。

  1. 以上多个目录或者文件的拼接,不同路径之间使用“,”分隔,例如:/tables/search_info/ds=20250820,/tables/search_info/ds=20250821

column

需要导入的列名。

basePath

指定分区数据集的根目录,通常在需要获取分区列的时候使用。

  • 例:/table/date=2025-09-01/hour=10/1.parquet, /table/date=2025-09-02/hour=11/2.parquet

  • 设置"basePath":"/table" 后,会识别出分区列 date、hour,否则通常拿不到这些分区列。

pathGlobFilter

路径过滤器,支持glob模式的文件路径过滤,例如:*.orc,只读取orc文件。

数据转换配置示例

注意事项
  • 所有函数必须在reader的配置上使用,常见内置函数使用方法可参考函数说明

  • MaxCompute、Parquet、ORC、CSV均支持数据转换。

  • 支持标准的Spark SQL内建函数,参考文档:Spark SQL内建函数

  • 支持使用UDF函数,使用方式参考作业运行参数配置

{
  "column": [
    "CAST(intcol as string)",           //将整数转为字符串类型,无法转换则报错
    "TRY_CAST('abc' as INT)",           //尝试转换类型,失败返回NULL
    "COALESCE(nullable_stringcol,'')",  //若字段为NULL,则返回空字符串
    "DATE_FORMAT('2023-08-15', 'MM/dd/yyyy')", //对日期进行格式化输出
    "UNIX_MILLIS(CURRENT_TIMESTAMP())",   //获取当前毫秒级时间戳
    "CONCAT(stringcol, 'hello', ' world')",   //字符串拼接
    "SUBSTRING('Spark SQL', 7)",        //提取子串,返回:'SQL'
    "MD5(stringcol2)"                   //计算md5的值
  ]
}

Writer插件配置示例

Lindorm SQL表导入

导入Lindorm SQL表格的写插件配置示例。

{
  "namespace": "default",
  "lindormTable": "xxx",
  "compression":"zstd",
  "sortMode": "row",
  "replication":2,
  "columns": [
       "id",
       "intcol",
       "doublecol",
       "stringcol",
       "string1col",
       "decimalcol"
  ]
}

Lindorm SQL表动态列导入

导入Lindorm SQL表动态列的写插件配置示例。

重要

动态列的Schema不持久化存储,导入时必须指定列簇和对应的数据类型。

{
  "namespace": "default",
  "lindormTable": "xxx",
  "compression":"zstd",
  "sortMode": "row",
  "replication":2,
  "columns": [
       "id",
       "intcol",
       "doublecol",
       "stringcol",
       "f:dynamic_intcol||INT",
       "f:dynamic_stringcol||STRING"
  ]
}

Lindorm SQL多列簇表导入

导入Lindorm SQL多列簇表的写插件配置示例。

多列簇表包含多个列簇,其中默认列簇名为'f',同时支持添加其他自定义列簇(如'cf1'、'cf2')。

{
  "namespace": "default",
  "lindormTable": "xxx",
  "compression":"zstd",
  "sortMode": "row",
  "replication":2,
  "columns": [
       "id",
       "intcol",
       "doublecol",
       "stringcol",
       "cf1:cf1_int",
       "cf2:cf2_string"
  ]
}

Lindorm兼容HBase表格导入

Lindorm兼容HBase表格导入的写插件配置示例。

{
  "namespace": "default",
  "lindormTable": "xxx",
  "compression":"zstd",
  "sortMode": "row",
  "replication":2,
  "columns": [
    "ROW||String",    //ROW固定代表rowkey,String表示类型
    "f:intcol||Int",  //格式为列簇:列名||列类型
    "f:doublecol||Double",
    "f:stringcol||String",
    "f:string1col||String",
    "f:decimalcol||Decimal"
  ]
}

使用API模式导入Lindorm

当前Bulkload模式无法导入索引表数据,若需在导入主表数据时同步构建索引表,可使用API模式。

以下为使用API模式导入Lindorm的写插件配置示例。

重要

使用API模式导入数据时,会直接消耗Lindorm实例的资源,请务必限制导入速率,防止影响线上生产服务性能。

{
  "namespace": "default",
  "lindormTable": "xxx",
  "compression":"zstd",
  "sortMode": "row",
  "replication":2,
  "columns": [
       "id",
       "intcol",
       "doublecol",
       "stringcol",
       "string1col",
       "decimalcol"
  ],
  "writeMode":"api"  //指定为API导入模式
}

Writer配置参数详情

参数

描述

是否必选

默认值

namespace

Lindorm宽表的命名空间

lindormTable

Lindorm宽表的名称

columns

目标表的列映射配置,根据导入至目标表类型填写。

  • 如果导入Lindorm宽表,columns需要配置Lindorm SQL宽表的列名,和读配置中的column对应。

  • 如果导入HBase兼容表,columns需要配置HBase表动态列,格式为:列簇:列名||类型

compression

压缩算法,推荐使用zstd,其他可选snappy、gz、lzo,不使用压缩算法配置为none(默认值)。

none(不用压缩)

timestamp

指定时间戳导入(所有字段共用一个时间戳),不配置则默认为系统当前时间。支持以下类型:

  • Long类型:13位时间戳(如 1719472800000)

  • String类型:yyyy-MM-dd HH:mm:ss(如 2024-09-01 12:34:56)
    yyyy-MM-dd HH:mm:ss SSS(如 2024-09-01 12:34:56.789)

系统时间

timeCol

指定源数据中某一列的值为时间戳,每一行可以有不同的时间戳,默认值为-1(无时间列)。

  • timeCol表示源端时间列的下标索引,从0开始计算。

  • 时间列中的值必须为Long类型、值为13位的时间戳。

  • 默认时间列不会作为数据列导入Lindorm。

-1(无时间列)

sortMode

bulkload导入模式下的数据排序方式,支持row(行排序)和kv(键值排序)两种排序方式,默认值为kv

  • 建议列数少于1000的表采用row排序模式。

kv(键值排序)

replication

写入文件的副本数,默认值为3,推荐2副本。

3

writeMode

数据导入的方式,分为bulkloadapi两种,默认为bulkload

  • 当前bulkload模式无法导入索引表数据,若需在导入主表数据时同步构建索引表,可使用api模式。

bulkload