www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 架構師社區(qū)
[導讀]分享嘉賓:賈元喬 菜鳥?高級數(shù)據(jù)技術專家 內(nèi)容來源:Flink Forward ASIA 出品平臺:DataFunTalk 導讀:在開源盛世的今天,實時數(shù)倉的建設已經(jīng)有了較為成熟的方案,技術選型上也都各有優(yōu)劣。菜鳥作為物流供應鏈的主力軍,時效要求已經(jīng)成為了核心競爭力,離線數(shù)

 

分享嘉賓:賈元喬 菜鳥 高級數(shù)據(jù)技術專家

內(nèi)容來源:Flink Forward ASIA

出品平臺:DataFunTalk


導讀:在開源盛世的今天,實時數(shù)倉的建設已經(jīng)有了較為成熟的方案,技術選型上也都各有優(yōu)劣。菜鳥作為物流供應鏈的主力軍,時效要求已經(jīng)成為了核心競爭力,離線數(shù)倉已不能滿足發(fā)展的需要,在日益增長的訂單和時效挑戰(zhàn)下,菜鳥技術架構也在不斷發(fā)展和完善,如何更準更高效的完成開發(fā)和維護,變得格外重要。本文將為大家分享菜鳥技術團隊在建設實時數(shù)倉技術架構中的一些經(jīng)驗和探索,希望能給大家?guī)韱l(fā)。

本文主要包括以下內(nèi)容:

  • 以前的實時數(shù)據(jù)技術架構

  • 數(shù)據(jù)模型、計算引擎、數(shù)據(jù)服務的升級

  • 其他技術工具的探索和創(chuàng)新

  • 未來發(fā)展與思考

01
以前的實時數(shù)據(jù)技術架構

數(shù)據(jù)模型:

  • 業(yè)務線內(nèi)部模型層次混亂,數(shù)據(jù)使用成本特別高

  • 需求驅動的煙囪式開發(fā),完全沒有復用的可能性,計算成本居高不下

  • 各業(yè)務線橫向或者縱向的交叉,導致開發(fā)過程中數(shù)據(jù)一致性偏差較大

  • 縱向的數(shù)據(jù)模型,導致 BI 使用時比較困難

實時計算

  • 我們之前使用阿里云的 JStorm 和 Spark Streaming 進行開發(fā),這兩部分能滿足大部分的實時數(shù)據(jù)開發(fā),但是應用到物流供應鏈場景當中,實現(xiàn)起來并不簡單,甚至無法實現(xiàn)

  • 很難同時兼顧功能、性能、穩(wěn)定性以及快速故障恢復能力

數(shù)據(jù)服務

  • 開發(fā)過程中,實時數(shù)據(jù)下沉到 MySQL,HBase 等數(shù)據(jù)庫中,查詢和保障方面不靈活

  • BI 權限控制和全鏈路保障不可靠

02
數(shù)據(jù)模型升級

1. 模型分層

參考離線數(shù)倉,將實時數(shù)據(jù)進行分層,第一層是數(shù)據(jù)采集,將從 MySQL 等數(shù)據(jù)庫中采集到的數(shù)據(jù)放到 TT 消息中間件中,然后基于 TT 消息中間件和 HBase 的各種維表關聯(lián)產(chǎn)生事實明細寬表,再將生成的數(shù)據(jù)寫到 TT 消息中間件中。通過訂閱這個消息產(chǎn)生輕度匯總層和高度匯總層兩層。輕度匯總層主要按照多個維度沉淀數(shù)據(jù),高度匯總層主要用于大屏場景。

2. 預置分流

左邊公共數(shù)據(jù)中間層是將所有業(yè)務線整合在一起,然后進行分層。右邊的業(yè)務數(shù)據(jù)中間層是各個業(yè)務基于橫向的公共數(shù)據(jù)中間層的基礎上,去分流自己業(yè)務的數(shù)據(jù)中間層,然后根據(jù)這些實時的消息,個性化的產(chǎn)出自己業(yè)務的數(shù)據(jù)中間層。比如不同的訂單,可以橫向分流成進口供應鏈和出口供應鏈。這樣實現(xiàn)了上游只需要一個公共分流作業(yè)完成,節(jié)約了計算資源。

3. 菜鳥供應鏈實時數(shù)據(jù)模型

左邊是公共的數(shù)據(jù)中間層,里面包含整個大盤的訂單數(shù)據(jù),大盤的物流詳情,匯總的公共粒度數(shù)據(jù)等,在這個基礎之上做了個分流任務,然后從物流訂單,物流詳情等里面拆分出我們自己個性化的業(yè)務,比如國內(nèi)的供應鏈,進口的供應鏈以及出口的供應鏈等。經(jīng)過這些步操作之后,可以輕易的區(qū)分哪些表是大屏的數(shù)據(jù),哪些表是統(tǒng)計分析的數(shù)據(jù),在數(shù)據(jù)易用性方面有了很大的提升。

