揭秘 ChunJun:如何實現 e2e&session 日誌隔離

来源:https://www.cnblogs.com/DTinsight/archive/2023/09/15/17704949.html
-Advertisement-
Play Games

本文將從 e2e 的基本介紹,e2e 的使用與擴展,session 日誌隔離三個維度為大家帶來 ChunJun e2e & session 日誌隔離的分享。 大量具體代碼和演示請看視頻教程⬇️ 視頻課程: https://www.bilibili.com/video/BV1ru411P7oZ/?sp ...


本文將從 e2e 的基本介紹,e2e 的使用與擴展session 日誌隔離三個維度為大家帶來 ChunJun e2e & session 日誌隔離的分享。

大量具體代碼和演示請看視頻教程⬇️

視頻課程:

https://www.bilibili.com/video/BV1ru411P7oZ/?spm_id_from=333.999.0.0

課件獲取:

https://www.dtstack.com/resources/1052?src=szsm

ChunJun 為何選擇 e2e 測試

ChunJun 項目是基於 Flink 進行擴展,並開發了大量插件來支持數據同步和 SQL 執行,當前支持的數據源插件已經超過50個,所以如何保證各個插件的質量是 ChunJun 非常迫切的需求。以下是兩種測試方式:

單元測試

· 目的:測試代碼的單個部分(例如函數、方法或類)以確保它們按預期工作

· 速度:通常非常快,因為它們只測試小的代碼片段,並且經常在隔離的環境中運行,不依賴外部資源

· 範圍:覆蓋範圍有限,雖然單元測試可以高效得捕獲代碼的邏輯錯誤,但它們不能檢測集成錯誤或複雜的交互問題

