二維碼
企資網

掃一掃關注

當前位置: 首頁 » 企資快報 » 服務 » 正文

Apache_Flink_在京東的實踐與優化

放大字體  縮小字體 發布日期:2021-09-05 20:29:38    作者:媒體小英    瀏覽次數:21
導讀

本文整理自京東高級技術專家付海濤在 Flink Forward Asia 2020 分享的議題《Apache Flink 在京東的實踐與優化》,內容包括:1.業務演進和規模2.容器化實踐3.Flink 優化改進4.未來規劃一、業務演進和規模1. 業務演進

本文整理自京東高級技術專家付海濤在 Flink Forward Asia 2020 分享的議題《Apache Flink 在京東的實踐與優化》,內容包括:

1.業務演進和規模

2.容器化實踐

3.Flink 優化改進

4.未來規劃

一、業務演進和規模

1. 業務演進

京東在 2014 年基于 storm 打造了第一代流式處理平臺,可以較好的滿足業務對于數據處理實時性的要求。不過它有一些局限性,對于那些數據量特別大,但是對延遲卻不那么敏感的業務場景,顯得有些力不從心。于是我們在 2017 年引入了 Spark streaming,利用它的微批處理來應對這種業務場景。

隨著業務的發展和業務規模的擴大,我們迫切需要一種兼具低延遲和高吞吐能力,同時支持窗口計算、狀態和恰好一次語義的計算引擎。

  • 于是在 2018 年,我們引入了 Flink,同時開始基于 K8s 進行實時計算容器化的升級改造;
  • 到了 2019 年,我們所有的實時計算任務都跑在 K8s 上了。同年我們基于 Flink 1.8 打造了全新的 SQL 平臺,方便業務開發實時計算應用;
  • 到了 2020 年,基于 Flink 和 K8s 打造的全新實時計算平臺已經比較完善了,我們進行了計算引擎的統一,同時支持智能診斷,來降低用戶開發和運維應用的成本和難度。在過去,流處理是我們關注的一個重點。同年,我們也開始支持批處理,于是整個實時計算平臺開始朝著批流一體的方向演進。

    2. 業務場景

    京東 Flink 服務于京東內部非常多的業務線,主要應用場景包括實時數倉、實時大屏、實時推薦、實時報表、實時風控和實時監控,當然還有其他一些應用場景??傊?,實時計算的業務需求,一般都會用 Flink 進行開發。

    3. 業務規模

    目前我們的 K8s 集群由 5000 多臺機器組成,服務了京東內部 20 多個一級部門。目前在線的流計算任務數有 3000 多,流計算的處理峰值達到 5億條每秒。

    二、容器化實踐

    下面分享一下容器化的實踐。

    在 2017 年,京東內部的大多數任務還是 storm 任務,它們都是跑在物理機上的,同時還有一小部分的 Spark streaming 跑在 Yarn 上。不同的運行環境導致部署和運維的成本特別高,并且在資源利用上有一定的浪費,所以我們迫切需要一個統一集群資源管理和調度系統,來解決這個問題。

    經過一系列的嘗試、對比和優化,我們選擇了 K8s。它不僅可以解決部署運維、資源利用的一些問題,還具有云原生彈性自愈、天然容器完整隔離、更易擴展遷移等優點。于是在 2018 年初,我們開始進行容器化的升級改造。

    在 2018 年的 6.18,我們只有 20% 的任務跑在 K8s 上;到了 2019 年 2 月份,已經實現了實時計算的所有任務都跑在 K8s 上。容器化后的實時計算平臺經歷了 6.18,雙 11 多次大促,扛住了洪峰壓力,運行的非常穩定。

    但是,我們過去的 Flink 容器化方案是基于資源預先分配的靜態方式,不能滿足很多業務場景,于是我們在 2020 年也進行了一個容器化方案的升級,后面會詳細介紹。

    容器化帶來非常多的收益,這里主要強調三點:

  • 第一,可以很方便的實現服務的混合部署,極大地提升資源共享能力,節省機器資源。
  • 第二,天然的彈性擴展,一定的自愈能力,并且它可以做到一個更完整的資源隔離,更好的保障業務的穩定性。
  • 第三,通過容器化實現了開發、測試、生產的一致環境,同時提高了部署和自動化運維的能力,使管理和運維的成本降低了一半。

    我們過去的容器化方案是基于 K8s deployment 部署的 Standalone Session 集群。它需要用戶在平臺創建集群時,事先預估出集群所需資源,比如需要的 jobmanager 和 taskmanager 的資源規格和個數,然后平臺通過 K8s 客戶端向 K8s master 發出請求,來創建 jobmanager 的 deployment 和 taskmanager 的 deployment。

    其中,整個集群的高可用是基于 ZK 實現;狀態存儲主要是存在 HDFS,有小部分存在 OSS;監控指標 (容器指標、JVM 指標、任務指標) 上報到 Prometheus,結合 Grafana 實現指標的直觀展示;日志是基于我們京東內部的 Logbook 系統進行采集、存儲和查詢。

    在實踐中發現,這個方案有兩點不足:

  • 第一,資源需要提前分配,無法滿足靈活多變的業務需要,無法做到按需分配。
  • 第二,極端場景下 Pod 不能正常拉起, 影響任務恢復 。

    于是我們進行了一個容器化方案的升級,實現了基于 K8s 的動態的資源分配方式。在集群創建的時候,首先我們會根據用戶指定的 job manager 的數量創建 jobmanager 的 deployment;用戶在提交任務的時候,我們會根據任務所需要的資源數,動態的向平臺申請資源,創建 taskmanager。

    在運行過程中,如果發現這個任務需要擴容,job manager 會和平臺交互,進行動態擴容;而在發現資源浪費時,會進行縮容。通過這樣一個方式可以很好的解決靜態預分配帶來的問題,并提高了資源利用率。

    此處,通過平臺與 K8s 交互進行資源的創建&銷毀,主要基于 4 點考慮:

  • 保證了計算平臺對資源的監管。
  • 避免了平臺集群配置 & 邏輯變化對鏡像的影響。
  • 屏蔽了不同容器平臺的差異。
  • 平臺原有 K8s 交互相關代碼復用。

    另外,為了兼容原有 Slot 分配策略 (按 slot 分散),在提交任務時會預估出任務所需資源并一次性申請,同時按照一定的策略進行等待。等到有足夠的資源,能滿足任務運行的需求時,再進行 slot 的分配。這樣很大程度上可以兼容原有的 slot 分散分配策略。

    三、Flink 優化改進

    下面介紹一下 Flink 的優化改進。

    1、預覽拓撲

    在業務使用平臺的過程中,我們發現有幾個業務痛點:

  • 第一,任務調優繁瑣。在平臺提交任務、運行之后如果要調整任務并行度、Slot 分組、Chaining 策略等,需要重新修改程序,或者通過命令行參數配置的方式進行調優,這是非常繁瑣的。
  • 第二,SQL 任務無法靈活指定算子配置。
  • 第三,任務提交到集群之后,到底需要多少資源,任務所需 Slot 數預先不清楚。
  • 第四,并行度調整后網絡 buffer 不足。

    為了解決這些問題,我們開發了預覽拓撲的功能:

  • 第一,拓撲配置。用戶提交任務到平臺之后,我們會把拓撲給預覽出來,允許它靈活的配置這些算子的并行度。
  • 第二,槽位分組預覽。我們會清晰的顯示出任務的槽位分組情況和需要多少個槽。
  • 第三,網絡 Buffer 預估。這樣可以最大限度的方便用戶在平臺進行業務的調整和調優。

    下面簡單介紹預覽拓撲的工作流程。用戶在平臺提交 SQL 作業或 Jar 作業,這個作業提交之后,會生成一個算子的配置信息,再反饋到我們平臺。我們平臺會把整個拓撲圖預覽出來,然后用戶就可以在線進行算子配置信息的調整。調整完之后,把調整完的配置信息重新提交到我們平臺。并且,這個過程可以是連續調整的,用戶調整完覺得 ok 了就可以提交任務。提交任務之后,整個在線調整的參數就生效了。

    這里任務可以多次提交,如何保證前后兩次提交生成算子穩定的對應關系呢?我們采用這樣一個策略:如果你指定了 uidHash 或者 uid,我們就可以拿 uidHash 和 uid 作為這樣一個對應關系的 Key。如果沒有,我們會遍歷整個拓撲圖,按照廣度優先的順序,根據算子在拓撲圖中的位置生成確定的唯一的 ID。拿到唯一的 ID 之后,就可以得到一個確定的關系了。

    2、背壓量化

    下面介紹一下我們的第二個改進,背壓量化。目前觀測背壓有兩種方式:

  • 第一種方式是通過 Flink UI 的背壓面板,可以非常直觀的查看當前的背壓情況。但是它也有些問題:第一,有的場景下采集不到背壓。第二,無法跟蹤歷史背壓情況。第三,背壓影響不直觀。第四,在大并行度的時候背壓采集會有一定的壓力。
  • 另外一種觀測背壓的方式是基于 Flink Task Metrics 指標。比如說,它會上報 inPoolUsage、outPoolUsage 這些指標,然后把它采集到 Prometheus 進行一個查詢,這種方式可以解決背壓歷史跟蹤的問題。不過它有其他一些問題:第一,不同 Flink 版本的背壓指標含義有一定差異。第二,分析背壓有一定門檻,你需要對整個背壓相關的指標有比較深的認識,聯合進行分析。第三,背壓的影響不是那么直觀,很難衡量它對業務的影響。

    針對這個問題,我們的解決方案是采集背壓發生的位置、時間和次數指標,然后上報上去。將量化的背壓監控指標與運行時拓撲結合起來,就可以很直觀的看到背壓產生的影響 (影響任務的位置、時長和次數)。

    3、文件系統支持多配置

    下面介紹下文件系統支持多配置的功能。

    目前在 Flink 中使用文件系統時,會使用 FileSystem.get 傳入 URI,FileSystem 會將 shceme+authority 作為 key 去查找緩存的文件系統,如果不存在,根據 scheme 查找到 FileSystemFactory 調用 create 創建文件系統,返回之后就可以對文件進行操作了。不過,在平臺實踐過程中,經常會遇到這樣的問題:

  • 第一, 如何把 checkpoint 寫入公共 HDFS,把業務數據寫入另外的 HDFS?比如在平臺統一管理狀態,用戶不關注狀態的存儲,只關注自己業務數據讀寫 HDFS 這樣的場景,會有這樣的需求。怎么滿足這樣的一個業務場景呢?一個方案是可以把多個 HDFS 集群的配置進行融合,但是它會有個問題。就是如果多個 HDFS 集群配置有沖突的話,合并會帶來一定的問題。另外,可以考慮一些聯邦的機制,比如 ViewFs,但這種機制可能又有點重。是否有其它更好的方案呢?
  • 第二, 如何將數據從一個 OSS 存儲讀出、處理后寫到另外一個 OSS 存儲?

    這兩個問題都涉及到如何讓 Flink 的同一個文件系統支持多套配置。我們的解決方案是通過使用不同的scheme指定和隔離不同的配置。以 HDFS 支持多配置為例,如下圖所示:

  • 第一步,在配置中設置自定義 scheme (aaHDFS) 的綁定的 scheme (HDFS) 及對應 HDFS 配置路徑。
  • 第二步,在調用 FileSystem.get 時,從 aaHDFS 對應的路徑加載 Hadoop 配置。
  • 第三步,在讀寫 HDFS 時,使用 HadoopFileSystemWrapper 將用戶自定義 scheme 的路徑 (aaHDFS://) 轉換為真實的 hadoop 路徑 (HDFS://)。

    我們也做了許多其它的優化和擴展,主要分為三大塊。

  • 第一塊是性能的優化,包括 HDFS 優化 (合并小文件、降低 RPC 調用)、基于負載的動態 rebalance、Slot 分配策略擴展 (順序、隨機、按槽分散) 等等。
  • 第二塊是穩定性的優化,包括 ZK 防抖、JM Failover 優化、最后一次 checkpoint 作為 savepoint 等等。
  • 第三塊是易用性的優化,包括日志增強 (日志分離、日志級別動態配置)、SQL 擴展 (窗口支持增量計算,支持offset)、智能診斷等等。

    四、未來規劃

    最后是未來規劃。歸納為 4 點:

  • 第一,持續完善 SQL 平臺。持續增強完善 SQL 平臺,推動用戶更多地使用 SQL 開發作業。
  • 第二,智能診斷和自動調整。全自動智能診斷,自適應調整運行參數,作業自治。
  • 第三,批流一體。SQL 層面批流一體,兼具低延遲的流處理和高穩定的批處理能力。
  • 第四,AI 探索實踐。批流統一和 AI 實時化,人工智能場景探索與實踐。

    原文鏈接:http://click.aliyun.com/m/1000293113/

    本文為阿里云原創內容,未經允許不得轉載。

  •  
    (文/媒體小英)
    免責聲明
    本文僅代表作發布者:媒體小英個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯系
    客服

    聯系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    日韩欧美国产免费看清风阁