03
計算引擎的提升

一開始,我們采用了 JStorm 和 Spark Streaming 進行實時開發(fā)。這兩個計算引擎在滿足大部分的場景時,沒有特別大的問題,但是在應用到供應鏈或者物流場景時,不是那么簡單。所以我們在17年切換到了 Flink 上,F(xiàn)link 提供了一些很實用的功能,而這些功能在一些供應鏈的場景下比較適用。

首先是內(nèi)部 Flink 支持一套完整的 SQL 寫法,提高了開發(fā)效率。第二點是 Flink 內(nèi)置的基于 State 的 retraction 機制,很好的支持了供應鏈當中的取消訂單,換配等這種操作,而且非常簡單。Flink 的 CEP 功能,方便的實現(xiàn)了超時統(tǒng)計的功能,還有目前正在推的 AtoScaling 方案,比如數(shù)據(jù)傾斜,資源配置等。另外一點是 Flink 在批流混合問題的處理,有很好的支持。

1. 神奇的 Retraction

左邊有4列數(shù)據(jù),第1列數(shù)據(jù)是物流訂單,第2列的數(shù)據(jù)是物流訂單的創(chuàng)建時間,第3列數(shù)據(jù)是這個訂單是不是被取消,第4個數(shù)據(jù)是計劃配送公司,就是訂單分配給哪個配送公司。這個業(yè)務需求看上去非常簡單,其實就是統(tǒng)計每個配送公司計劃履行的有效單量有多少。但是有兩個點需要注意一下,第一點,有一個訂單 LP3,在開始的時候是有效的,然后在最后一條時取消了,就變成了一個無效訂單,但這一條訂單不應該統(tǒng)計在內(nèi),因為業(yè)務需求統(tǒng)計的是有效訂單。第二點,配送公司的轉變,LP1 這個訂單在一分鐘時是 tmsA 來配送,后來變成了 tmsB,再過了一段時間,這個訂單又變成 tmsC 配送。如果基于 Storm 增量計算,得出的結果顯然是錯誤的,這時要按照最后一次消息給我們傳過來的數(shù)據(jù)統(tǒng)計。這樣的場景在 Flink 中是如何實現(xiàn)的呢?Flink 也提供了一些非常好的回撤機制。

第一段代碼使用 Flink 的 last_value 函數(shù),獲取這個訂單最后一個消息非空的值,在這個基礎上進行匯總。一旦 last_value 中字段發(fā)生變化,都會觸發(fā)撤回機制,得到最后正確的值。

2. 實時超時統(tǒng)計

這個案例發(fā)生在菜鳥實際物流場景中,第1個表格是一個日志的時間,第2個是物流訂單,第3個字段是出庫時間,最后一個字段是攬收時間,現(xiàn)在需要統(tǒng)計的是出庫超6個小時沒有被攬收的單量。這里涉及到全鏈路時效問題,全鏈路時效指從下單到倉庫發(fā)貨到快遞攬收到簽收的整體時間,這個場景放在離線中是非常容易實現(xiàn)的,但是放到實時中來不是很簡單, 比如 LP1 在00:05分的時候沒有攬收,現(xiàn)在如果當下時刻是12點的話,也沒有攬收,理論上應該計算這個訂單,但是沒有攬收就意味著沒有消息進來,沒有消息進來我們又要統(tǒng)計,其實我們用 Flink 是沒法統(tǒng)計的,那這種情況我們怎么處理呢?我們的解決方案是如果沒有這條消息我們用 Flink 來制造這條消息。這種超時消息統(tǒng)計我們想到了幾種方法:

包括引入消息中間件 ( kafka ) 和 Flink 的 CEP。最終選擇了 Flink 的 Timer Service,因為這種消息不是特別多,中間件又特別重。而 CEP 會丟掉一些回傳不準確的消息,導致數(shù)據(jù)計算不準確,針對這些情況,我們在調(diào)研之后選擇了 Timer Service,同時我們對它底層的 ProcessElement 和 OnTimer 兩個方法進行了改寫。ProcessElement 告訴 Flink 存儲什么樣的數(shù)據(jù),然后啟動針對每一個超時的事件的 Timer Service。OnTimer 方法會在每個超時的時刻讀這個超時的消息,并把這個超時的消息下發(fā)下來。基于下游跟正常流的關聯(lián)操作之后就能計算超時消息的單量。

先構造一個 process funcation 到 state 存數(shù)據(jù),并為每一個超時的數(shù)據(jù)注冊一個 Timer Service。然后執(zhí)行 OnTimer 這個方法,讀取并把這個超時的消息下發(fā)下去。

3. 從手動優(yōu)化到智能優(yōu)化

