底層基於Apache Hudi的DLA最佳實踐 | 海量、低成本日誌分析

2021-02-20 Flink
背景信息

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

通常情況下,為節約成本,我們會將日誌設定一定的保存時間,只分析該時間段內的日誌,此類日誌稱之為「熱」日誌。這種做法,短期內可以滿足使用需求,但從長期來看,大量的歷史日誌被擱置,無法發揮其價值。

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

實施方案

阿里雲從用戶角度出發,研發了一整套小而精的歷史日誌數據分析方案。利用阿里雲日誌服務 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 BucketOSS 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/';


注意:

步驟五:使用MSCK命令更新分區信息

外表創建成功後,執行MSCK REPAIR TABLE將分區信息同步到DLA中。MSCK命令只能識別符合DLA分區列命名規則的目錄,即分區列的目錄名為分區列名=分區列值

<div class="code-tools">  <i class="theme-switch-btn"></i><i class="copy-btn"></i></div><pre class="prettyprint linenums prettyprinted" style=""><ol class="linenums"><li class="L0"><code class="lang-sql hljs"><span class="pln">MSCK <span class="hljs-keyword">REPAIR</span> <span class="hljs-keyword">TABLE</span> sls_parquet</span><span class="pun">;</span></code></li></ol></pre><div class="pre-scrollbar-track" style="display: none;width: 100%;height: 4px;margin-bottom: 16px;">  <div class="pre-scrollbar-thumb" style="height: 100%;background-color: #d7d8d9;position: relative;"></div></div>


步驟六:查詢分區表數據

分區信息同步完成後,使用SELECT語句對日誌進行查詢分析。例如,得到某一天查詢最慢的5條語句。

<div class="code-tools">  <i class="theme-switch-btn"></i><i class="copy-btn"></i></div><pre class="prettyprint linenums prettyprinted" style=""><ol class="linenums"><li class="L0"><code class="lang-sql hljs"><span class="pln"><span class="hljs-keyword">SELECT</span> original_sql</span><span class="pun">,</span><span class="pln"> total_time </span></code></li><li class="L1"><code class="lang-sql hljs"><span class="pln">FROM sls_parquet </span></code></li><li class="L2"><code class="lang-sql hljs"><span class="pln">WHERE client</span><span class="pun">!=</span><span class="str">''</span><span class="pln"> </span></code></li><li class="L3"><code class="lang-sql hljs"><span class="pln">ORDER BY total_time DESC </span></code></li><li class="L4"><code class="lang-sql hljs"><span class="pln">LIMIT </span><span class="lit">5</span><span class="pun">;</span></code></li></ol></pre><div class="pre-scrollbar-track" style="display: none;width: 100%;height: 4px;margin-bottom: 16px;">  <div class="pre-scrollbar-thumb" style="height: 100%;background-color: #d7d8d9;position: relative;"></div></div>


後續操作

上述示例中,日誌數據投遞OSS的存儲格式為Parquet格式,除了Parquet格式,LOG還可以將投遞文件的格式設置為JSON和CSV。詳細的配置,請參見JSON格式和CSV格式。

JSON格式

當投遞文件的格式設置為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格式

當投遞文件的格式設置為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'  );

