Hive UDF IP解析(一):依賴包兼容性問題


Java依賴環境:

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.maxmind.db</groupId>
    <artifactId>maxmind-db</artifactId>
    <version>1.2.2</version>
</dependency>
<dependency>
    <groupId>com.maxmind.geoip2</groupId>
    <artifactId>geoip2</artifactId>
    <version>2.11.0</version>
</dependency>        

根據官方提供的API,開發測試時,出現以下兼容性問題:

GeoIP2 java API : http://maxmind.github.io/GeoIP2-java/

java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;Ljava/util/List;)V
        at com.maxmind.db.Decoder.decodeArray(Decoder.java:272) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Decoder.decodeByType(Decoder.java:156) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Decoder.decode(Decoder.java:147) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Decoder.decodeMap(Decoder.java:281) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Decoder.decodeByType(Decoder.java:154) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Decoder.decode(Decoder.java:147) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Decoder.decode(Decoder.java:87) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Reader.<init>(Reader.java:132) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.db.Reader.<init>(Reader.java:116) ~[maxmind-db-1.2.2.jar:?]
        at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:66) ~[geoip2-2.11.0.jar:2.11.0]
        at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:54) ~[geoip2-2.11.0.jar:2.11.0]
        at com.maxmind.geoip2.DatabaseReader$Builder.build(DatabaseReader.java:160) ~[geoip2-2.11.0.jar:2.11.0]

根據錯誤信息,定位到fasterxml的兼容出現故障,最后追綜到hive2.3.0版本中avatica-1.8.0.jar居然包含了com.fasterxml.jackson包。

對應的jackson-datamind的版本為2.6.3,而我們要用要的geoip2依賴jackson-datamind的版本為2.9.3,這兩個版本存在上面報錯信息地方的方法的不同。

 

 找到了這個梗,下面考慮解決方案:

方案一: 修改geoip2的源程序,從開始引用的類com.maxmind.geoip2.DatabaseReader.class

一直到報錯的這個方法的類全部重命名調用,並手工添加這個未找到的方法。然后打包編譯,這樣就繞過了依賴包的版本問題。

方案二: 經過測試沒通過。

本想直接替換hive中avatica-1.8.0.jar包,升級為新版本,但是存在其他依賴,無法替換,所以只有第一種方法。

替換hive的lib庫中avatica-1.8.0.jar,使用最新的avatica-1.11.0.jar

在新版本的avaitca-1.11.0.jar版本中,我們找不到com.fasterxml.jackson這個文件夾了,並且依賴的POM中顯示依賴的是2.9.4版本。

這樣就不會引起多個相同的類的沖突了。

但是也許會有一些潛在的風險,就是hive本身的環境是否對新版的avatica-1.11.0.jar的支持。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM