建立MaxCompute投遞任務(新版)
Log Service支援投遞日誌資料至MaxCompute中進行儲存與分析。本文介紹如何建立MaxCompute投遞任務(新版)。
前提條件
-
已建立Log ServiceProject、LogStore並完成日誌採集。具體操作,請參見管理Project、建立基礎LogStore和資料擷取概述。
-
已在Log ServiceProject所在地區建立MaxCompute分區表。更多資訊,請參見建立表。
注意事項
-
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投遞功能面板中,配置如下參數,然後單擊確定。
建立投遞任務後,一般情況下日誌資料會在寫入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投遞(新版)支援兩種分區時間格式:StrfTimeFormat和SimpleDateFormat,僅當MaxCompute分區列中的欄位配置為__partition_time__或__receive_time__時,時間分區格式才生效。
StrfTimeFormat
strftime是在UNIX的C標準庫中定義的用于格式化日期和時間的函數,這裡用於將時間分區轉換為指定格式的字串。 它的格式化規則可以通過%字元開頭的格式符號來指定,例如%Y_%m_%d表示年月日的格式。
如果是您自己建立的MaxCompute任務,請務必使用StrfTimeFormat時間格式。
|
分區時間格式 |
表分區樣本 |
|
%Y_%m_%d_%H_%M_00 |
2024_12_27_20_30_00 |
|
%Y_%m_%d_%H_%M |
2024_12_27_20_30 |
|
%Y_%m_%d_%H |
2024_12_27_20 |
|
%Y_%m_%d |
2024_12_27 |
|
%Y_%m |
2024_12 |
|
%Y |
2024 |
|
%Y%m%d%H%M |
202412272030 |
|
%Y%m%d%H |
2024122720 |
|
%Y%m%d |
20241227 |
|
%Y%m |
202412 |
SimpleDateFormat
即Java SimpleDateFormat文法的時間格式,例如yyyy-MM-dd HH:mm。時間格式的文法詳情,請參見Class SimpleDateFormat。
SimpleDateFormat時間格式僅用於舊版遷移新版,以保證新舊版本的相容性。如果是您自己建立的MaxCompute任務,請務必使用StrfTimeFormat時間格式。
舊版遷移任務,支援的分區格式形式如下:
|
分區時間格式 |
表分區樣本 |
|
yyyy-MM-ddHH:mm |
2024-12-2720-30 |
|
yyyy_MM_dd_HH_mm |
2024_12_27_20_30 |
|
yyyy_MM_dd_HH |
2024_12_27_20 |
|
yyyy-MM-dd HH:mm |
2024-12-27 20:30 |
|
yyyyMMddHHmm |
202412272030 |
|
yyyyMMddHH |
2024122720 |
|
yyyyMMdd |
20241227 |
|
yyyy_MM-dd_HH_mm |
2024_12-27_20_30 |
|
yyyy-MM-dd |
2024-12-27 |
參考資訊
-
__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__ 篩選資料,可以避免全表掃描。例如查詢2024年12月26日一天內日誌資料,查詢語句如下所示。
select * from {ODPS_TABLE_NAME} where log_partition_time >= "2024_12_26" and log_partition_time < "2024_12_27";
-
-
__receive_time__欄位將日誌到達服務端的時間作為分區欄位,通過時間篩選資料是MaxCompute常見的過濾資料的方法。
-
格式
分區時間格式
__recetive_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
-
-
__extract_others__欄位和__extract_others_all__欄位
-
__extract_others__欄位中包含日誌欄位中未映射的所有欄位(不包括__topic__、__tag__:*和__source__)。
-
__extract_others_all__欄位中包含日誌欄位中未映射的所有欄位(包括__topic__、__tag__:*和__source__)。
-
投遞模式說明
目前,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分區列中添加該欄位。
查看具體內容,如圖示: