• 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的支持。

  • 相关阅读:
    文件同步
    Renesas PPP Mode
    PYTHON 常用API ***
    Python DB
    Python VIL Realse
    C BIN加密
    Python VIL Service Bin
    Python 定期检查Build_setting的编译情况
    Python 字串处理
    IP分片(IP Fragment)
  • 原文地址:https://www.cnblogs.com/30go/p/8650022.html
Copyright © 2020-2023  润新知