全部产品

日志服务数据投递MaxCompute后如何检查数据完整性

概述

在日志服务数据投递MaxCompute场景下,需要在MaxCompute表分区维度上检查数据完整性。

详细信息

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

使用__partition_time__保留字段作表分区列

__partition_time__由日志的time字段计算得到,由日志真实时间按照时间格式字符串向下取整。其中,日志真实时间既不是投递数据的时间,也不是日志写入服务端时间。例如:日志真实时间为2017-05-19 10:43:00,分区字段格式字符串配置为yyyy_MM_dd_HH_mm,每1小时投递一次数据。那么无论该日志是什么时刻写入服务端,这条日志都会存入MaxCompute的2017_05_19_10_00分区,详细信息参见MaxCompute投递字段说明

如果不考虑写入历史数据等问题,在日志实时写入的情况下,有以下两种方法判断分区数据是否已完整。

  • 通过控制台、API或SDK检查(推荐)
    使用控制台、APISDK获取指定Project或Logstore投递任务列表。例如通过API返回任务列表如下,在控制台中会对该返回结果进行可视化展示。
    {
      "count" : 10,
      "total" : 20,
      "statistics" : {
          "running" : 0,
          "success" : 20,
          "fail" : 0 
      }
      "tasks" : [
          ...
          {
              "id" : "abcdefghijk",
              "taskStatus" : "success",
              "taskMessage" : "",
              "taskCreateTime" : 1448925013,
              "taskLastDataReceiveTime" : 1448915013,
              "taskFinishTime" : 1448926013
          },
          {
              "id" : "xfegeagege",
              "taskStatus" : "success",
              "taskMessage" : "",
              "taskCreateTime" : 1448926813,
              "taskLastDataReceiveTime" : 1448930000,
              "taskFinishTime" : 1448936910
          }
      ]
    }
    taskLastDataReceiveTime表示该批任务中最后一条日志到达服务端时机器的系统时间,控制台对应的是接收日志数据时间,根据该参数可以判断时间为T以前的数据是否全部投递到MaxCompute表:
    • 如果taskLastDataReceiveTime值小于T加300s之前的每个投递任务状态都是success,说明T时刻的数据都已经入库。
      说明:加上300s是为了排除数据发送服务端发生错误重试的影响。
    • 如果任务列表中有ready或running状态任务,说明数据还不完整,需要等待任务执行结束。
    • 如果任务列表中有failed状态任务,请查看原因并在解决后重试任务。您可以尝试修改投递配置,以解决投递问题。
  • 通过MaxCompute分区粗略估计
    若MaxCompute每半小时做一次分区,投递任务为每30分钟一次,当表中出现以下分区后,又出现2017_05_19_11_00分区,说明11:00之前的分区数据已经完整。
    说明:该方法不依赖API,判断方式简单但结果并不精确,仅用于粗略判断。
    2017_05_19_10_00
    2017_05_19_10_30

使用自定义日志字段作为表分区列

若日志中存在一个date字段,取值为20170518、20170519,在配置投递规则时,需要将date列映射到表分区列。这种情况下,需要考虑date字段与写入服务端的时间差,参见使用__partition_time__保留字段作表分区列方法,根据接收日志数据时间进行判断。

更多信息

若日志数据投递成功后,MaxCompute表数据有缺失,常见的问题原因如下所示:

  • 表分区列映射的日志服务字段的名称不存在
    日志服务投递过去的列值为null,而MaxCompute表不允许分区列值为null。
  • 表分区列映射的日志服务字段的值包含/等特殊符号
    MaxCompute将这些字符作为保留字段,不允许在分区列中出现。

遇到这些情况时,投递策略会忽略异常的日志行,并继续任务,在该批次任务中其它分区正确的日志可以成功同步。因此,在配置字段映射不当的情况下,可能会出现任务成功但是表中缺少数据的情况。建议您修改分区列配置,使用__partition_time__保留字段作为分区。

适用于

  • 日志服务