全部產品
Search
文件中心

Simple Log Service:建立MaxCompute投遞任務(新版)

更新時間:Dec 07, 2024

Log Service支援投遞日誌資料至MaxCompute中進行儲存與分析。本文介紹如何建立MaxCompute投遞任務(新版)。

前提條件

注意事項

重要

目前僅華北2(北京)、華北3(張家口)、華東1(杭州)、華東2(上海)、華東2金融雲(上海)、華南1(深圳)、華南1金融雲(深圳)、西南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. 登入Log Service控制台

  2. 在Project列表地區,單擊目標Project。

  3. 日誌儲存 > 日誌庫頁簽中,單擊目標Logstore左側的>,選擇資料處理 > 匯出 > MaxCompute(原ODPS)

  4. 將滑鼠懸浮在MaxCompute(原ODPS)上,單擊+

  5. MaxCompute投遞功能面板中,配置如下參數,然後單擊確定

    重要參數說明

    參數

    說明

    任務名稱

    投遞任務的唯一名稱。

    顯示名稱

    投遞任務的顯示名稱。

    任務描述

    MaxCompute的任務描述。

    投遞地區

    目標MaxCompute表所在地區。

    MaxCompute Endpoint

    MaxCompute地區對應的Endpoint。更多資訊,請參見Endpoint

    Tunnel Endpoint

    MaxCompute地區對應的Tunnel Endpoint。更多資訊,請參見Endpoint

    專案名

    目標MaxCompute表所在的MaxCompute專案。

    MaxCompute表名

    MaxCompute表名稱。

    讀Log Service授權

    授予MaxCompute投遞任務讀取Logstore資料的許可權。

    • 預設角色:授權MaxCompute投遞任務使用阿里雲系統角色AliyunLogDefaultRole來讀取Logstore中的資料。更多資訊,請參見為預設角色授權

    • 自訂角色:授權MaxCompute投遞任務使用自訂角色來讀取Logstore中的資料。

      您需先授予自訂角色讀取Logstore資料的許可權,然後在讀Log Service授權中輸入您自訂角色的ARN。更多資訊,請參見授權RAM角色讀取Logstore資料

    寫MaxCompute授權

    授予MaxCompute投遞任務將資料寫入到MaxCompute表中的許可權。

    • 預設角色:授權MaxCompute投遞任務使用阿里雲系統角色AliyunLogDefaultRole將資料寫入到MaxCompute表中。更多資訊,請參見授權預設角色寫資料到MaxCompute

    • 自訂角色:授權MaxCompute投遞任務使用自訂角色將資料寫入到MaxCompute表中。

      您需先授予自訂角色將資料寫入到MaxCompute表中的許可權,然後在寫MaxCompute授權中輸入您自訂角色的ARN。

      • 如果Log Service和MaxCompute屬於同一阿里雲帳號,請參見同帳號投遞

      • 如果Log Service和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表的列名稱。更多資訊,請參見資料模型映射

    重要
    • Log Service投遞日誌到MaxCompute時,按照日誌欄位與MaxCompute表列的順序進行映射,修改MaxCompute表列名不影響資料投遞。如果更改MaxCompute表的Schema,請重新設定日誌欄位與MaxCompute表列映射關係。

    • 左邊輸入框的日誌欄位,不支援雙引號("")、單引號('')和含有空格的字串。

    • 如果您的日誌中存在同名欄位(例如都為request_time),則Log Service會將其中一個欄位名顯示為request_time_0,底層儲存的欄位名仍為request_time。因此您在投遞時,只能使用原始欄位名request_time

      存在同名欄位時,系統只隨機投遞其中一個欄位的值。請盡量避免日誌中使用同名欄位。

    MaxCompute分區列

    左邊輸入框中填寫與MaxCompute表分區列相映射的日誌欄位名稱,右邊為MaxCompute表分區列名稱。更多資訊,請參見資料模型映射

    說明
    • 分區欄位不支援_extract_others___extract_others____extract_others_all__

    時間分區格式

    時間分區格式,配置樣本和參數詳情請參見參考資訊

    說明
    • 僅當MaxCompute分區列中的欄位配置為__partition_time__時,時間分區格式才生效。

    • 請勿使用精確到秒的日期格式,易導致單表的分區數目超過限制(60000個)。

    時區選擇

    該時區用于格式化時間以及時間分區。更多資訊,請參見時區列表

    投遞模式

    支援即時投遞和批投遞。

    • 即時投遞:即時讀取Logstore中的資料,並投遞到MaxCompute。

    • 批投遞:讀取Logstore中早於目前時間5分鐘~10分鐘之間的資料,並投遞到MaxCompute中。

    更多資訊,請參見投遞模式說明

    開始時間範圍

    指定MaxCompute投遞任務的時間範圍,此處的時間範圍依賴日誌的接收時間。詳細說明如下:

    • 所有:從Logstore接收到第一條日誌的時間點開始資料投遞,直到投遞任務被手動停止。

    • 某時間開始:指定MaxCompute投遞任務的開始時間,從該時間點開始資料投遞,直到投遞任務被手動停止。

    • 特定時間範圍:指定MaxCompute投遞任務的起止時間,投遞任務執行到指定結束時間後自動停止。

    建立投遞任務後,一般情況下日誌資料會在寫入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 |
    +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+

資料模型映射

將Log Service中的日誌投遞到MaxCompute表中時,涉及兩個服務之間的資料模型映射問題,相關注意事項與樣本如下所示。

  • MaxCompute表至少包含一個資料列和一個分區列。

  • Log Service保留欄位建議使用__partition_time____source____topic__

  • 一個MaxCompute表的分區數最大值為60000個,當分區數超出最大值後無法再寫入資料。

  • 系統保留欄位__extract_others__有曾用名_extract_others_,可相容使用。

  • MaxCompute分區列的值不支援配置為MaxCompute的保留字和關鍵字。更多資訊,請參見保留字與關鍵字

  • MaxCompute分區表的分區不可為空。MaxCompute分區列必須要配置確定的欄位(系統保留欄位或日誌內容的欄位),舊版投遞需要滿足通過cast運算子將string類型欄位值轉換為對應分區列類型(若轉換失敗導致的空分區列,日誌會在投遞中被丟棄)。

  • Log Service中一個日誌欄位只能映射到一個MaxCompute表的列(資料列或分區列),不支援欄位冗餘。

MaxCompute資料列、分區列與Log Service欄位的映射關係樣本如下所示,其中Log Service保留欄位詳情請參見保留欄位

MaxCompute列類型

列名(MaxCompute)

資料類型(MaxCompute)

日誌欄位名稱(Log Service)

欄位類型(Log Service)

欄位說明

資料列

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投遞(新版)支援即時投遞和批投遞兩種模式。

  • 即時投遞:即時讀取Logstore中的資料,投遞到MaxCompute。

  • 批投遞:讀取Logstore中早於目前時間5分鐘~10分鐘之間的資料,並投遞到MaxCompute中。

    設定投遞模式批投遞後,如果您要設定開始時間範圍中的起始時間結束時間,則必須按照5分鐘對齊。例如2022-05-24 16:35:00是正確設定,2022-05-24 16:36:00為非法設定。

    另外,批投遞支援投遞__receive_time__欄位。__receive_time__欄位表示日誌被Log Service接收的時間,您可通過時間分區格式設定其格式,最大精確到半小時。關於時間分區格式的說明,請參見參考資訊

    如果您要投遞該欄位,只能在MaxCompute分區列中添加該欄位。

參考資訊

  • __partition_time__欄位

    將日誌時間作為分區欄位,通過時間篩選資料是MaxCompute常見的過濾資料的方法。

    • 格式

      __partition_time__是根據Log Service中__time__欄位的值計算得到的,結合時區配置以及分區時間格式,產生時間字串。為避免觸發MaxCompute單表分區數目的限制,日期分區列的值按照1800秒(半小時)對齊。

      例如:Log Service的日誌時間為27/Jan/2022 20:50:13 +0800,Log Service據此計算出保留欄位__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__ 篩選資料,可以避免全表掃描。例如查詢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