關于數(shù)據(jù)傾斜的問題,左圖顯示在 map 階段 shuffer 之后數(shù)據(jù)傾斜到了紅色的 Agg 上,這時就出現(xiàn)熱點了,原來我們是對這個 lg_order_code 進行 hash 取值操作,然后再針對散列的結果進行二次的聚合,這樣操作后在一定程度上減輕了數(shù)據(jù)的傾斜。在最近的 Flink 的版本中已經(jīng)實現(xiàn)了規(guī)避數(shù)據(jù)傾斜的方法,我們內(nèi)部的 Blink 版本,有幾個功能去優(yōu)化熱點的問題,第一個就是 MiniBatch,之前來一條數(shù)據(jù),我們就去 State 里面查詢?nèi)缓髮懭耄琈iniBatch 的作用是把所有的數(shù)據(jù)先聚合一次,類似一個微批處理,然后再把這個數(shù)據(jù)寫到 State 里面,或者在從 State 里面查出來,這樣可以大大的減輕對 State 查詢的壓力。第二個辦法就是 LocalGlobal,類似于在 hive 中 map 階段中的 combiner,通過設置這個參數(shù)可以在讀的時候先聚合。第三個辦法是 PartialFinal,類似于散列的方式,分兩次聚合,相當于 hive 中兩個入 reduce 操作。通過設置這三個參數(shù),可以在大部分場景規(guī)避數(shù)據(jù)傾斜的問題。

智能化功能支持的另一個場景是資源配置。在進行實時 ETL 過程中,首先要定義 DDL,然后編寫 SQL,之后需要進行資源配置。針對資源配置問題,菜鳥之前的方案是對每一個節(jié)點進行配置,包括并發(fā)量、是否會涉及消息亂序操作、CPU、內(nèi)存等,一方面配置過程非常復雜,另一方面無法提前預知某些節(jié)點的資源消耗量。Flink 目前提供了較好的優(yōu)化方案來解決該問題:

  • 大促場景:該場景下,菜鳥會提前預估該場景下的 QPS,會將其配置到作業(yè)中并重啟。重啟后 Flink 會自動進行壓測,測試該 QPS 每個節(jié)點所需要的資源。

  • 日常場景:日常場景的 QPS 峰值可能遠遠小于大促場景,此時逐一配置 QPS 依然會很復雜。為此 Flink 提供了 AutoScaling 智能調(diào)優(yōu)的功能,除了可以支持大促場景下提前設置 QPS 并壓測獲取所需資源,還可以根據(jù)上游下發(fā)的 QPS 的數(shù)據(jù)自動預估需要的資源。大大簡化了資源配置的復雜度,使得開發(fā)人員可以更好地關注業(yè)務邏輯本身的開發(fā)。

04
數(shù)據(jù)服務的升級

在開發(fā)的過程中常用的數(shù)據(jù)庫比較少,因此統(tǒng)一數(shù)據(jù)庫連接標準是有必要的。我們開發(fā)的叫天工,它可以提供整個數(shù)據(jù)庫統(tǒng)一的接入標準,提供統(tǒng)一的權限控制,提供統(tǒng)一的全鏈路的保障。這個中間件將 SQL 作為 DSL,并且提供一些標準化的 HSF 的服務方式。作為菜鳥數(shù)據(jù)服務的踐行者,天工也提供了一些非常貼近業(yè)務的,非常實用的功能,下面是幾個案例。

1. NoSQL To TgSQL

對于 HBase 這種 NoSQL 數(shù)據(jù)庫,BI 或者運營來說用代碼來實現(xiàn)需求是比較困難的,所以開發(fā)天工的時候第一件事情就是把一些 NoSQL 轉化成天工 SQL,包括我前面說的一個人員的表轉化成一個二維表,這里是邏輯的轉換,不是實際物理上的轉化,大家通過運行這個 SQL,后臺的中間件會自動轉化成查詢的語言,去查詢后臺的數(shù)據(jù)。

2. 跨源數(shù)據(jù)轉化

在開發(fā)數(shù)據(jù)產(chǎn)品的過程中,我們發(fā)現(xiàn)實時跟離線有時候分不開,比如有一個比較大的場景,需要統(tǒng)計實時 KPI 的完成率,它的分子是實際單量,分母是已經(jīng)計劃好的單量,數(shù)據(jù)源是來自兩個部分,第一個部分來自已經(jīng)做好的 KPI 的一個表,然后第二部分是一個實時計算出來的表。對于這種場景,之前我們是用 Java 去計算這兩部分數(shù)據(jù),然后在前端去運算,比較麻煩。現(xiàn)在通過天工 SQL 直接取這兩部分數(shù)據(jù)關聯(lián),做到跨源數(shù)據(jù)的操作。

3. 服務保障升級

