创建MaxCompute投递任务(新版)

更新时间:
复制 MD 格式

日志服务支持投递日志数据至MaxCompute中进行存储与分析。本文介绍如何创建MaxCompute投递任务(新版)。

前提条件

注意事项

  • MaxCompute投递支持的地域请参见支持地域

  • 对于char类型或varchar类型的字段,如果其值长度超过指定长度,那么投递到MaxCompute后,超过部分会被截断。

    例如长度限制为3,字段值为012345,则投递到MaxCompute后,值为012。

  • 对于string类型、char类型或varchar类型的字段,如果其值为空字符串,那么投递到MaxCompute后,值为Null。

  • 对于datetime类型的字段,其值格式必须为YYYY-MM-DD HH:mm:ss(DDHH之间可以存在多个空格)。字段值格式错误时,不会导致投递错误,但投递到MaxCompute后,值为Null。

  • 对于date类型的字段,其值格式错误时,不会导致投递错误,但投递到MaxCompute后,值为Null。

  • 对于decimal类型的字段,如果其值中的小数位长度超过指定长度,会被四舍五入截断;如果整数位超过指定长度,系统会将整条日志作为脏数据丢弃,并增加错误计数。

  • 投递过程中,默认丢弃脏数据。

  • 对于日志中不存在的值,投递到MaxCompute后,可能为默认值或Null。

    • 如果创建MaxCompute表时指定了默认值,那么投递到MaxCompute后,值为默认值。

    • 如果创建MaxCompute表时未指定默认值,但是允许值为Null,那么投递到MaxCompute后,值为Null。

  • 由于MaxCompute的限制,最大投递并发数为64,即最多支持64个并发同时写入MaxCompute。MaxCompute单分区的最大流量为10 MB/s。

操作步骤

  1. 登录日志服务控制台

  2. Project列表区域,单击目标Project。

  3. 日志存储 > 日志库页签中,单击目标LogStore左侧的>,选择数据处理 > 导出 > MaxCompute(原ODPS)

  4. 将鼠标悬浮在MaxCompute(原ODPS)上,单击+

  5. MaxCompute投递功能面板中,配置如下参数,然后单击确定

    重要参数说明

    参数

    说明

    任务名称

    投递任务的唯一名称。

    显示名称

    投递任务的显示名称。

    任务描述

    MaxCompute的任务描述。

    投递区域

    目标MaxCompute表所在地域。

    MaxCompute Endpoint

    MaxCompute地域对应的Endpoint

    说明

    MaxComputeEndpoint的默认折叠面板会收敛显示,您可以单击image查看具体内容。

    云产品互联 EndPoint字段中,单击右侧的下拉箭头按钮即可展开查看。

    Tunnel Endpoint

    MaxCompute地域对应的Tunnel Endpoint

    说明

    MaxComputeEndpoint的默认折叠面板会收敛显示,您可以单击image查看具体内容。

    云产品互联 EndPoint字段中,单击右侧的下拉箭头按钮即可展开查看。

    项目名

    目标MaxCompute表所在的MaxCompute项目。

    MaxCompute表名

    MaxCompute表名称。

    读日志服务授权

    授予MaxCompute投递任务读取LogStore数据的权限。

    • 默认角色:授权MaxCompute投递任务使用阿里云系统角色AliyunLogDefaultRole来读取LogStore中的数据。更多信息,请参见为默认角色授权

    • 自定义角色:授权MaxCompute投递任务使用自定义角色来读取LogStore中的数据。

      您需先授予自定义角色读取LogStore数据的权限,然后在读日志服务授权中输入您自定义角色的ARN。更多信息,请参见授权RAM角色读取LogStore数据

    MaxCompute授权

    授予MaxCompute投递任务将数据写入到MaxCompute表中的权限。

    点击自动授权

    单击授权,支持自动为RAM角色授予写入MaxCompute的权限。

    重要
    • 如果使用RAM用户进行操作,那么该RAM用户需具备MaxCompute账户操作权限。

    • 自动授权操作失败时,会提示下列四条操作命令。您可以复制该命令到MaxCompute控制台,手动完成授权。具体操作,请参见通过命令行完成授权

      USE xxxxx;
      ADD USER RAM$xxxxx:`role/xxxxx`;
      GRANT CreateInstance ON PROJECT xxxxx TO USER RAM$xxxxx:`role/xxxxx`;
      GRANT Describe, Alter, update ON TABLE xxxxx TO USER RAM$xxxxx:`role/xxxxx`;

    MaxCompute普通列

    左边输入框中填写与MaxCompute表列相映射的日志字段名称,右边为MaxCompute表的列名称。更多信息,请参见数据模型映射

    重要
    • 日志服务投递日志到MaxCompute时,按照日志字段与MaxCompute表列的顺序进行映射,修改MaxCompute表列名不影响数据投递。如果更改MaxCompute表的Schema,请重新配置日志字段与MaxCompute表列映射关系。

    • 左边输入框的日志字段,不支持双引号("")、单引号('')和含有空格的字符串。

    • 如果您的日志中存在同名字段(例如都为request_time),则日志服务会将其中一个字段名显示为request_time_0,底层存储的字段名仍为request_time。因此您在投递时,只能使用原始字段名request_time

      存在同名字段时,系统只随机投递其中一个字段的值。请尽量避免日志中使用同名字段。

    MaxCompute分区列

    左边输入框中填写与MaxCompute表分区列相映射的日志字段名称,右边为MaxCompute表分区列名称。更多信息,请参见数据模型映射

    说明
    • 分区字段不支持_extract_others___extract_others____extract_others_all__

    • 分区字段建议使用__receive_time__,避免分区过多引起的数据投递丢失。

    时间分区格式

    时间分区格式,配置示例和参数详情请参见时间分区格式

    说明
    • 仅当MaxCompute分区列中的日志字段名配置为__receive_time__或__partition_time__时,时间分区格式才生效。

    • 请勿使用精确到秒的日期格式,易导致单表的分区数目超过限制(60000个)。

    时区选择

    该时区用于格式化时间以及时间分区。更多信息,请参见时区格式

    投递模式

    支持实时投递和批投递。

    • 实时投递:即时读取LogStore中的数据,并投递到MaxCompute。

    • 批投递:读取LogStore中早于当前时间5分钟~10分钟之间的数据,并投递到MaxCompute中。

    开始时间范围

    指定MaxCompute投递任务的时间范围,此处的时间范围依赖日志的接收时间。详细说明如下:

    • 某时间开始:指定MaxCompute投递任务的开始时间,从该时间点开始数据投递,直到投递任务被手动停止。

    • 特定时间范围:指定MaxCompute投递任务的起止时间,投递任务执行到指定结束时间后自动停止。

    说明

    由于MaxComputeSlot以及QPS限制,投递历史数据极易超过MaxCompute写入阈值,故不再提供支持。

    创建投递任务后,一般情况下新建任务会在10分钟左右投递到MaxCompute,导入成功后即可在MaxCompute内查看到相关数据。更多信息,请参见日志投递MaxCompute后,如何检查数据完整性

    | log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status |
    +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+
    | 10.10.*.* | 1642942213 | | 24/Jan/2022:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2022_01_23_20_50 | 200 |
    +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+

数据模型映射

将日志服务中的日志投递到MaxCompute表中时,涉及两个服务之间的数据模型映射问题,相关注意事项与示例如下所示。

  • MaxCompute表至少包含一个数据列和一个分区列。

  • 日志服务保留字段建议使用__partition_time____source____topic__

  • 一个MaxCompute表的分区数最大值为60000个,当分区数超出最大值后无法再写入数据。

  • 系统保留字段__extract_others__有曾用名_extract_others_,可兼容使用。

  • MaxCompute分区列的值不支持配置为MaxCompute的保留字和关键字。更多信息,请参见保留字与关键字

  • MaxCompute分区表的分区不能为空。MaxCompute分区列必须要配置确定的字段(系统保留字段或日志内容的字段),旧版投递需要满足通过cast运算符将string类型字段值转换为对应分区列类型(若转换失败导致的空分区列,日志会在投递中被丢弃)。

  • 日志服务中一个日志字段只能映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。

MaxCompute数据列、分区列与日志服务字段的映射关系示例如下所示,其中日志服务保留字段详情请参见保留字段

MaxCompute列类型

列名(MaxCompute)

数据类型(MaxCompute)

日志字段名称(日志服务)

字段类型(日志服务)

字段说明

数据列

log_source

string

__source__

保留字段

日志来源。

log_time

bigint

__time__

保留字段

日志时间,Unix时间戳格式,对应数据模型中的Time域。

log_topic

string

__topic__

保留字段

日志主题。

time

string

time

日志内容字段

解析自日志,对应数据模型中的key-value。在很多时候Logtail采集的数据的__time__与time取值相同。

ip

string

ip

日志内容字段

解析自日志。

thread

string

thread

日志内容字段

解析自日志。

log_extract_others

string

__extract_others__

保留字段

未在配置中进行映射的其他日志字段会通过key-value序列化到JSON中,该JSON是一层结构,不支持字段内部JSON嵌套。

分区列

log_partition_time

string

__partition_time__

保留字段

由日志中的__time__字段对齐计算而得,分区粒度可配置。

status

string

status

日志内容字段

解析自日志,该字段取值支持枚举,保证分区数目不超过上限。

时间分区格式

MaxCompute投递(新版)支持两种分区时间格式:StrfTimeFormatSimpleDateFormat,仅当MaxCompute分区列中的字段配置为__receive_time____partition_time__时,时间分区格式才生效。

StrfTimeFormat

strftime是在UNIXC标准库中定义的用于格式化日期和时间的函数,这里用于将时间分区转换为指定格式的字符串。 它的格式化规则可以通过%字符开头的格式符号来指定,例如%Y_%m_%d表示年月日的格式。

说明

如果是您自己新建的MaxCompute任务,请务必使用StrfTimeFormat时间格式。

分区时间格式

表分区示例

%Y_%m_%d_%H_%M_00

2024_12_27_20_30_00

%Y_%m_%d_%H_%M

2024_12_27_20_30

%Y_%m_%d_%H

2024_12_27_20

%Y_%m_%d

2024_12_27

%Y_%m

2024_12

%Y

2024

%Y%m%d%H%M

202412272030

%Y%m%d%H

2024122720

%Y%m%d

20241227

%Y%m

202412

SimpleDateFormat

Java SimpleDateFormat语法的时间格式,例如yyyy-MM-dd HH:mm。时间格式的语法详情,请参见Class SimpleDateFormat

说明

SimpleDateFormat时间格式仅用于旧版迁移新版,以保证新旧版本的兼容性。如果是您自己新建的MaxCompute任务,请务必使用StrfTimeFormat时间格式。

旧版迁移任务,支持的分区格式形式如下:

分区时间格式

表分区示例

yyyy-MM-ddHH:mm

2024-12-2720-30

yyyy_MM_dd_HH_mm

2024_12_27_20_30

yyyy_MM_dd_HH

2024_12_27_20

yyyy-MM-dd HH:mm

2024-12-27 20:30

yyyyMMddHHmm

202412272030

yyyyMMddHH

2024122720

yyyyMMdd

20241227

yyyy_MM-dd_HH_mm

2024_12-27_20_30

yyyy-MM-dd

2024-12-27

参考信息

说明

推荐使用 __receive_time__ 作为分区字段。如果业务必须严格按日志时间分区,可以使用 __partition_time__作为分区字段,但需要明确接受迟到数据回写旧分区、异常时间写入未来分区以及分区完整性延迟等风险。

  • __partition_time__字段

    将日志时间作为分区字段,通过时间筛选数据是MaxCompute常见的过滤数据的方法。

    • 格式

      __partition_time__是根据日志服务中__time__字段的值计算得到的,结合时区配置以及分区时间格式,生成时间字符串。为避免触发MaxCompute单表分区数目的限制,日期分区列的值按照1800秒(半小时)对齐。

      例如:日志服务的日志时间为27/Jan/2022 20:50:13 +0800,日志服务据此计算出保留字段__time__1643287813(Unix时间戳),不同配置下的时间分区列取值如下所示。

      分区时间格式

      __partition_time__

      %Y_%m_%d_%H_%M_00

      2022_01_27_20_30_00

      %Y_%m_%d_%H_%M

      2022_01_27_20_30

      %Y%m%d

      20220127

    • 使用方法

      使用__partition_time__ 筛选数据,可以避免全表扫描。例如查询20241226日一天内日志数据,查询语句如下所示。

      select * from {ODPS_TABLE_NAME} where log_partition_time >= "2024_12_26" and log_partition_time < "2024_12_27";
  • __receive_time__字段

    将日志到达服务端的时间作为分区字段,通过时间筛选数据是MaxCompute常见的过滤数据的方法。

    • 格式

      分区时间格式

      __recetive_time__

      %Y_%m_%d_%H_%M_00

      2022_01_27_20_30_00

      %Y_%m_%d_%H_%M

      2022_01_27_20_30

      %Y%m%d

      20220127

  • __extract_others__字段和__extract_others_all__字段

    • __extract_others__字段中包含日志字段中未映射的所有字段(不包括__topic____tag__:*__source__)。

    • __extract_others_all__字段中包含日志字段中未映射的所有字段(包括__topic____tag__:*__source__)。

SDK示例

export_odps_sink_demo.py