全部產品
Search
文件中心

Simple Log Service:日誌投遞MaxCompute後,如何檢查資料完整性

更新時間:Jun 30, 2024

在Log Service資料投遞MaxCompute情境下,需要在MaxCompute表分區維度上檢查資料完整性,即MaxCompute表中某個分區中資料是否已經完整。

使用保留欄位__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表示Log Service接收到資料的時間,根據該參數判斷時間為T以前的資料是否已經全部投遞到MaxCompute表。

    • 如果taskLastDataReceiveTime < T + 300s(300秒是為了容忍資料發送服務端發生錯誤重試)以前的每個投遞任務狀態都是success,說明T時刻的資料都已經入庫。
    • 如果工作清單中有ready或者running狀態任務,說明資料還不完整,需要等待任務執行結束。
    • 如果工作清單中有failed狀態任務,請查看原因並在解決後重試任務。您可以嘗試修改投遞配置,以解決投遞問題。
  • 通過MaxCompute分區粗數量級估計

    比如在MaxCompute中以半小時做一次分區,投遞任務為每30分鐘一次,當表中包含以下分區:

    2017_05_19_10_00
    2017_05_19_10_30

    當發現分區2017_05_19_11_00出現時,說明11:00之前分區資料已經完整。

    該方法不依賴API,判斷方式簡單但結果並不精確,僅用作粗數量級估計。

使用自訂日誌欄位作為表分區列,如何判斷分區資料已完整

比如日誌中有一個欄位date,取值:20170518,20170519,在配置投遞規則時將date列映射到表分區列。

這種情況下,需要考慮date欄位與寫入服務端時間差,結合使用保留欄位方法,根據接收日誌資料時間判斷。

投遞成功,但MaxCompute表資料有缺失,應如何解決

MaxCompute投遞任務狀態成功,但表中資料缺失,一般有以下原因:

  • 表分區列映射的Log Service欄位的名稱不存在。此時投遞過去的列值為null,而MaxCompute表不允許分區列值為null。
  • 表分區列映射的Log Service欄位的值包含正斜線(/)或其他特殊符號。MaxCompute將這些字元作為保留字,不允許在分區列中出現。

遇到這些情況時,投遞策略為忽略異常的日誌行,並繼續任務,在該次任務中其它分區正確的日誌行可以成功同步。

因此,在配置欄位對應不當的情況下,可能出現任務成功但是表中缺少資料的情況,請修改分區列配置。建議使用保留欄位__partition_time__作為分區。

更多細節請參考使用限制