● 端到端測試(e2e測試

· 目的:模擬真實場景來驗證整個系統的行為,它從用戶的角度測試應用程式,確保所有組件(前端、後端、資料庫、其他服務等)一起工作

· 速度:相對較慢,因為它們經常需要啟動整個應用程式,與真實的資料庫或外部服務進行交互

· 範圍:更全面地測試整個應用程式的工作流程,它們可以捕獲在單元測試中可能被遺漏的錯誤,如集成問題、配置錯誤、網路問題等

使用單元測試,大量歷史插件的單測補充,成本太大,且單測的質量以及範圍等都很難把控。而 e2e 測試只需要編寫各種插件的腳本並直接運行,並根據任務結果來判斷對應插件的可用性,這是一種比較方便並且更加全面的測試方法,所以我們選擇了增加 e2e 模塊來驗證各個插件。

e2e 的使用與擴展

e2e 使用-模塊介紹

ChunJun-e2e 模塊如下圖所示:

file

e2e 模塊主要分為3部分:

· containers 模塊:基於 TestContainer 擴展的各個數據源 container

· test 模塊:e2e 測試的各個插件入口

· resources 里的 docker 模塊: 各個數據源的 DockFile

ChunJun-e2e 模塊整合了 ChunJun-client 模塊,主要是藉助 TestContainer 在 Docker 環境中啟動 Flink 的 standlone 環境以及各個數據源。因此只需要編寫需要測試的 json 文件之後,通過 ChunJun-client 模塊快速提交任務到 standalone 集群中進行任務的運行,並根據任務運行結果等信息來判斷任務是否通過。

當前 ChunJun-e2e 模塊已經支持了 MySQL、PgSQL、Oracle、FTP、EMQX 的測試,後續社區會持續性的補充 e2e 測試的插件。

e2e 使用-代碼分析

● ChunJunFlinkStandaloneTestEnvironment

· 內部封裝了一個 Flink 環境

· 提交任務和等待任務結束的方法

內置的 flinkStandaloneContainer 即為任務運行時所在的 flink standlone 集群。

file

● 對 stream 插件的測試用例

test 方法里只需要 submitSyncJobOnStandLone 提交 json 腳本到 Flink 的 stabdlone 集群里,通過 waitUntilJobFinished 獲取任務結果併進行判斷。

file

e2e 使用-貢獻 e2e 插件

貢獻貢獻 e2e 插件的簡單流程:

· 編寫所需數據源的 DockerFile 文件

· 基於 TestContainer 和第一步的 DockerFile 創建對應的數據源 container

· 編寫插件任務 json 腳本

· 繼承 ChunjunFlinkStandaloneTestEnvironment,通過內置的提交方法提交任務即可

file

基於 TestContainer 進行擴展也是很簡單的,只需要繼承 GenericContainer 類,傳遞 DockerFile 文件路徑即可,TestContainer 對於 JDBC 類型數據源提供了 JdbcDatabaseContainer 抽象類。

框架所需要的環境 提交等介面都已經在 ChunJunFlinkStandaloneTestEnvironment 提供了,只需要編寫對應的數據源 DockerFile 和 json 腳本即可。

file

session 日誌隔離

session 日誌隔離-介紹

Flink on session 場景下,如果 TaskManager 不關閉,那麼這個 TaskManager 里的所有任務都會寫入同一個日誌文件中,導致需要查看任務日誌排查問題時,比較難查找到具體的每個任務日誌。

如果 TaskManager 里的每個任務的日誌都在不同的日誌文件里,每個日誌文件的名稱就是 jobid,那麼在查看任務日誌時只需要查看 jobid 的日誌文件即可。

為瞭解決這個問題,袋鼠雲內部通過修改 Flink 源碼以及 Log4j 的擴展,實現了 Flink on session 場景下,TaskManager 里每個任務的日誌會寫入對應的 jobid 日誌文件里。

file

TaskExecutor 在接受到任務之後,會轉為 Task 對象。Task 對象是一個 Runnable 實現,內部持有一個線程,然後通過其內部線程執行客戶代碼邏輯。

因此每個 Task 都由一個 Thread 對應,在 Task 整個生命周期里,其 Thread 和 Task 都是綁定的。因此在 Run 的時候,將 jobId 放入 ThreadLocal 里即可。

之後,我們需要在Flink 源碼中的org.apache.flink.runtime.taskmanager.Task#run裡加上 MDC.put("jobId", jobId.toString()); 即可。

父子線程場景下需要加上下述參數:

env.java.opts.taskmanager: "-DisThreadContextMapInheritable=true"
file

Log4j 擴展

Flink1.12 支持 Log4j2 進行日誌輸出,在日誌隔離方案中通過擴展 Log4j2 的 AbstractOutputStreamAppender,實現了通過一個自定義的 appender 來完成日誌輸出。

自定義的 appender 可以根據 MDC 里的 jobid 輸出到對應的日誌文件,因此其擴展邏輯為根據 MDC 里的 jobid 是否為空。如果不為空,則輸出到 jobid 對應的文件,否則就是預設的 taskmanager.log。

file

最終日誌隔離方案流程如下:

· 修改 Flink 源碼,增加 MDC.put("jobId", jobId.toString())

· 打包 Flink 源碼,將 Flink-dist 替換開源的 Flink-dist

· 基於 Log4j2 擴展 appender,並打包後的 jar 放入 Flink 的 lib 目錄下

· 修改 Flink conf 目錄下的 log4j.properties 文件,將 RollingFileAppender 替換為自定義的擴展 apped 類即可

《數棧產品白皮書》:https://www.dtstack.com/resources/1004?src=szsm

《數據治理行業實踐白皮書》下載地址:https://www.dtstack.com/resources/1001?src=szsm

想瞭解或咨詢更多有關袋鼠雲大數據產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網:https://www.dtstack.com/?src=szbky

同時,歡迎對大數據開源項目有興趣的同學加入「袋鼠雲開源框架釘釘技術qun」,交流最新開源技術信息,qun號碼:30537511,項目地址:https://github.com/DTStack


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文深入探討Go語言中的流程式控制制語法,包括基本的if-else條件分支、for迴圈、switch-case多條件分支,以及與特定數據類型相關的流程式控制制,如for-range迴圈和type-switch。文章還詳細描述了goto、fallthrough等跳轉語句的使用方法,通過清晰的代碼示例為讀者提供 ...
  • 一、什麼是kafka,什麼是rabbit Kafka是由Scala語言開發的一種分散式流處理框架,主要用於處理活躍的流式數據,以及大數據量的數據處理。它採用發佈-訂閱模型,支持消息的批量處理,數據的存儲和獲取是本地磁碟順序批量操作,這使得消息處理的效率較高,吞吐量較大。 RabbitMQ則是由Erl ...
  • InlineHook 是一種電腦安全編程技術,其原理是在電腦程式執行期間進行攔截、修改、增強現有函數功能。它使用鉤子函數(也可以稱為回調函數)來截獲程式執行的各種事件,併在事件發生前或後進行自定義處理,從而控制或增強程式行為。Hook技術常被用於系統加速、功能增強、等領域。本章將重點講解Hook... ...
  • pycharm作為開發python程式的最適合編輯器,幾乎已經普及了所有的python開發者 但是還有很多同學不會免費使用pycharm的方法,今天我就給大家普及兩種Pycharm安裝和免費激活的方式 本文提供圖文教程,一步一步地演示永久激活 Pycharm 的方法。適用於最新的幾個版本,步驟簡單, ...
  • 問題 在Spring Cloud項目中,前後端分離目前很常見,在調試時,會遇到兩種情況的跨域: 前端頁面通過不同功能變數名稱或IP訪問微服務的後臺,例如前端人員會在本地起HttpServer 直連後臺開發本地起的服務,此時,如果不加任何配置,前端頁面的請求會被瀏覽器跨域限制攔截,所以,業務服務常常會添加如下 ...
  • 在開發應用程式時,記錄日誌是一項關鍵的任務,以便在應用程式運行時追蹤問題、監視性能和保留審計記錄。Go 語言提供了靈活且強大的日誌記錄功能,可以通過多種方式配置和使用。其中一個常用的日誌記錄庫是 github.com/natefinch/lumberjack,它提供了一個方便的方式來處理日誌文件的輪 ...
  • 本章節主要討論瞭如何通過零拷貝技術來優化文件傳輸的性能。零拷貝技術主要通過減少用戶態和內核態之間的上下文切換次數和數據拷貝次數來提高性能。具體來說,介紹了兩種實現零拷貝的方式:mmap + write和sendfile。使用mmap + write可以減少一次數據拷貝過程,而使用sendfile系統... ...
  • 第1個虛擬項目 1. 前言 點燈開啟了我們的FPGA之路,那麼我們來繼續沙盤演練。 用一個虛擬項目,來入門練習,以此步入數字邏輯的大門。 Key Words:FIFO 、SOF 、EOF、計數器、緩存、時序圖、方案設計 2. 項目要求 1) 輸入報文長度64~2048位元組; 2) 輸入報文之間最小間 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...