天天看點

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

如何Debug

代碼編寫後,我們需要進行Debug進行邏輯調錯,是以我們并不是想象中的那麼完美。而且這個功能子產品是高度內建的子產品,涉及代碼高達7K行,是以在排查錯誤的時候困難重重,需要有更加仔細的排查錯誤能力和耐心

編譯錯誤合集

下面給大家羅列一下我在開發過程中和調試過程中遇到的一些問題

Maven編譯問題

代碼規範

在開源社群中,代碼品質和代碼規範至關重要,擁有良好的代碼品質和規範使得大家的代碼風格能夠更加好的保持一緻。在國内我一般使用Alibaba Code檢測工具安裝在IDEA上,但是對于開源社群來說,一般使用CodeStyle和FindBugs工具進行檢查

在Dev下面我們可以看到有這些檔案,仔細觀察其實就是一些代碼模闆,可以看到template結尾,據此推測應該是社群為了規範大家的編碼格式,于是指定一個标準去格式化代碼

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

我們通過IDEA把這個模闆進行導入,并且調整命名為Schema為Carbondata,不影響我們其他代碼使用

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

findbugs檢查

由于我目前是進行代碼測試,而不是說需要送出PR。是以不用嚴格進行代碼檢測或者FindBugs插件進行檢查,是以我們可以先暫時跳過編譯,當然也可以通過MVN指令跳過,我這裡手動設定了一下Skip暫時跳過了,如下圖。

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

Scala編譯問題

由于目前Scala的版本支援已經到了Scala2.13了,但是原來PrestoSQL依賴的這個編譯插件比較古老了,我們前往Maven倉庫看看

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

可以看出這個插件在2011開始就沒維護了,我就想是不是官方已經把這個插件移動到其他地方,于是找了一頓,我就找到了 net.alchim31.maven 這個插件作為替代,我就想通過替換此版本并且指定使用JDK11編譯Scala代碼。當然在選擇編譯插件這個也是有講究的,首先要和你Scala的版本對應上,而不是說一昧的追求Maven倉庫最新版本的依賴,像這個插件截止發稿前是4.5.3。這個最新版本支援的Scala2.13的,是以在我這裡就不适合了,是以我們要觀察包裡面的依賴,如下圖

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

通過一番對比後,我認為這個插件是比較适合的,編譯時候同時要注意輸出代碼是JDK11,需要根據對應的Scala版本進行适配

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

剛剛開始我沒有進行适配,是以插件在編譯時候就提示了以下錯誤了,Scala Test 版本過低的問題

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

于是更改編譯POM如下:

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

問題解決

JDK版本編譯問題

因為我的機器預設是使用JDK8版本,而且CarbonData也是JDK8,但是Trino隻支援JDK11.0.11+ 版本,是以在編譯到最後的Trino子產品時候使用JDK8版本編譯就會出現以下錯誤

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

這個時候我們需要單獨進入這個項目下面,選擇JDK11進行編譯

mvn clean install -pl :trino -am  -Djacoco.skip=true -Dfindbugs.skip=true -DskipTests=true -Dspark.version=2.4.5 -Dhadoop.version=2.7.7 -Dhive.version=3.1.0 -Dscala.version=2.11.12

這個步驟中,我還特意去詢問了之前開發Presto老版本的一個社群作者,提了一個ISSUE,他很耐心的回答了我的問題,

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

詳細問答過程可以檢視這裡:

https://github.com/apache/carbondata/issues/4184

最後編譯所需依賴的子產品如下:

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

使用JDK11編譯後無誤,在目錄下面我們可以看到已經編譯好的JAR包。我們移動到Trino的plugin目錄下,然後配置Trino Server相關的一些Server和Worker參數即可運作

最終編譯成功,編譯後我們去到target目錄下找到相關依賴複制過去Trino,具體步驟可以看我第一篇文章

https://www.yuque.com/hongjingzhuanjia/sgf5fd/km4rlr
CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

編譯的子產品和編譯資訊如下:

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

啟動時候JDK版本錯誤

啟動Trino 358 報錯,由于預設JDK使用的是1.8版本導緻無法啟動,在presto330版本裡已經提到,jdk8隻支援到3月的版本。詳細可以檢視下面這個連結:

https://trino.io/docs/current/release/release-330.html

,于是我在本機安裝了JDK11。這裡還需要注意一下,JDK版本是有要求的,官方要求是JDK11.0.11+的版本,是以低版本的JDK還不支援,當使用JDK低版本時候會抛出以下的錯誤

java.lang.UnsupportedClassVersionError: PR/Sort :

Unsupported major.minor version 52.0

需要修改Trino目錄下bin的啟動腳本,強制指定JDK啟動版本,修改内容如下:

PATH=/Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home/bin/:$PATH

java -version

exec "$(dirname "$0")/launcher.py" "$@"

Trino部署參考文檔可以參考下面的文檔

https://trino.io/docs/current/installation/deployment.html

部署成功後,啟動無問題

運作時錯誤

編譯後,我們心歡意喜的想啟動項目,卻發現各種報錯。于是隻能慢慢從一些報錯資訊中找到關鍵問題

使用谷歌IOC架構時候多綁定了Module錯誤

Google依賴注入架構Guice,Trino是通過這個架構注入一些實體和參數的,在綁定的時候由于我多綁定了參數,于是報錯提示如下:

Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for stat.domain.Processor<java.lang.String, java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter) was bound.

後面通過詳細學習Started文檔了解如何使用後,删除綁定了多的錯誤後正常運作

https://github.com/google/guice/wiki/GettingStarted https://baijiahao.baidu.com/s?id=1695099251394966117&wfr=spider&for=pc

缺乏serialization.lib

serialization.lib 這個參數是在後續添加的,這個參數主要是用于标記我們的資料格式需要序列化哪種格式,在我們這邊是需要序列化成CarbonData的格式

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

在剛剛開始的時候忘記添加,導緻運作時候報NPE錯誤,通過排查追蹤HiveSplit可以發現需要用到deserializerClassName

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

通過源碼追蹤可以發現其實是來自Hive下面一些自己定義常量,故我們補充即可

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結
CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

運作成功

經過這麼多磨難,我們終于成功啟動了,然後我們來測試一下基本的查詢功能和中繼資料查詢功能。我們還是以之前的方式一樣啟動Trino-Cli連接配接本地的Trino,然後執行我們的查詢,可以看到在顯示中繼資料、基本查詢已經沒有問題了

CarbonData內建 Presto(Trino)(2)- 運作排錯篇如何Debug編譯錯誤合集運作時錯誤總結

到此為止 內建Trino的基本功能已經完成了

總結

經過這番折騰,Trino成功支援了CarbonData的內建與查詢。通過內建Trino簡單查詢的複雜步驟大大的提高了我對代碼的Debug和工程能力,讓我之後在後續的性能測試中能夠更加友善和深入的解決問題。目前此代碼已經送出PR,具體可以關注下面連結給個Start或者小火箭。後續還會根據導師指導提高測試的資料量和編寫業務模拟資料腳本去測試性能所帶來的提升,并且完善使用文檔和傳遞

TrinoPR代碼庫分支:

https://github.com/apache/carbondata/pull/4198

Github-Trino-358-alpha:

https://github.com/czy006/carbondata/tree/trino-358-alpha