相關焦點

  • 【翻譯】Apache Hudi 重要的概念和術語
    DELTA_COMMIT - 增量提交是指將一批記錄原子寫入到MergeOnRead存儲類型的表中,其中一些/所有數據都可以只寫到增量日誌中。COMPACTION - 協調Hudi中差異數據結構的後臺活動,例如:將更新從基於行的日誌文件變成列格式。在內部,壓縮表現為時間軸上的特殊提交。
  • 在 Linux 上用 SQL 語句查詢 Apache 日誌
    Linux 有一個顯著的特點,在正常情況下,你可以通過日誌分析系統日誌來了解你的系統中發生了什麼,或正在發生什麼。
  • Big Data on S3最佳實踐系列篇之(1)
    之前的文章《雲計算的浪潮下,數據分析技術趨勢何去何從》介紹未來3-5年的數據分析趨勢,企業不僅依靠結構化數據分析挖掘數據價值,基於X分析進行非結構化數據的文本分析
  • 盤點2017年晉升為Apache TLP的大數據相關項目
    >Apache Metron 官方網址:https://metron.apache.org/Apache SystemML:為大數據優化的聲明式機器學習平臺Apache SystemML 是由 IBM 開發並開源的優化大數據機器學習平臺,為使用大數據的機器學習提供了最佳的工作場所。
  • 微信支付萬億日誌在Hermes中的實踐
    在如此海量日誌存儲規模下,整個微信支付日誌查詢 SLA 達到了 4 個 9,95% 的耗時小於 5s。 EC編碼 HDFS 3.0 版本之後支持 EC 編碼,進一步降低存儲成本,目前暫時未在線上實踐。 通過採用這種存算分離的架構,一方面可以簡化上層的計算層的設計;另一方面計算層計算索引的時候只需計算單份即可實現多副本容災,從而極大的減少計算層的 CPU、內存資源消耗,使得寫入 QPS 成倍提升。
  • 實時海量日誌分析系統的架構設計、實現以及思考
    由於需要對日誌進行實時分析,所以Storm是我們想到的首個框架。Storm是一個分布式實時計算系統,它可以很好的處理流式數據。利用storm我們幾乎可以直接實現一個日誌分析系統,但是將日誌分析系統進行模塊化設計可以收到更好的效果。模塊化的設計至少有兩方面的優點:模塊化設計可以使功能更加清晰。
  • 2017年排名Top 100的Java類庫——在分析了259,885份源碼之後得出的結論
    原作者:Henn Idan一年的時間就這麼匆匆過去了,就好像像我們昨天才剛剛從GitHub上分析了2016年的Top Java類庫一樣。今年,我們在數據檢索方面採用了Google的BigQuery,來得到更精確的結果。譯者註:BigQuery 是 Google 專門面向數據分析需求設計的一種全面託管的 PB 級低成本企業數據倉庫。
  • 智能運維場景解析:基於AIOps的智能根因分析實踐
    在海量離散數據中追蹤故障根因的難點應用系統架構複雜,技術體系多樣,數據孤島在企業中大量存在。目前,IT部門普遍採用多種離散監控系統來實現不同的技術棧監控,如基礎設施與服務監控採用Zabbix或監控寶、網絡監控使用Solarwinds軟體、應用性能管理採用透視寶等APM產品,還有一些業務和性能採用日誌分析手段進行監控。
  • 【譯】Using .NET for Apache Spark to Analyze Log Data
    在這篇博客文章中,我們將探討如何使用.NET for Spark執行一個非常流行的大數據任務,即日誌分析。1 什麼是日誌分析?    日誌分析的目標是從這些日誌中獲得有關工具或服務的活動和性能的有意義的見解。NET for Spark使我們能夠快速高效地分析從兆字節到千兆字節的日誌數據!
  • 海量挑戰:騰訊雲ES可用性及性能優化實踐
    在大規模海量應用場景下,騰訊雲Elasticsearch在高可用和性能方面做了哪些優化?在低成本解決方案中又有哪些獨到之處?本文是對騰訊雲專家工程師張彬老師在雲+社區沙龍online的分享整理,希望與大家一同交流。
  • 列印日誌竟然只曉得 Log4j?
    這篇文章就來說說 Log4j,這個列印日誌的鼻祖。Java 中的日誌列印其實是個藝術活,我保證,這句話絕不是忽悠。事實證明,列印日誌絕逼會影響到程序的性能,這是不可否認的,畢竟多做了一項工作。尤其是在交易非常頻繁的程序裡,湧現大量的日誌確實會比較低效。基於性能上的考量,小夥伴們很有必要認認真真地學習一下如何優雅地列印 Java 日誌。
  • 阿里雲實時大數據解決方案,助力企業實時分析與決策
    第三步:實時數據按實際業務需求使用Flink中進行實時ETL(可選),結果入庫MaxCompute交互式分析(Hologres)構建實時數據倉庫、應用集市,並提供海量數據的實時交互查詢和分析。Hologres提供實時離線聯邦查詢。第四步:基於阿里QuickBI進或第三方數據分析工具如Tableau行數據可視化,以及構建各業務板塊數據服務門戶應用。
  • 網絡管理員必備的10個優秀日誌分析工具
    網絡管理員如果想在企業的大型網絡中掌握網絡性能,離不開對網絡日誌的分析,幫助你在網絡性能出現問題時,及早發現。哪些日誌分析工具會成為你的得力助手?為什麼需要日誌分析工具?連接到網絡的每個設備或應用都會創建日誌文件。網絡管理員使用這些日誌文件來查看性能數據。
  • 日誌管理分析平臺Sumo Logic獲7500萬美元F輪融資
    6月27日,基於雲計算的日誌管理分析平臺sumo logic宣布完成7500萬美元的F輪融資,進入IPO之前的衝刺階段。 Sumo Logic是一款基於雲系統,管理和分析公司硬體數據,以及確保該服務正常運行的APP(現提供精簡免費版和60美元/G收費版),由Kumar Saurabh和Christian Beedgen2010年在加州創建。 它的主要功是能監測企業計算機產生的海量數據,輔助企業對數據日誌進行管理和分析,並將分析結果應用到安全性威脅檢測、輔助理解相關事件等。
  • Apache Kafka 快速入門指南
    「存儲系統」:kafka把消息持久化到磁碟,相比於其他基於內存存儲的系統而言,有效的降低了消息丟失的風險。這得益於其消息持久化和多副本機制。也可以將kafka作為長期的存儲系統來使用,只需要把對應的數據保留策略設置為「永久」或啟用主題日誌壓縮功能。
  • 數倉實時化改造:Hudi on Flink 在順豐的實踐應用
    與之相關的是大數據分析與人工智慧,順豐有一個非常強的地面部隊,就是線下的快遞小哥以及運輸車輛,需要使用 AI 以及大數據分析來輔助管理,提升整體效率。 區塊鏈,順豐對接了很多客戶與商家,對於商家來說,首先需要確保快件是可信的能夠做貨物的交易與交換。這塊涉及的基本上都是品牌商家,溯源與存證的業務順豐也有涉及。
  • ClickHouse國家級項目最佳實踐
    本文是結合百分點在前期設計中的經驗對ClickHouse做的整理,其中百分點最佳實踐部分是基於我們的業務場景以及數據規模,經過大量的測試及總結後得到的結論,並且充分保證了整個系統日後的穩定運行,極具參考意義。
  • 基於大數據技術的安管平臺架構與設計
    而大數據相關技術應用需解決兩大基本問題,第一是數據的存儲問題,如何存儲龐大的數據量的問題;第二是數據的計算問題,如何處理分析海量的數據。因此,從生命周期和技術應用角度出發,把大數據安全分析平臺整體架構分為五大層級,分別為數據源層、數據採集層、數據存儲層、數據計算引擎、數據分析層和應用層。
  • 日誌易饒琛琳:極客邦科技CNUTCon日誌處理技術前瞻
    本次選題從多個層面,會針對日誌可能用到的方向去做普及。日誌可以運用到伺服器、網絡端、移動端,也可以和測試等功能結合。而這些維度的運用,會給運維人員,或整個 IT 團隊,以及業務部門,帶來更大價值。這是選擇移動端和 QA 與 Ops 通力合作議題的原因。 另一個方面,日誌處理運用的範圍廣了,數據量也會激增,這對日誌處理要求的難度就會增高。大規模的海量日誌該怎麼維護?
  • 巧用日誌文件,輕鬆恢復SQL Server資料庫數據
    常見資料庫二進位日誌文件如下所示↓資料庫類型中以SQL Server使用最為廣泛,我們通過對SQL Server二進位日誌文件(LDF文件)底層結構的分析,提出一種基於SQL Server二進位日誌文件的恢復思路和方法,並將其集成於工具,能夠有效恢復目標資料庫中的操作記錄內容,在本文和大家交流分享。