Dolphinscheduler不重啟載入Oracle驅動

海豚调度發表於2024-05-28

轉載自劉茫茫看山

問題背景

某天我們的租戶反饋資料庫連線缺少必要的驅動,我們透過日誌檢視確實是缺少部分資料庫的驅動,因為DolphinScheduler預設只帶了Oracle和MySQL的驅動,並且需要將pom檔案中的test模式去掉才可以在打包的時候引入。我們的任務量比較大,在3.0存在容錯機制的情況下,重啟Master和Worker時,任務會重複容錯多次,對使用者使用很不友好,對Yarn叢集的壓力也比較大,所以非必要不會重啟服務,這就需要在不重啟的前提下載入新的驅動包。

遇到的問題

當開始做的時候,想的過於簡單,下面是Worker模組下的啟動命令,libs目錄後面載入的是*,所以我們認為程式肯定會自動載入jar。

file

但是當我們將jar放到對應的目錄後,重啟測試資料庫連線,發現還是報了和之前一樣的問題。

Could not load driverClass oracle.jdbc.driver.OracleDriver

我們需要了解java.class.path為什麼沒有將我們新新增的驅動包載入進去,於是我們找出了worker服務的程序id,並透過jinfo命令檢視類路徑的載入情況,發現java.calss.path對應的目錄從*變成了jar包的絕對路徑,我們新新增的jar的絕對路徑沒有在裡面,所以不會讀取驅動。

file

file

file

解決方法

我們最熟悉的類載入模式就是雙親委派機制,在類載入模式中存在一個ExtensioinClassloader類,它是java.lang.ClassLoader的子類,該類載入器負責載入Java的擴充套件庫JAVA_HOME/jre/lib/ext/*.jar或者java.ext.dirs路徑下的內容。
file

我們透過jinfo命令檢視程序中的擴充套件目錄,發現java.ext.dirs對應的值不是絕對路徑,也就表示我們可以嘗試透過將額外的驅動jar包放到擴充套件目錄中載入。

file

這裡以Oracle驅動為例,透過將Oracle驅動jar放到對應的擴充套件目錄中,測試資料來源連線情況,連線成功,希望可以給有需要的小夥伴提供有價值的參考。

本文由 白鯨開源 提供釋出支援!

相關文章