在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或控制台判斷(推薦)
使用API、SDK或者控制台擷取指定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__
作為分區。
更多細節請參考使用限制。