本文为您介绍MaxCompute Writer支持的数据类型、字段映射和数据源等参数及配置示例。

前提条件

开始配置MaxCompute Writer插件前,请首先配置好数据源,详情请参见配置MaxCompute数据源

背景信息

MaxCompute Writer插件用于实现向MaxCompute中插入或更新数据,主要适用于开发者将业务数据导入MaxCompute,适合于TB、GB等数量级的数据传输。MaxCompute的详情请参见什么是MaxCompute

在底层实现上,您可以根据配置的源头项目、表、分区、字段等信息,通过Tunnel写入数据至MaxCompute。常用的Tunnel命令请参见Tunnel命令

对于MySQL、MaxCompute等强Schema类型的存储,数据集成会逐步读取源数据至内存中,并根据目的端数据源的类型,将源头数据转换为目的端对应的格式,写入目的端存储。

如果数据转换失败,或数据写出至目的端数据源失败,则将数据作为脏数据,您可以配合脏数据限制阈值使用。
说明 当数据有null值时,MaxCompute Writer不支持VARCHAR类型。

支持的字段类型

支持MaxCompute的1.0数据类型、2.0数据类型、Hive兼容数据类型。不同数据类型版本支持的字段类型详情如下。

1.0数据类型支持的字段

字段类型 离线读 离线写 实时写
BIGINT 支持 支持 支持
DOUBLE 支持 支持 支持
DECIMAL 支持 支持 支持
STRING 支持 支持 支持
DATETIME 支持 支持 支持
BOOLEAN 支持 支持 支持
ARRAY 支持 支持 支持
MAP 支持 支持 支持
STRUCT 支持 支持 支持

2.0数据类型、Hive兼容数据类型支持的字段

字段类型 离线读(MaxCompute Reader) 离线写(MaxCompute Writer) 实时写
TINYINT 支持 支持 支持
SMALLINT 支持 支持 支持
INT 支持 支持 支持
BIGINT 支持 支持 支持
BINARY 支持 支持 支持
FLOAT 支持 支持 支持
DOUBLE 支持 支持 支持
DECIMAL(pecision,scale) 支持 支持 支持
VARCHAR(n) 支持 支持 支持
CHAR(n) 不支持 支持 支持
STRING 支持 支持 支持
DATE 支持 支持 支持
DATETIME 支持 支持 支持
TIMESTAMP 支持 支持 支持
BOOLEAN 支持 支持 支持
ARRAY 支持 支持 支持
MAP 支持 支持 支持
STRUCT 支持 支持 支持

参数说明

参数 描述 是否必选 默认值
datasource 数据源名称,脚本模式支持添加数据源,该配置项填写的内容必须与添加的数据源名称保持一致。
table 写入的数据表的表名称(大小写不敏感),不支持填写多张表。
partition 需要写入数据表的分区信息,必须指定到最后一级分区。例如把数据写入一个三级分区表,必须配置到最后一级分区,例如pt=20150101, type=1, biz=2
  • 对于非分区表,该值务必不要填写,表示直接导入至目标表。
  • MaxCompute Writer不支持数据路由写入,对于分区表请务必保证写入数据到最后一级分区。
如果表为分区表,则必填。如果表为非分区表,则不能填写。
column 需要导入的字段列表。当导入全部字段时,可以配置为"column": ["*"]。当需要插入部分MaxCompute列,则填写部分列,例如"column": ["id","name"]
  • MaxCompute Writer支持列筛选、列换序。例如一张表中有a、b和c三个字段,您只同步c和b两个字段,则可以配置为"column": ["c","b"],在导入过程中,字段a自动补空,设置为null。
  • column必须显示指定同步的列集合,不允许为空。
truncate 通过配置"truncate": "true"保证写入的幂等性。即当出现写入失败再次运行时,MaxCompute Writer将清理前述数据,并导入新数据,可以保证每次重跑之后的数据都保持一致 。

因为利用MaxCompute SQL进行数据清理工作,SQL无法保证原子性,所以truncate选项不是原子操作。当多个任务同时向一个TablePartition清理分区时,可能出现并发时序问题,请务必注意。

针对该类问题,建议您尽量不要多个作业DDL同时操作同一个分区,或者在多个并发作业启动前,提前创建分区。

