導航:首頁 > 源碼編譯 > spark303編譯

spark303編譯

發布時間:2023-02-11 20:36:37

① Apache Zeppelin 遷移 - Jar 包沖突解決與思考

最近整個公司大數據集群遷移(cdh -> ambri hdp),隨之 Zeppelin 也需要遷移,由於各個組件版本有變化,且 Zeppelin 源碼是有過改動的,遷移起來很麻煩。經過一周的折騰,終於把 Zeppelin 從 cdh 環境遷移至 hdp 環境。同時,在解決問題期間,對 Java 類載入,jar 沖突問題有了更進一步的認識。

版本有所變化,當然得重新編譯 Zeppelin ,指定下 spark hadoop 大版本,重新編譯:

經過配置參數修改,遷移過去 hive 沒問題,spark 運行報錯,經過一周的折騰終於解決,主要是版本依賴沖突問題。

現象:跑 spark sql 報 NoSuchMethodError 錯誤如下:

連 hive metastore 後調用 close() 方法, FacebookService( from: libfb303.jar ) 最終調用 TClient.sendBaseOneway ( to: libthrift.jar
查看 libthrift 源碼, 0.9.3 版本有 sendBaseOneway , 而 0.9.2 版本沒有。
結論: libfb303.jar 的 facebookservice 調用了 libthrift 0.9.3 版本的中的方法,而 JVM 載入了 0.9.2 版本, 導致 NoSuchMethodError。

查看 zeppelin 源碼, zeppelin-spark*.jar , zeppelin-spark-dependencices*.jar 都 shaded 了 libthrift 這個 jar 包。
打包信息如下:

jar 所在目錄:

這里也有一個取巧的方法,將 jar 包解壓刪除 thrift 並重新打包。通過 linux 下 jar 命令即可完成。

如果深入理解 Java 類載入機制,jar包沖突相關原因,對定位解決這類問題有很大的幫助 。
一般來說遇到: ClassNotFoundExpection , NoClassDefFoundError 和 NoSuchMethodError ,有可能是包沖突造成的。

先來解釋下這個三個問題的區別 [1]:

讀完這個 重新看待Jar包沖突問題及解決方案 [3]收獲良多,總結部分筆記,對於沖突,存在兩個場景:

這兩個場景的存在,會導致 JVM 載入到了錯誤的類,導致與預期場景不一致出現上面描述的錯誤等 ,導致出現 ClassNotFoundExpection , NoClassDefFoundError 和 NoSuchMethodError 等異常。

因為 maven 的傳遞依賴機制,maven 引入依賴類似於圖的遍歷,從子往父溯源,引入所有相關依賴。這樣為開發節省了效率,但同時可能引入不同版本的 jar 包,導致在運行時出現包沖突。存在多個依賴,maven 具體選擇引入哪個依賴,規范來源於仲裁機制,仲裁機制如下:

常見的解決依賴沖突的辦法有兩個:

下面這段配置取自 Zeppelin pom,聲明選擇的依賴的 avro 版本,同時排除了部分依賴 如 netty。

還有一種沖突是同樣的類,出現在不同的包裡面,例如 A 和 B 包都有類 C,JVM 在載入 C 的時候到底是選擇 A 還是 B。這個選擇取決於:

如果遇到 ClassNotFoundExpection , NoClassDefFoundError 和 NoSuchMethodError ,有可能是包沖突造成的。

[1] https://stackoverflow.com/questions/1457863/what-causes-and-what-are-the-differences-between-noclassdeffounderror-and-classn/1457879#1457879
[2] classnotfoundexception-vs-noclassdeffounderror
[3] 重新看待Jar包沖突問題及解決方案

② 怎樣在spark單機上編寫運行scala程序

使用Scala寫一個測試代碼:

object Test {
def main(args: Array[String]): Unit = {
println("hello world")
}
}

就把這個Test視為類,項目組織結構如:

③ spark1.3編譯出錯,求解決方法

把 pom.xml文件中的scalastyle的相關改成false
<groupId>org.scalastyle</groupId>
<artifactId>scalastyle-maven-plugin</artifactId>
<version>0.4.0</version>
<configuration>
<verbose>false</verbose>
<failOnViolation>false</failOnViolation>
<includeTestSourceDirectory>false</includeTestSourceDirectory>
<failOnWarning>false</failOnWarning>

④ spark的開發環境應該是怎樣的

indows下spark開發環境配置
特註:windows下開發spark不需要在本地安裝hadoop,但是需要winutils.exe、hadoop.dll等文件,前提是你已經安裝了eclipse、maven、jdk等軟體
spark支持jdk版本建議是1.8及以上,如果開發spark建議將jdk編譯版本設置為1.8

我選擇的spark是spark-1.4.0-bin-hadoop2.6.tgz,故以該版本為例

第一步:下載spark-1.4.0-bin-hadoop2.6.tgz到本地,並解壓在本地目錄

⑤ Hudi + Spark3入門第一課

歡迎訪問 我的博客

這兩個包不用自己編譯,可以從maven 中央倉庫 獲取,(頁面很不好找,hudi得把倉庫類目梳理一下了)貼一下。

使用上述預編譯的包,就省略自己編譯的過程了。

官網發布的支持矩陣:

Spark 3 Support Matrix

可以看到hudi 0.10版本默認構建出來是spark3.1的,也可以構建spark3.0的。

⑥ spark源碼二次開發難嗎

spark源碼二次開發不難。掌握了源碼編譯,就具備了對Spark進行二次開發的基本條件了,要修改Spark源碼,進行二次開發,那麼就得從官網下載指定版本的源碼,導入ide開發環境,進行源碼的修改。接著修改完了。

閱讀全文

與spark303編譯相關的資料

熱點內容
編譯檢查的是什麼錯誤 瀏覽:404
加密兔f碼生成器免費 瀏覽:291
思科路由器命令明文加密 瀏覽:171
方舟生存進化伺服器如何改名字 瀏覽:892
央行數字貨幣app怎麼注冊 瀏覽:431
51單片機顯示時間 瀏覽:770
我的世界網易版怎麼壓縮地圖 瀏覽:682
qq小程序雲伺服器和 瀏覽:740
方舟伺服器怎麼玩才好玩 瀏覽:557
單片機的部件 瀏覽:621
編譯原理遍的過程 瀏覽:252
python讀取json字元串 瀏覽:62
ubuntu1404安裝php 瀏覽:634
lua能編譯嗎 瀏覽:118
思仙怎麼看伺服器 瀏覽:660
php微信圖片防盜鏈 瀏覽:800
安卓1怎麼讀音 瀏覽:297
農業app怎麼開通快捷支付 瀏覽:912
pythonredisdict 瀏覽:389
如何攻擊別人網賭伺服器 瀏覽:882