天天看點

海量、低成本曆史日志分析實踐背景資訊

背景資訊

日志作為一種特殊的資料,對處理曆史資料、診斷問題以及了解系統活動等有着非常重要的作用。對資料分析人員、開發人員或者運維人員而言,日志都是其工作過程中必不可缺的資料來源。

通常情況下,為節約成本,我們會将日志設定一定的儲存時間,隻分析該時間段内的日志,此類日志稱之為“熱”日志。這種做法,短期内可以滿足使用需求,但從長期來看,大量的曆史日志被擱置,無法發揮其價值。

對于許多企業而言,對日志分析的需求特征通常為低時效和低頻率。并且在一個企業中,為偶發性的日志分析去建構一套完整的日志分析系統,無論在經濟成本還是運維成本上都是不劃算的。如何在降低存儲成本的同時滿足大批量日志的分析需求,是擺在企業面前的一道難題。

實施方案

阿裡雲從使用者角度出發,研發了一整套小而精的曆史日志資料分析方案。利用阿裡雲

日志服務 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上。本文檔将以此為例,詳細為您介紹實施步驟。

前提條件

在開始實施步驟之前,需要先完成以下準備工作。

實施步驟

步驟一:通過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的連接配接。文法如下:

試用
  1. CREATE SCHEMA oss_log_schema with DBPROPERTIES(

  2. catalog='oss',

  3. location = 'oss://myappbucket/sls_parquet/'

  4. );

location:日志檔案所在的OSS Bucket的目錄,需以

/

結尾表示目錄。myappbucket是OSS Bucket名字。

步驟四:在DLA中建立指向OSS日志檔案的外表(分區表)

  1. CREATE EXTERNAL TABLE sls_parquet (

  2. content STRING,

  3. client STRING,

  4. process_id STRING,

  5. start_time STRING,

  6. total_time STRING,

  7. status STRING,

  8. original_sql STRING,

  9. rewritten_sql STRING

  10. ) PARTITIONED BY (year STRING, month STRING, day STRING)

  11. STORED AS PARQUET

  12. LOCATION 'oss://myappbucket/sls_parquet/';

注意:
  • 建立表中的列名要和生成的parquet檔案中設定的列名一緻。
  • 分區列的名稱、順序需要和 中的分區列一緻。更多建立分區表資訊,請參見 通過DLA建立OSS分區表

步驟五:使用MSCK指令更新分區資訊

外表建立成功後,執行

MSCK REPAIR TABLE

将分區資訊同步到DLA中。MSCK指令隻能識别符合DLA分區列命名規則的目錄,即分區列的目錄名為分區列名=分區列值。

  1. MSCK REPAIR TABLE sls_parquet;

步驟六:查詢分區表資料

分區資訊同步完成後,使用

SELECT

語句對日志進行查詢分析。例如,得到某一天查詢最慢的5條語句。

  1. SELECT original_sql, total_time

  2. FROM sls_parquet

  3. WHERE client!=''

  4. ORDER BY total_time DESC

  5. LIMIT 5;

後續操作

上述示例中,日志資料投遞OSS的存儲格式為Parquet格式,除了Parquet格式,LOG還可以将投遞檔案的格式設定為JSON和CSV。詳細的配置,請參見

JSON格式

CSV格式

  • 當投遞檔案的格式設定為JSON且無壓縮時,建表語句為:
    1. CREATE EXTERNAL TABLE sls_json (

    2. content STRING,

    3. client STRING,

    4. process_id STRING,

    5. start_time STRING,

    6. total_time STRING,

    7. status STRING,

    8. original_sql STRING,

    9. rewritten_sql STRING

    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)

    11. STORED AS JSON

    12. LOCATION 'oss://myappbucket/sls_json/';

  • 當投遞檔案的格式設定為JSON且使用标準Snappy壓縮時,建表語句為:
    1. CREATE EXTERNAL TABLE sls_json_snappy (

    2. content STRING,

    3. client STRING,

    4. process_id STRING,

    5. start_time STRING,

    6. total_time STRING,

    7. status STRING,

    8. original_sql STRING,

    9. rewritten_sql STRING

    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)

    11. STORED AS JSON

    12. LOCATION 'oss://myappbucket/sls_json_snappy/'

    13. TBLPROPERTIES(

    14. 'text.compression'='snappy',

    15. 'io.compression.snappy.native'='true'

    16. );

  • 當投遞檔案的格式設定為CSV,不包含header,使用标準Snappy壓縮時,建表語句為:
    1. CREATE EXTERNAL TABLE sls_csv_snappy (

    2. content STRING,

    3. client STRING,

    4. process_id STRING,

    5. start_time STRING,

    6. total_time STRING,

    7. status STRING,

    8. original_sql STRING,

    9. rewritten_sql STRING

    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)

    11. ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

    12. WITH SERDEPROPERTIES(

    13. 'separatorChar'=',',

    14. 'quoteChar'='"',

    15. 'escapeChar'='\\'

    16. )

    17. STORED AS TEXTFILE

    18. LOCATION 'oss://myappbucket/sls_csv_snappy/'

    19. TBLPROPERTIES(

    20. 'text.compression'='snappy',

    21. 'io.compression.snappy.native'='true',

    22. 'skip.header.line.count'='0'

    23. );

    海量、低成本曆史日志分析實踐背景資訊
  • 當投遞檔案的格式設定為CSV無壓縮,且包含header時,建表語句為:
    1. CREATE EXTERNAL TABLE sls_csv (

    2. content STRING,

    3. client STRING,

    4. process_id STRING,

    5. start_time STRING,

    6. total_time STRING,

    7. status STRING,

    8. original_sql STRING,

    9. rewritten_sql STRING

    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)

    11. ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

    12. WITH SERDEPROPERTIES(

    13. 'separatorChar'=',',

    14. 'quoteChar'='"',

    15. 'escapeChar'='\\'

    16. )

    17. STORED AS TEXTFILE

    18. LOCATION 'oss://myappbucket/sls_csv/'

    19. TBLPROPERTIES(

    20. 'skip.header.line.count'='1'

    21. );