日志服务采集到日志后,支持将日志投递至MaxCompute的表中进行存储与分析。本文介绍如何创建MaxCompute投递任务(新版)。

前提条件

  • 已创建Project和Logstore。具体操作,请参见创建Project和Logstore
  • 已采集日志。具体操作,请参见数据采集
  • 已在日志服务Project所在地域创建MaxCompute表。更多信息,请参见创建表

注意事项

重要 目前仅华北2(北京)、华东1(杭州)、华东2(上海)、华南1(深圳)、中国(香港)、新加坡、印度(孟买)、美国(弗吉尼亚)、美国(硅谷)和德国(法兰克福)地域支持使用MaxCompute投递(新版)。其它地域,请提交工单申请。
  • 对于char类型或varchar类型的字段,如果其值长度超过指定长度,那么投递到MaxCompute后,超过部分会被截断。

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

  • 对于string类型、char类型或varchar类型的字段,如果其值为空字符串,那么投递到MaxCompute后,值为Null。
  • 对于datetime类型的字段,其值格式必须为YYYY-MM-DD HH:mm:ss(DD和HH之间可以存在多个空格)。字段值格式错误时,不会导致投递错误,但投递到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 EndpointMaxCompute地域对应的Endpoint。更多信息,请参见Endpoint
    Tunnel EndpointMaxCompute地域对应的Tunnel Endpoint。更多信息,请参见Endpoint
    项目名目标MaxCompute表所在的MaxCompute项目。
    MaxCompute表名MaxCompute表名称。
    读日志服务授权授予MaxCompute投递任务读取Logstore数据的权限。
    • 默认角色:授权MaxCompute投递任务使用阿里云系统角色AliyunLogDefaultRole来读取Logstore中的数据。更多信息,请参见通过默认角色读取Logstore数据
    • 自定义角色:授权MaxCompute投递任务使用自定义角色来读取Logstore中的数据。

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

    写入授权方式您可以通过RAM用户的AccessKey或RAM角色,完成写MaxCompute的授权。
    说明 选择RAM角色时,支持自动授权。即您可以直接在写MaxCompute授权中输入RAM角色ARN,然后单击下方的授权
    写MaxCompute授权授予MaxCompute投递任务将数据写入到MaxCompute表中的权限。
    • 默认角色:授权MaxCompute投递任务使用阿里云系统角色AliyunLogDefaultRole将数据写入到MaxCompute表中。更多信息,请参见通过默认角色写数据到MaxCompute
    • 自定义角色:授权MaxCompute投递任务使用自定义角色将数据写入到MaxCompute表中。
      您需先授予自定义角色将数据写入到MaxCompute表中的权限,然后在写MaxCompute授权中输入您自定义角色的ARN。
      • 如果日志服务和MaxCompute属于同一阿里云账号,请参见同账号投递
      • 如果日志服务和MaxCompute属于不同的阿里云账号,请参见跨账号投递
    • RAM用户的AccessKey:授权MaxCompute投递任务使用RAM用户将数据写入到MaxCompute表中。更多信息,请参见通过RAM用户写数据到MaxCompute
    点击自动授权单击授权,支持自动为RAM角色授予写入MaxCompute的权限。
    重要
    • 如果使用RAM用户进行操作,那么该RAM用户需具备MaxCompute账户操作权限。
    • 自动授权操作失败时,会提示下列三条操作命令。您可以复制该命令到MaxCompute控制台,手动完成授权。具体操作,请参见通过命令行完成授权
      USE xxxxx;
      ADD 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表分区列名称。更多信息,请参见数据模型映射
    说明
    • 最大配置3个分区列,请谨慎选择自定义字段作为分区列,保证一次投递任务中生成的分区数目小于512个,否则会导致投递任务写数据到MaxCompute表失败,整批数据无法投递。
    • 分区字段不支持extract_othersextract_others_all
    时间分区格式时间分区格式,配置示例和参数详细请参见参考信息Java SimpleDateFormat
    说明
    • 仅当MaxCompute分区列中的字段配置为__partition_time__时,时间分区格式才生效。
    • 请勿使用精确到秒的日期格式,易导致单表的分区数目超过限制(60000个)。
    时区选择该时区用于格式化时间以及时间分区。更多信息,请参见时区列表
    投递模式支持实时投递和批投递。
    • 实时投递:即时读取Logstore中的数据,并投递到MaxCompute。
    • 批投递:读取Logstore中早于当前时间5分钟~10分钟之间的数据,并投递到MaxCompute中。

    更多信息,请参见投递模式说明

    开始时间范围投递任务从该时间开始拉取Logstore中的数据。
    创建投递任务后,一般情况下日志数据会在写入Logstore后的1个小时导入到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分区列取值不支持配置为空,所以映射到分区列的字段必须为保留字段或日志字段,且可以通过cast运算符将string类型字段值转换为对应分区列类型,空分区列的日志会在投递中被丢弃。
  • 日志服务中一个日志字段只能映射到一个MaxCompute表的列(数据列或分区列),不支持字段冗余。
