背景資訊
日志作為一種特殊的資料,對處理曆史資料、診斷問題以及了解系統活動等有着非常重要的作用。對資料分析人員、開發人員或者運維人員而言,日志都是其工作過程中必不可缺的資料來源。
通常情況下,為節約成本,我們會将日志設定一定的儲存時間,隻分析該時間段内的日志,此類日志稱之為“熱”日志。這種做法,短期内可以滿足使用需求,但從長期來看,大量的曆史日志被擱置,無法發揮其價值。
對于許多企業而言,對日志分析的需求特征通常為低時效和低頻率。并且在一個企業中,為偶發性的日志分析去建構一套完整的日志分析系統,無論在經濟成本還是運維成本上都是不劃算的。如何在降低存儲成本的同時滿足大批量日志的分析需求,是擺在企業面前的一道難題。
實施方案
阿裡雲從使用者角度出發,研發了一整套小而精的曆史日志資料分析方案。利用阿裡雲
日志服務 LOG(Log Service,簡稱LOG/原SLS)來投遞日志,
阿裡雲對象存儲服務(Object Storage Service,簡稱OSS)來存儲日志,
Data Lake Analytics(DLA)來分析日志。該方案有以下三個優勢:
- LOG是針對實時資料一站式服務,在阿裡集團經曆大量大資料場景錘煉而成。提供日志類資料采集、智能查詢分析、消費與投遞等功能,全面提升海量日志處理/分析能力。LOG強大的日志投遞能力,能夠從源頭對接各種類型的日志格式,并且穩定地将日志投遞到指定的位置。
- OSS低廉的存儲成本,能夠讓您的日志檔案存儲任意長的時間。
- DLA強大的分析能力,Serverless的架構,按掃描量收費。DLA可以對投遞到OSS上的日志按年、按月、按日進行多元度的分區,提高日志的命中率,降低掃描量,進而以極低的成本、極高的性能來完成大資料量曆史日志分析。

