日志服務支持投遞日志數據至MaxCompute中進行存儲與分析。本文介紹如何創建MaxCompute投遞任務(新版)。
前提條件
已創建日志服務Project、Logstore并完成日志采集。具體操作,請參見創建項目Project、創建Logstore和數據采集概述。
已在日志服務Project所在地域創建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。
操作視頻
操作步驟
登錄日志服務控制臺。
在Project列表區域,單擊目標Project。
在
頁簽中,單擊目標Logstore左側的>,選擇 。將鼠標懸浮在MaxCompute(原ODPS)上,單擊+。
在MaxCompute投遞功能面板中,配置如下參數,然后單擊確定。
參數
說明
任務名稱
投遞任務的唯一名稱。
顯示名稱
投遞任務的顯示名稱。
任務描述
MaxCompute的任務描述。
投遞區域
目標MaxCompute表所在地域。
MaxCompute Endpoint
MaxCompute地域對應的Endpoint。更多信息,請參見Endpoint
Tunnel Endpoint
MaxCompute地域對應的Tunnel Endpoint。更多信息,請參見Endpoint。
項目名
目標MaxCompute表所在的MaxCompute項目。
MaxCompute表名
MaxCompute表名稱。
讀日志服務授權
授予MaxCompute投遞任務讀取Logstore數據的權限。
默認角色:授權MaxCompute投遞任務使用阿里云系統角色AliyunLogDefaultRole來讀取Logstore中的數據。更多信息,請參見通過自定義角色讀取Logstore數據。
自定義角色:授權MaxCompute投遞任務使用自定義角色來讀取Logstore中的數據。
您需先授予自定義角色讀取Logstore數據的權限,然后在讀日志服務授權中輸入您自定義角色的ARN。更多信息,請參見通過自定義角色讀取Logstore數據。
寫MaxCompute授權
授予MaxCompute投遞任務將數據寫入到MaxCompute表中的權限。
默認角色:授權MaxCompute投遞任務使用阿里云系統角色AliyunLogDefaultRole將數據寫入到MaxCompute表中。更多信息,請參見通過默認角色寫數據到MaxCompute。
自定義角色:授權MaxCompute投遞任務使用自定義角色將數據寫入到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表的列名稱。更多信息,請參見數據模型映射。
重要日志服務投遞日志到MaxCompute時,按照日志字段與MaxCompute表列的順序進行映射,修改MaxCompute表列名不影響數據投遞。如果更改MaxCompute表的Schema,請重新配置日志字段與MaxCompute表列映射關系。
左邊輸入框的日志字段,不支持雙引號("")、單引號('')和含有空格的字符串。
如果您的日志中存在同名字段(例如都為request_time),則日志服務會將其中一個字段名顯示為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 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+
數據模型映射
將日志服務中的日志投遞到MaxCompute表中時,涉及兩個服務之間的數據模型映射問題,相關注意事項與示例如下所示。
MaxCompute表至少包含一個數據列和一個分區列。
日志服務保留字段建議使用__partition_time__、__source__、__topic__。
一個MaxCompute表的分區數最大值為60000個,當分區數超出最大值后無法再寫入數據。
系統保留字段__extract_others__有曾用名_extract_others_,可兼容使用。
MaxCompute分區列的值不支持配置為MaxCompute的保留字和關鍵字。更多信息,請參見保留字與關鍵字。
MaxCompute分區表的分區不能為空。MaxCompute分區列必須要配置確定的字段(系統保留字段或日志內容的字段),舊版投遞需要滿足通過cast運算符將string類型字段值轉換為對應分區列類型(若轉換失敗導致的空分區列,日志會在投遞中被丟棄)。
日志服務中一個日志字段只能映射到一個MaxCompute表的列(數據列或分區列),不支持字段冗余。
MaxCompute數據列、分區列與日志服務字段的映射關系示例如下所示,其中日志服務保留字段詳情請參見保留字段。
MaxCompute列類型 | 列名(MaxCompute) | 數據類型(MaxCompute) | 日志字段名稱(日志服務) | 字段類型(日志服務) | 字段說明 |
數據列 | 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__字段表示日志被日志服務接收的時間,您可通過時間分區格式設置其格式,最大精確到半小時。關于時間分區格式的說明,請參見參考信息。
如果您要投遞該字段,只能在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_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__)。