伴隨Logging、Metrics、Tracing三者融合趨勢的部分顯現,日誌類數據的範圍正在泛化,包括:工業傳感器數據、日誌文件、Prometheus採集的雲原生應用指標、Syslog、網絡點擊日誌、stdout、業務埋點等等。html
能夠看到:web
•數據規模快速增加,日誌類數據是big data的主力。數據庫
•採集的日誌數據類別正在增長,其一是日誌類型泛化,其二是過去被丟棄的數據正被重拾起來。後端
•數據運營的理念在各行各業滲透,更多的日誌數據開始獲得處理,更多的人開始參與日誌分析。api
即便在傳統日誌領域,以Kubernetes爲表明的雲原生的流行,也帶來了新的日誌生命週期管理需求。如何從各類日誌源採集數據、分析數據是一項複雜的挑戰。數組
除了數據科學家、數據工程師,如今運營、DevOps工程師、用戶支持等角色也在分析日誌。假設有N
種日誌用戶,對於M
種類型日誌,可能會產生N*M
種日誌存儲、分析需求。服務器
上圖(interana.com, State of Data Insights 2017統計)反映了一個事實:73%的人須要花費幾天甚至數星期時間從數據中獲得分析結果。網絡
另外一個被普遍傳播的數字:在數據分析過程當中,數據集成和預處理所耗費的時間佔整體80%以上。架構
完成各個數據源採集,接着以儘可能統一的方式(UI、模型、計算架構)對數據作加工、查詢。其中,ETL是關鍵的技術。併發
近一兩年來,看到一些關於」ETL已死「的文章。但關鍵問題尚未解決:
OLAP + OLTP
一體化的系統使人嚮往,但當前在數據規模、計算任務多樣化上有其限定條件。所以,銀彈尚未出現,對業務需求進行抽象,根據技術指標作合理的存儲、計算選型是一個行之有效的辦法。ETL沒有消失,也在演進:
數據預處理是本文主題,在多年的ETL技術發展中誕生了不少相關係統。這裏選取一部分作回顧:
採集端系統
日誌領域,以Logstash(注:新版本支持hosted模式)、Fluentd、Flume、NXLog、Logtail(阿里巴巴)爲表明,能夠在採集階段利用機器資源完成必定程度的預處理,不須要專用計算集羣作預處理。不足之處是:
數據庫系統
它們首先是存儲系統,基於行、列存儲模型優化,支持了必定的複雜計算能力。經典的如SQL Server、Oracle數據庫,現在有OceanBase、Google Spanner這樣的分佈式數據庫。
絕大部分數據庫多用於存儲清洗後的數據,用於在線服務場景。
批量計算系統
以Hive、MapReduce計算爲表明的Hadoop生態系統,主要是面向 OLAP、批操做設計。以可擴展的計算和海量存儲能力,解決了big data分析難題。
在延遲敏感型業務佔比愈來愈大的背景下,離線系統的延遲高、交互性差,已經不能再唱獨角戲。
流計算引擎
Flink、Spark是開源社區很是流行的流計算系統,流模式讓ETL變得實時化,定位於通用場景。
雲上數據平臺
以Alooma、AWS Glue、Azure DataFactory、阿里雲DataWorks、Google Cloud DataProc爲表明,各個雲服務廠商基於的存儲、計算服務,在一個系統上爲用戶提供通用、綜合的數據集成、開發能力。
流式存儲與計算
在很長一段時間內,以Kafka爲表明的數據隊列系統被用於臨時數據存儲。通過近些年的發展,流式存儲上拓展了數據分層,基於之上的計算也已成爲一個事實。例如:AWS Kinesis Streams、Kafka(KSQL/Kafka Streams)、Apache Pulsar(Pulsar Functions)。
阿里雲日誌服務(原SLS)是針對日誌類數據的一站式服務,在阿里巴巴集團經歷大量大數據場景錘鍊而成。爲用戶提供快捷的日誌數據採集、消費、投遞以及查詢分析等功能,提高運維、運營效率。
在日誌服務,目前天天的數據處理規模在PB級,涵蓋主要日誌生態的數據源。數據集成手段包括:
在日誌服務上,大量的、多樣的數據在日誌庫(Logstore)存儲,進行數據分析要解決三個挑戰:
規模問題
多元化分析需求
數據預處理的易用性
在日誌服務,數據加工功能用於完成對Logstore數據的預處理,爲後續的分析階段準備數據。
數據加工基於日誌服務的流式存儲,調度動態數目的worker作計算。計算上提供豐富的算子和場景化UDF,對於複雜需求則能夠經過流程控制、條件判斷實現行內邏輯組合,跨行的pipeline組合簡化數據的嵌套處理需求。
日誌服務使用一套通用的數據模型應對各類各樣的數據類型。一條Log由保留字段(時間,來源等)和日誌內容(多個Key-Value對)組成:
message Log { required uint32 Time = 1;// UNIX Time Format message Content { required string Key = 1; required string Value = 2; } repeated Content Contents = 2; }
結構化的數據能夠在這個數據模型上定義出表結構:
__time__ : 1572784373 __source__ : 192.168.2.13 key_a : value a key_b : value b
一樣的,對於非結構化或半結構化數據,能夠在把所有內容放入一個字段中,並選擇性地對字段值作一些處理(例如編碼)。
日誌服務存儲引擎(LogHub)實現了對數據的統一存儲,支持如下特性:
數據加工實現的是脫離存儲系統以外的計算過程。基於Pull模型獲取數據,能夠根據worker自身的負載狀況決定數據加載的速率。worker與存儲系統的網絡請求走阿里雲內部網絡,每次讀取批量的數據塊,結合傳輸過程的壓縮特性,保證了同region下跨系統交換數據不會成爲性能瓶頸。
日誌服務的一個Logstore的數據分佈在多個shard上,每個shard被append寫入數據。調度器負責如下工做:
worker#1
失效後,其對shard 0/1
的處理進度能夠被新加入的worker#3
繼承。彈性是雲服務的標誌,在大部分日誌的流量特徵而言,伸縮能力顯得尤其重要。
例如:直播應用的CDN access log,21:00 ~ 23:00
是業務訪問高峯期併產生大量日誌,到了凌晨1:00 ~ 7:00
日誌流量跌至高峯時的10%。按業務峯值規劃資源必將產生大量閒置成本。
處理延遲、數據規模、成本三者看起來是魚和熊掌的關係,在日誌服務上,嘗試從兩個層面來彈性應對:
日誌處理場景下繞不過的是時間,時間的定義確又不那麼簡單。
名稱 | 定義 | 日誌服務上應用 |
---|---|---|
event-time | 事件時間,真實的業務時間 | 通常建議設置值到__time__ 字段,如寫入時未作規劃則須要從數據中自行提取 |
server-arrived-time | 該事件到達服務端時間 | 日誌服務在接收數據時記錄值並填入__tag__:__receive_time__ 字段 |
processing-time | 數據加工處理該事件的時間 | 不肯定,取決於做業模式以及加工速率 |
對於一個加工任務而言,加工的延遲定義爲processing-time
- server-arrived-time(latest log)
。因爲數據可能遲到或生產者發送了亂序數據,event-time
與server-arrived-time
、processing-time
可能會有較大差別。
數據加工根據server-arrived-time
定義數據源範圍,並提供兩種做業模式:
[FROM server-arrived-time, -)
。[FROM server-arrived-time, TO server-arrived-time)
,常見的有補數據場景,能夠重複地對過去一個時間段作加工。相較於業內流行的SQL、DSL、Python等ETL語言,日誌服務數據加工提供的是類Python DSL,封裝了日誌領域下通用加工過程。
做爲業務邏輯開發的重要一環,數據加工DSL提供如下能力:
e_if_else(condition_1, e_compose(operation_1, operation_2, operation_3), operation_4)
。例如,在數據加工DSL中實現對一條日誌的分裂、拷貝、條件判斷,其內部編排邏輯以下圖:
開發、運維效率是考量數據流程維護成本的重要指標。
日誌服務數據加工是全託管的服務,使用它不感知機器資源,經過web控制檯實現對做業的管理與監控。
在日誌的整個生命週期內,數據採集到日誌服務存儲,數據加工在這以後起着承轉啓合做用。經過數據加工完成清洗、預處理、分發,讓數據在生態流轉起來,並更好地適配目標存儲的schema要求。
數據規整包括字段抽取、過濾、清洗等工做,完成後數據被轉儲到下游。規整的意義在於能爲下游帶來哪些幫助:
以下,content字段是完整的Syslog日誌原文,這樣一條非結構化數據,經過兩行加工代碼分別完成Syslog字段抽取、priority字段映射。
對於JSON格式的結構化日誌,以下兩行代碼經過JMES語法對數組作分拆,分拆後每一個子對象分別作嵌套字段提取。
更多實踐:
日誌分發、複製是一種典型的數據場景。
例如:Kubernetes上採集的衆多pod日誌集中化到一個Logstore上,能夠經過數據加工快速實現按namespace轉發到下游Logstore,在下游Logstore上分別設置存儲週期、索引分析字段。
數據除了在Logstore之間作流轉之外,還能夠流向異構存儲系統,例如投遞到OSS、MaxCompute、ADB等。
更多實踐:
對於一個典型的SLB+ECS+Nginx
架構,Nginx access log上包括請求來源(__source__
字段,記錄vpc子網ip)、請求資源(request_uri
字段,參數記錄了業務租戶的project信息)。
RDS中維護了兩張維表:
數據加工首先對request_uri
作參數拆分,獲取project信息。接下來分別經過ip與project值與兩個維表作join,獲得結果是更完整的日誌信息(包括後端服務器的tag、租戶project的打標內容)。
數據加工目前支持四種數據源作查找富化:本地配置、RDS表、OSS文件、日誌服務Logstore。
更多實踐:
寫在最後,ETL業務場景變幻無窮,數據加工在數據分析場景支撐的路上將持續迭代優化。
雙11福利來了!先來康康#怎麼買雲服務器最便宜# [並不簡單]參團購買指定配置雲服務器僅86元/年,開團拉新享三重禮:1111紅包+瓜分百萬現金+31%返現,爆款必買清單,還有iPhone 11 Pro、衛衣、T恤等你來抽,立刻來試試手氣 https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110
本文爲雲棲社區原創內容,未經容許不得轉載。