二維碼
        企資網

        掃一掃關注

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

        Apache_Flink_在京東的實踐與優化

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

        本文整理自京東高級技術專家付海濤在 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,利用它的微批處理來應對這種業務場景。

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

      1. 于是在 2018 年,我們引入了 Flink,同時開始基于 K8s 進行實時計算容器化的升級改造;
      2. 到了 2019 年,我們所有的實時計算任務都跑在 K8s 上了。同年我們基于 Flink 1.8 打造了全新的 SQL 平臺,方便業務開發實時計算應用;
      3. 到了 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 年也進行了一個容器化方案的升級,后面會詳細介紹。

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

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

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

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

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

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

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

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

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

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

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

        三、Flink 優化改進

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

        1、預覽拓撲

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

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

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

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

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

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

        2、背壓量化

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

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

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

        3、文件系統支持多配置

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

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

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

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

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

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

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

        四、未來規劃

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

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

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

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

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

        反饋

        用戶
        反饋

        久久亚洲2019中文字幕| 人妻无码视频一区二区三区| 国产成年无码久久久免费| 无码国产精品一区二区免费vr | 久久久无码一区二区三区 | 亚洲精品一级无码中文字幕| 免费A级毛片av无码| 色欲综合久久中文字幕网| 无码伊人66久久大杳蕉网站谷歌| 天天看高清无码一区二区三区| 中文字幕精品亚洲无线码一区应用 | 中文字幕手机在线观看| 日韩免费无码一区二区三区| 在线天堂中文WWW官网| 色欲A∨无码蜜臀AV免费播| 无码专区中文字幕无码| 久久ZYZ资源站无码中文动漫| 公和熄小婷乱中文字幕| 18禁无遮拦无码国产在线播放| 日本中文一区二区三区亚洲| 狠狠精品干练久久久无码中文字幕| 亚洲乱码中文字幕综合234| 在线看福利中文影院| 无码无遮挡又大又爽又黄的视频| 91中文字幕在线观看| 亚洲VA中文字幕不卡无码| 娇小性色xxxxx中文| 国产高清无码视频| 亚洲AV永久无码精品网站在线观看| www.中文字幕| 中文字幕亚洲码在线| 精品无码人妻夜人多侵犯18| 日韩av无码免费播放| 中文字幕在线免费看线人| 中日精品无码一本二本三本| 日韩av无码一区二区三区| 无码爆乳护士让我爽| 亚洲激情中文字幕| 中文字幕无码精品亚洲资源网久久| 国产精品毛片无码| 人妻无码一区二区三区AV|