原來在整個服務的保障比較缺失,比如某個數(shù)據(jù)服務出了問題,我們直到運營反饋的時候才發(fā)現(xiàn)有問題,或者數(shù)據(jù)量比較大的時候,要去做限流和主備切換。所以在數(shù)據(jù)服務的這一層中也把數(shù)據(jù)服務保障加到了天工的中間件里面。還有主備雙活,將流量大的放在主庫,流量適中的放在備庫上。針對一些復雜的查詢,在執(zhí)行的時候很慢,我們會自動識別這些慢查詢,然后進行阻斷,等待資源充足后再執(zhí)行,當然,也可通過添加白名單用戶進行限流。上面這些功能在天工里面都有實現(xiàn)。

05
其他技術工具的探索和創(chuàng)新

除了前面講的,我們在技術工具上也和阿里云計算平臺的事業(yè)部進行了探索。每年遇到大促都要進行壓測,大家要去啟動數(shù)據(jù),模擬大促流量,看看我們的實時作業(yè)能不能滿足預期,比如有延遲,或者 QPS 過高,在原來我們會重啟作業(yè),然后把 source 和 sink 改成壓測 source 和 sink,操作起來非常的麻煩。后來我們做了一個實時的壓測工具,可以做到一鍵啟動所有重要的壓測任務,并且會生成壓測報告。我們只需要看壓測本報告有沒有滿足我們的預期就行?;?Flink 之后,我們開始做基于作業(yè)進度的監(jiān)控,比如延遲監(jiān)控、checkpoint 的監(jiān)控、TPS 的預警等。

06
未來發(fā)展與思考

菜鳥目前在實時數(shù)倉方面更多的是基于 Flink 進行一系列功能的開發(fā),未來的發(fā)展方向計劃向批流混合以及 AI 方向演進。

Flink 提供了 batch 功能。菜鳥很多中小型的表分析不再導入到 Hbase 中, 而是在定義 source 的時候直接將 MaxCompute 的離線維表讀到內(nèi)存中,直接去做關聯(lián),如此一來很多操作不需要再進行數(shù)據(jù)同步的工作。

針對一些物流的場景。如果鏈路比較長,尤其是雙十一支付的訂單,在十一月十七號可能還存在未簽收的情況,這時候如果發(fā)現(xiàn)作業(yè)中有一個錯誤,如果重啟的話,作業(yè)的 State 將會丟失,再加之整個上游的 source 在 TT 中只允許保存三天,使得該問題的解決變得更加困難。

  • 菜鳥之后發(fā)現(xiàn) Flink 提供的 batch 功能可以很好地解決該問題,具體來講是定義 TT 的 source,作為三天的實時場景的應用,TT 數(shù)據(jù)寫到離線數(shù)據(jù)庫進行歷史數(shù)據(jù)備份,如果存在重啟的情況,會讀取并整合離線的數(shù)據(jù),即使 Flink 的 state 丟失,因為離線數(shù)據(jù)的加入,也會生成新的 state,從而不必擔心雙十一的訂單如果在十七號簽收之前重啟導致無法獲取十一號的訂單信息。

  • 當然,在上述問題的解決上,菜鳥也踩了很多的小坑。其中的一個是整合實時數(shù)據(jù)和離線數(shù)據(jù)的時候,數(shù)據(jù)亂序的問題。菜鳥實現(xiàn)了一系列的 UDF 來應對該問題,比如實時數(shù)據(jù)和離線數(shù)據(jù)的讀取優(yōu)先級設置。

針對日志型的業(yè)務場景。比如曝光、網(wǎng)站流量等,其一條日志下來后,基本不會再發(fā)生變化。菜鳥目前在考慮將所有解析的工作交給 Flink 來處理,然后再寫入到 batch 中,從而無需在 MaxCompute 的 ODPS 中進行批處理的操作。

在智能化方面。前面提到的數(shù)據(jù)傾斜隱患的規(guī)避、資源的優(yōu)化等,都用到了 Flink 提供的智能化功能。

  • 菜鳥也期望在實時 ETL 過程中的一些場景中,比如去重,也使用 Flink 相應的智能化解決方案來進行優(yōu)化。

  • 此外,在數(shù)據(jù)服務保障上,如主備切換等,目前仍然依賴人工對數(shù)據(jù)庫進行監(jiān)控,菜鳥也期望 Flink 之后能提供全鏈路實時保障的策略。

  • 最后是業(yè)務場景的智能化,阿里 Alink 對于業(yè)務智能化的支持也是之后探索的方向。

本次的分享就到這里,謝謝大家。

特別推薦一個分享架構+算法的優(yōu)質內(nèi)容,還沒關注的小伙伴,可以長按關注一下:

菜鳥實時數(shù)倉技術架構演進

長按訂閱更多精彩▼

菜鳥實時數(shù)倉技術架構演進

如有收獲,點個在看,誠摯感謝

免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