向导开发介绍

  1. 选择数据源。
    配置同步任务的数据来源数据去向odps写
    参数 描述
    数据源 即上述参数说明中的datasource,通常填写您配置的数据源名称。
    即上述参数说明中的table。如果为分区表,需要配置写入的分区,分区配置可结合调度参数使用,调度参数使用功能详情可参考文档:调度参数概述
    清理规则 清理规则包括:
    • 写入前清理已有数据:导数据之前,清空表或者分区的所有数据,相当于insert overwrite
    • 写入前保留已有数据:导数据之前,不清理任何数据,每次运行数据均为追加的数据,相当于insert into
    说明
    • MaxCompute通过Tunnel服务读取数据,同步任务本身不支持数据过滤,需要读取某一个表或分区内的数据。
    • MaxCompute通过Tunnel服务写出数据,未使用MaxCompute的Insert SQL语句写出数据。数据同步任务执行成功后,完整数据才可以对表可见。请注意配置任务的依赖关系。
    空字符串作为null 设置是否允许空字符串作为null。
    同步完成才可见 从数据写入开始到数据写入完成是一完整过程。您可以选择是否开启同步完成可见。
    说明 开启了分布式处理能力的任务,该功能的配置将不生效。
    • 当选择:仅当同步任务执行完成,新同步到MaxCompute的数据才能被查询到。
      说明 同步完成可见可支持的最大数据量为1TB,当数据存在严重倾斜时无法保证达到此同步上限。
    • 当选择:同步任务运行过程中,即有部分新同步到MaxCompute的数据可以被查询到。
    说明 分区自动创建、数据清理动作为数据同步的前置操作,不包含在此写入过程中,因此无论是否开启同步完成可见,您都可能在同步任务运行过程中看到自动创建的分区,或已经完成数据清理的表或分区。我们不建议您使用分区是否存在、数据条数是否为0作为数据同步任务完成的依据。如果希望判断同步任务是否结束,建议使用调度依赖为同步任务添加下游依赖的MaxCompute SQL节点,节点中创建特定的MaxCompute表或分区,您可以根据特定的表或分区是否存在来判断同步任务是否完成。
  2. 字段映射,即上述参数说明中的column。左侧的源头表字段和右侧的目标表字段为一一对应的关系。字段映射
    参数 描述
    同名映射 单击同名映射,可以根据名称建立相应的映射关系,请注意匹配数据类型。
    同行映射 单击同行映射,可以在同行建立相应的映射关系,请注意匹配数据类型。
    取消映射 单击取消映射,可以取消建立的映射关系。
    自动排版 可以根据相应的规律自动排版。
  3. 通道控制。通道配置
    参数 描述
    任务期望最大并发数 数据同步任务内,可以从源并行读取或并行写入数据存储端的最大线程数。向导模式通过界面化配置并发数,指定任务所使用的并行度。
    同步速率 设置同步速率可以保护读取端数据库,以避免抽取速度过大,给源库造成太大的压力。同步速率建议限流,结合源库的配置,请合理配置抽取速率。
    错误记录数 错误记录数,表示脏数据的最大容忍条数。
    分布式处理能力

    数据同步时,可以将任务切片分散到多台执行节点上并发执行,提高同步速率。该模式下,配置较大任务并发数会增加数据存储访问压力,如需使用该功能,请提前评估数据存储的访问负载。该功能仅支持在独享数据集成资源组配置,详情请参见独享数据集成资源组新增和使用独享数据集成资源组

脚本开发介绍

使用脚本模式开发的详情请参见通过脚本模式配置离线同步任务

脚本配置样例如下,详情请参见上述参数说明。
{
    "type":"job",
    "version":"2.0",//版本号。
    "steps":[
        {
            "stepType":"stream",
            "parameter":{},
            "name":"Reader",
            "category":"reader"
        },
        {
            "stepType":"odps",//插件名。
            "parameter":{
                "partition":"",//分区信息。
                "truncate":true,//清理规则。
                "compress":false,//是否压缩。
                "datasource":"odps_first",//数据源名。
            "column": [//源端列名。
                "id",
                "name",
                "age",
                "sex",
                "salary",
                "interest"
                ],
                "emptyAsNull":false,//空字符串是否作为null。
                "table":""//表名。
            },
            "name":"Writer",
            "category":"writer"
        }
    ],
    "setting":{
        "errorLimit":{
            "record":"0"//错误记录数,表示脏数据的最大容忍条数。
        },
        "speed":{
            "throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
            "concurrent":1, //作业并发数。
            "mbps":"12"//限流
        }
    },
    "order":{
        "hops":[
            {
                "from":"Reader",
                "to":"Writer"
            }
        ]
    }
}
如果您需要指定MaxCompute的Tunnel Endpoint,可以通过脚本模式手动配置数据源:将上述示例中的"datasource":"",替换为数据源的具体参数,示例如下。
"accessId":"<yourAccessKeyId>",
 "accessKey":"<yourAccessKeySecret>",
 "endpoint":"http://service.eu-central-1.maxcompute.aliyun-inc.com/api",
 "odpsServer":"http://service.eu-central-1.maxcompute.aliyun-inc.com/api", 
"tunnelServer":"http://dt.eu-central-1.maxcompute.aliyun.com", 
"project":"**********", 

补充说明

  • 关于列筛选的问题

    通过配置MaxCompute Writer,可以实现MaxCompute本身不支持的列筛选、重排序和补空等操作。例如需要导入的字段列表,当导入全部字段时,可以配置为"column": ["*"]

    MaxCompute表有a、b和c三个字段,您只同步c和b两个字段,可以将列配置为"column": ["c","b"],表示会把Reader的第一列和第二列导入MaxCompute的c字段和b字段,而MaxCompute表中新插入的a字段会被置为null。

  • 列配置错误的处理

    为保证写入数据的可靠性,避免多余列数据丢失造成数据质量故障。对于写入多余的列,MaxCompute Writer将报错。例如MaxCompute表字段为a、b和c,如果MaxCompute Writer写入的字段多于三列,MaxCompute Writer将报错。

  • 分区配置注意事项

    MaxCompute Writer仅提供写入到最后一级分区的功能,不支持写入按照某个字段进行分区路由等功能。假设表一共有三级分区,在分区配置中必须指明写入至某个三级分区。例如,写入数据至一个表的第三级分区,可以配置为pt=20150101, type=1, biz=2,但不能配置为pt=20150101, type=1或者pt=20150101

  • 任务重跑和failover
    MaxCompute Writer通过配置"truncate": true,保证写入的幂等性。即当出现写入失败再次运行时,MaxCompute Writer将清理前述数据,并导入新数据,以保证每次重跑之后的数据都保持一致。如果在运行过程中,因为其它的异常导致任务中断,便不能保证数据的原子性,数据不会回滚也不会自动重跑,需要您利用幂等性的特点进行重跑,以确保数据的完整性。
    说明 truncate为true的情况下,会将指定分区或表的数据全部清理,请谨慎使用。