【问题标题】:JSON Path 2.3.0 conflicts with hadoop 2.7 Environment JSON-smart1.2.0.jarJSON 路径 2.3.0 与 hadoop 2.7 环境 JSON-smart1.2.0.jar 冲突
【发布时间】:2020-09-23 14:52:02
【问题描述】:
  1. 在 HDFS 位置有一个 JSON 输入
  2. 需要解析 JSON 并汇总结果
  3. 使用 PIG UDF,它使用 JSON 路径库
  4. 在hadoop2.7环境jar上:json-smart1.2,json-path1.2是硬绑定的
  5. 每当我执行 PIG Mapreduce 时都会抛出异常

    java.lang.NoSuchFieldError: defaultReader
    at com.jayway.jsonpath.spi.json.JsonSmartJsonProvider.<init>(JsonSmartJsonProvider.java:39)
    at com.jayway.jsonpath.internal.DefaultsImpl.jsonProvider(DefaultsImpl.java:21)
    at com.jayway.jsonpath.Configuration.defaultConfiguration(Configuration.java:174)
    at com.jayway.jsonpath.internal.JsonContext.<init>(JsonContext.java:52)
    at com.jayway.jsonpath.JsonPath.parse(JsonPath.java:596)
    

为了解决问题尝试了以下选项

选项 1: 尝试设置注册 json-smart2.3.jar & json-path2.3.0.jar 但没有有希望的结果(因为它引用的 Jar 是 json-path1.2.jar)

选项 2: 将我的模块依赖项降级为 json-path1.2.jar 没有结果

选项 3: 使用Custom classLoaders尝试加载json-path2.3.0 jar的jar吧 加载类进入 Org.slf4j 绑定问题

已识别多个绑定路径,但 sun.misc 类加载器出现问题

Failed to instantiate SLF4J LoggerFactory
Reported exception:
java.lang.NullPointerException
    at sun.net.util.URLUtil.urlNoFragString(URLUtil.java:50)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:485)
    at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:457)
    at sun.misc.URLClassPath.access$100(URLClassPath.java:64)
    at sun.misc.URLClassPath$1.next(URLClassPath.java:239)
    at sun.misc.URLClassPath$1.hasMoreElements(URLClassPath.java:250)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:601)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:599)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader$3.next(URLClassLoader.java:598)
    at java.net.URLClassLoader$3.hasMoreElements(URLClassLoader.java:623)
    at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
    at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
    at org.slf4j.LoggerFactory.findPossibleStaticLoggerBinderPathSet(LoggerFactory.java:238)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:138)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:120)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:331)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
    at com.jayway.jsonpath.internal.JsonContext.<clinit>(JsonContext.java:41)
    at com.jayway.jsonpath.internal.ParseContextImpl.parse(ParseContextImpl.java:38)
    at com.jayway.jsonpath.JsonPath.parse(JsonPath.java:599)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.optum.pdm.ReferenceDataUpdate.addURL(ReferenceDataUpdate.java:112)
    at com.optum.pdm.ReferenceDataUpdate.main(ReferenceDataUpdate.java:124)
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.optum.pdm.ReferenceDataUpdate.addURL(ReferenceDataUpdate.java:112)
    at com.optum.pdm.ReferenceDataUpdate.main(ReferenceDataUpdate.java:124)
Caused by: java.lang.ExceptionInInitializerError
    at com.jayway.jsonpath.internal.ParseContextImpl.parse(ParseContextImpl.java:38)
    at com.jayway.jsonpath.JsonPath.parse(JsonPath.java:599)
    ... 6 more
Caused by: java.lang.IllegalStateException: Unexpected initialization failure
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:167)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:120)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:331)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
    at com.jayway.jsonpath.internal.JsonContext.<clinit>(JsonContext.java:41)
    ... 8 more
Caused by: java.lang.NullPointerException
    at sun.net.util.URLUtil.urlNoFragString(URLUtil.java:50)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:485)
    at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:457)
    at sun.misc.URLClassPath.access$100(URLClassPath.java:64)
    at sun.misc.URLClassPath$1.next(URLClassPath.java:239)
    at sun.misc.URLClassPath$1.hasMoreElements(URLClassPath.java:250)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:601)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:599)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader$3.next(URLClassLoader.java:598)
    at java.net.URLClassLoader$3.hasMoreElements(URLClassLoader.java:623)
    at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
    at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
    at org.slf4j.LoggerFactory.findPossibleStaticLoggerBinderPathSet(LoggerFactory.java:238)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:138)
    ... 13 more

有人可以建议我解决这个问题吗,可以找到一个关于 weblogic 的 stackoverflow 链接,而不是可以应用于 Hadoop2.7 的通用解决方案 (JSON Parser -java.lang.NoSuchFieldError: defaultReader)

【问题讨论】:

  • 解决方案有运气吗?我也面临同样的问题!!!
  • 我们正在使用另一个包 com.nebhale.jsonpathjsonpath
  • @SyedMazreena : Jsonpath 的所有属性是否都在您提到的那个中可用?
  • @SyedMazreena - 我目前正在使用 Hadoop 2.6 是否有机会在更高版本的 Hadoop 中修复该问题?
  • @SandeepShetty - 如果你能解决这个问题,请告诉我。

标签: java json apache-pig hadoop2 jsonpath


【解决方案1】:

由于 hadoop 环境(Pig、hdfs、Hive 等)使用的是 json-path-2.3.0,其更好的用户 Mapper 逻辑应该使用另一个版本“jsonpath-1.0.jar”将解决问题

【讨论】:

    【解决方案2】:

    提供自定义实现来加载/解析 JSON,这样我们就可以避免使用 Hadoop/lib 的 Json-smart-2.x/1.x

      public static void changeJsonPathConfig() {
    
        if (!configChanged) {
    
            Configuration.setDefaults(new Configuration.Defaults() {
    
    
    
                private final JsonProvider jsonProvider = new GsonJsonProvider(
    
                        new GsonBuilder().serializeNulls().create());
    
                private final MappingProvider mappingProvider = new GsonMappingProvider();
    
    
    
                @Override
    
                public JsonProvider jsonProvider() {
    
                    return jsonProvider;
    
                }
    
    
    
                @Override
    
                public MappingProvider mappingProvider() {
    
                    return mappingProvider;
    
                }
    
    
    
                @Override
    
                public Set<Option> options() {
    
                    return EnumSet.noneOf(Option.class);
    
                }
    
            });
    
            configChanged = true;
    
        }
    
    }
    

    【讨论】:

    • 以上似乎是完美的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多