MaxCompute数据列、分区列与日志服务字段的映射关系示例如下所示,其中日志服务保留字段详情请参见保留字段
MaxCompute列类型列名(MaxCompute)数据类型(MaxCompute)日志字段名称(日志服务)字段类型(日志服务)字段说明
数据列log_sourcestring__source__保留字段日志来源。
log_timebigint__time__保留字段日志时间,Unix时间戳格式,对应数据模型中的Time域。
log_topicstring__topic__保留字段日志主题。
timestringtime日志内容字段解析自日志,对应数据模型中的key-value。在很多时候Logtail采集的数据的__time__与time取值相同。
ipstringip日志内容字段解析自日志。
threadstringthread日志内容字段解析自日志。
log_extract_othersstring__extract_others__保留字段未在配置中进行映射的其他日志字段会通过key-value序列化到JSON中,该JSON是一层结构,不支持字段内部JSON嵌套。
分区列log_partition_timestring__partition_time__保留字段由日志中的__time__字段对齐计算而得,分区粒度可配置。
statusstringstatus日志内容字段解析自日志,该字段取值支持枚举,保证分区数目不超过上限。

投递模式说明

目前,MaxCompute投递(新版)支持实时投递和批投递两种模式。
  • 实时投递:即时读取Logstore中的数据,投递到MaxCompute。
  • 批投递:读取Logstore中早于当前时间5分钟~10分钟之间的数据,并投递到MaxCompute中。
    设置投递模式批投递后,如果您要设置开始时间范围中的起始时间结束时间,则必须按照5分钟对齐。例如2022-05-24 16:35:00是正确设置,2022-05-24 16:36:00为非法设置。MaxCompute投递模式
    另外,批投递支持投递__unique_id__字段和__receive_time__字段。
    • __unique_id__字段值为一个64位的字符串,用于唯一标识一条日志。

      如果您要投递该字段,只能在MaxCompute普通列中添加该字段。

    • __receive_time__字段表示日志被日志服务接收的时间,您可通过时间分区格式设置其格式,最大精确到半小时。关于时间分区格式的说明,请参见参考信息

      如果您要投递该字段,只能在MaxCompute分区列中添加该字段。

参考信息

  • __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_002022_01_27_20_30_00
      %Y_%m_%d_%H_%M2022_01_27_20_30
      %Y%m%d20220127
    • 使用方法
      使用__partition_time__ 筛选数据,可以避免全表扫描。例如查询2022年1月26日一天内日志数据,查询语句如下所示。
      select * from {ODPS_TABLE_NAME} where log_partition_time >= "2022_01_26" and log_partition_time < "2022_01_27";
  • __extract_others__字段和__extract_others_all__字段
    • __extract_others__字段中包含日志字段中未映射的所有字段(不包括__topic____tag__:*__source__)。
    • __extract_others_all__字段中包含日志字段中未映射的所有字段(包括__topic____tag__:*__source__)。

SDK示例

export_odps_sink_demo.py