例如,服務部署在
雲伺服器ECS(Elastic Compute Service,簡稱ECS)叢集上,該叢集的每台機器上都有一個記錄通路情況的日志access.log。希望能夠對access.log進行資訊抽取,并将過濾後的資訊存儲至OSS上。本文檔将以此為例,詳細為您介紹實施步驟。
前提條件
在開始實施步驟之前,需要先完成以下準備工作。
- 參考文檔 LOG快速入門 ,開通日志服務、建立項目、建立日志庫。
- 開通OSS服務 、在日志服務項目所在的地域 建立存儲空間 。
- 開通并初始化DLA服務
實施步驟
步驟一:通過Logtail采集ECS日志。
詳細操作請參見
通過Logtail采集ECS日志根據本示例中的日志檔案特點,Logtail配置如下所示。
模式選擇完整正則模式,需要提供完整正規表達式。
步驟二:投遞日志到OSS
投遞日志到OSS,并且
日志服務投遞OSS使用Parquet存儲的相關配置在OSS投遞功能頁面,配置各項參數:
參數說明:
- OSS Bucket和OSS Prefix設定日志投遞到OSS的哪個目錄。
-
修改分區格式,将分區列的名字填入到目錄中,格式為分區列名=分區列值。
如圖所示,修改分區格式預設值,即一級分區列的列名為year,列值為%Y; 二級分區列的列名為month,列值為%m;三級分區列的列名為day,列值為%d。
- 存儲格式設定為parquet。
- 壓縮方式設定為snappy,使用snappy算法對資料做壓縮,可以減少OSS Bucket存儲空間使用量。
日志資料投遞到OSS中以後,就可以通過DLA讀取并分析OSS中的日志。
步驟三:在DLA中建立OSS連接配接
登入
DLA控制台,登入DMS,在DLA中建立一個到OSS的連接配接。文法如下:
試用-
CREATE SCHEMA oss_log_schema with DBPROPERTIES(
-
catalog='oss',
-
location = 'oss://myappbucket/sls_parquet/'
-
);
location:日志檔案所在的OSS Bucket的目錄,需以
/
結尾表示目錄。myappbucket是OSS Bucket名字。
步驟四:在DLA中建立指向OSS日志檔案的外表(分區表)
-
CREATE EXTERNAL TABLE sls_parquet (
-
content STRING,
-
client STRING,
-
process_id STRING,
-
start_time STRING,
-
total_time STRING,
-
status STRING,
-
original_sql STRING,
-
rewritten_sql STRING
-
) PARTITIONED BY (year STRING, month STRING, day STRING)
-
STORED AS PARQUET
-
LOCATION 'oss://myappbucket/sls_parquet/';
注意:
- 建立表中的列名要和生成的parquet檔案中設定的列名一緻。
- 分區列的名稱、順序需要和 中的分區列一緻。更多建立分區表資訊,請參見 通過DLA建立OSS分區表
步驟五:使用MSCK指令更新分區資訊
外表建立成功後,執行
MSCK REPAIR TABLE
将分區資訊同步到DLA中。MSCK指令隻能識别符合DLA分區列命名規則的目錄,即分區列的目錄名為分區列名=分區列值。
-
MSCK REPAIR TABLE sls_parquet;
步驟六:查詢分區表資料
分區資訊同步完成後,使用
SELECT
語句對日志進行查詢分析。例如,得到某一天查詢最慢的5條語句。
-
SELECT original_sql, total_time
-
FROM sls_parquet
-
WHERE client!=''
-
ORDER BY total_time DESC
-
LIMIT 5;
後續操作
上述示例中,日志資料投遞OSS的存儲格式為Parquet格式,除了Parquet格式,LOG還可以将投遞檔案的格式設定為JSON和CSV。詳細的配置,請參見
JSON格式和
CSV格式- 當投遞檔案的格式設定為JSON且無壓縮時,建表語句為:
-
CREATE EXTERNAL TABLE sls_json (
-
content STRING,
-
client STRING,
-
process_id STRING,
-
start_time STRING,
-
total_time STRING,
-
status STRING,
-
original_sql STRING,
-
rewritten_sql STRING
-
) PARTITIONED BY (year STRING, month STRING, day STRING)
-
STORED AS JSON
-
LOCATION 'oss://myappbucket/sls_json/';
-
- 當投遞檔案的格式設定為JSON且使用标準Snappy壓縮時,建表語句為:
-
CREATE EXTERNAL TABLE sls_json_snappy (
-
content STRING,
-
client STRING,
-
process_id STRING,
-
start_time STRING,
-
total_time STRING,
-
status STRING,
-
original_sql STRING,
-
rewritten_sql STRING
-
) PARTITIONED BY (year STRING, month STRING, day STRING)
-
STORED AS JSON
-
LOCATION 'oss://myappbucket/sls_json_snappy/'
-
TBLPROPERTIES(
-
'text.compression'='snappy',
-
'io.compression.snappy.native'='true'
-
);
-
- 當投遞檔案的格式設定為CSV,不包含header,使用标準Snappy壓縮時,建表語句為:
-
CREATE EXTERNAL TABLE sls_csv_snappy (
-
content STRING,
-
client STRING,
-
process_id STRING,
-
start_time STRING,
-
total_time STRING,
-
status STRING,
-
original_sql STRING,
-
rewritten_sql STRING
-
) PARTITIONED BY (year STRING, month STRING, day STRING)
-
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
-
WITH SERDEPROPERTIES(
-
'separatorChar'=',',
-
'quoteChar'='"',
-
'escapeChar'='\\'
-
)
-
STORED AS TEXTFILE
-
LOCATION 'oss://myappbucket/sls_csv_snappy/'
-
TBLPROPERTIES(
-
'text.compression'='snappy',
-
'io.compression.snappy.native'='true',
-
'skip.header.line.count'='0'
-
);
海量、低成本曆史日志分析實踐背景資訊 -
- 當投遞檔案的格式設定為CSV無壓縮,且包含header時,建表語句為:
-
CREATE EXTERNAL TABLE sls_csv (
-
content STRING,
-
client STRING,
-
process_id STRING,
-
start_time STRING,
-
total_time STRING,
-
status STRING,
-
original_sql STRING,
-
rewritten_sql STRING
-
) PARTITIONED BY (year STRING, month STRING, day STRING)
-
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
-
WITH SERDEPROPERTIES(
-
'separatorChar'=',',
-
'quoteChar'='"',
-
'escapeChar'='\\'
-
)
-
STORED AS TEXTFILE
-
LOCATION 'oss://myappbucket/sls_csv/'
-
TBLPROPERTIES(
-
'skip.header.line.count'='1'
-
);
-