Spark kryo Jar包冲突问题排查

错误日志

Exception in thread "adaptive-query-stage-0" java.lang.NoSuchMethodError: com.esotericsoftware.kryo.Kryo.setInstantiatorStrategy(Lorg/objenesis/strategy/InstantiatorStrategy;)V
	at com.twitter.chill.KryoBase.setInstantiatorStrategy(KryoBase.scala:96)
	at com.twitter.chill.EmptyScalaKryoInstantiator.newKryo(ScalaKryoInstantiator.scala:59)
	at org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:97)
	at org.apache.spark.serializer.KryoSerializerInstance.borrowKryo(KryoSerializer.scala:324)
	at org.apache.spark.serializer.KryoSerializerInstance.<init>(KryoSerializer.scala:309)

问题分析

  • KryoBase的setInstantiatorStrategy 方法参数类型为 org.objenesis.strategy.InstantiatorStrategy,super调用Kryo.setInstantiatorStrategy() 方法,但是该方法的参数类型为com.esotericsoftware.shaded.org.objenesis.strategy.InstantiatorStrategy
  • 通过反编译 com.esotericsoftware.kryo.Kryo发现源码中确实是在引用com.esotericsoftware.shaded.org.objenesis.strategy.InstantiatorStrategy 类,太坑了.
  • 和官方给的源码都不一致。在官方发布的包中出现引用shaded的类,导致chill_2.11-0.8.4.jar 和Kryo中的方法冲突。看来官方还是推荐使用kryo-shaded包,但是kryo-shaded 中jar的代码被打包时搞乱了,别人也没法用~~~
  • 通过对比发现新的spark 使用了kryo-shaded-3.0.3.jar ,所以删除 kryo-2.22.jar 包,问题解决。
$ sm -d com.esotericsoftware.kryo.Kryo setInstantiatorStrategy
 declaring-class  com.twitter.chill.KryoBase                                                                                                                  
 method-name      setInstantiatorStrategy                                                                                                                     
 modifier         public                                                                                                                                      
 annotation                                                                                                                                                   
 parameters       org.objenesis.strategy.InstantiatorStrategy                                                                                                 
 return           void                                                                                                                                        
 exceptions                                                                                                                                                   

 declaring-class  com.esotericsoftware.kryo.Kryo                                                                                                              
 method-name      setInstantiatorStrategy                                                                                                                     
 modifier         public                                                                                                                                      
 annotation                                                                                                                                                   
 parameters       com.esotericsoftware.shaded.org.objenesis.strategy.InstantiatorStrategy                                                                     
 return           void                                                                                                                                        
 exceptions 

    org.objenesis.strategy.InstantiatorStrategy

$ sc -d *InstantiatorStrategy
 class-info        com.esotericsoftware.shaded.org.objenesis.strategy.InstantiatorStrategy                                                                    
 code-source       /usr/lib/spark-2.3.0-bin-ae/jars/kryo-2.22.jar                                                                                             
 name              com.esotericsoftware.shaded.org.objenesis.strategy.InstantiatorStrategy                                                                    
 isInterface       true                                                                                                                                       
 isAnnotation      false                                                                                                                                      
 isEnum            false                                                                                                                                      
 isAnonymousClass  false                                                                                                                                      
 isArray           false                                                                                                                                      
 isLocalClass      false                                                                                                                                      
 isMemberClass     false                                                                                                                                      
 isPrimitive       false                                                                                                                                      
 isSynthetic       false                                                                                                                                      
 simple-name       InstantiatorStrategy                                                                                                                       
 modifier          abstract,interface,public                                                                                                                  
 annotation                                                                                                                                                   
 interfaces                                                                                                                                                   
 super-class                                                                                                                                                  
 class-loader      +-sun.misc.Launcher$AppClassLoader@3cd1a2f1                                                                                                
                     +-sun.misc.Launcher$ExtClassLoader@d6da883                                                                                               
 classLoaderHash   3cd1a2f1                                                                                                                                   

 class-info        org.objenesis.strategy.InstantiatorStrategy                                                                                                
 code-source       /usr/lib/spark-2.3.0-bin-ae/jars/objenesis-2.1.jar                                                                                         
 name              org.objenesis.strategy.InstantiatorStrategy                                                                                                
 isInterface       true                                                                                                                                       
 isAnnotation      false                                                                                                                                      
 isEnum            false                                                                                                                                      
 isAnonymousClass  false                                                                                                                                      
 isArray           false                                                                                                                                      
 isLocalClass      false                                                                                                                                      
 isMemberClass     false                                                                                                                                      
 isPrimitive       false                                                                                                                                      
 isSynthetic       false                                                                                                                                      
 simple-name       InstantiatorStrategy                                                                                                                       
 modifier          abstract,interface,public                                                                                                                  
 annotation                                                                                                                                                   
 interfaces                                                                                                                                                   
 super-class                                                                                                                                                  
 class-loader      +-sun.misc.Launcher$AppClassLoader@3cd1a2f1                                                                                                
                     +-sun.misc.Launcher$ExtClassLoader@d6da883                                                                                               
 classLoaderHash   3cd1a2f1 


## JAD 反编译的源码
jad com.esotericsoftware.kryo.Kryo

import com.esotericsoftware.shaded.org.objenesis.instantiator.ObjectInstantiator;
import com.esotericsoftware.shaded.org.objenesis.strategy.InstantiatorStrategy;

[hadoop@hostname jars]$ ll chill*
-rw-r----- 1 hadoop hadoop 223573 7月   5 2018 chill_2.11-0.8.0.jar
-rw-r----- 1 hadoop hadoop  50619 7月   5 2018 chill-java-0.8.0.jar
[hadoop@hostname jars]$ ll kryo-shaded-3.0.3.jar 
-rw-r----- 1 hadoop hadoop 358390 7月   5 2018 kryo-shaded-3.0.3.jar

[hadoop@hostname jars]$ ll chill*
-rw-r--r-- 1 hadoop hadoop 224167 1月  16 10:57 chill_2.11-0.8.4.jar
-rw-r--r-- 1 hadoop hadoop  60483 1月  16 10:57 chill-java-0.8.4.jar
[hadoop@hostname jars]$ ll kryo-*
-rw-r--r-- 1 hadoop hadoop 442805 1月  16 10:57 kryo-2.22.jar
-rw-r--r-- 1 hadoop hadoop 358390 1月  16 10:57 kryo-shaded-3.0.3.jar

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kryo是一个快速、高效的Java序列化框架,比Java自带的序列化框架更快、更小、更节省内存。在Spark中,使用Kryo作为默认的序列化框架可以显著地提高性能。下面是一个使用Kryo序列化的案例: ```java import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.serializer.KryoRegistrator; import com.esotericsoftware.kryo.Kryo; public class KryoExample { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("KryoExample").setMaster("local"); conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); conf.set("spark.kryo.registrator", MyKryoRegistrator.class.getName()); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> lines = sc.textFile("input.txt"); JavaRDD<MyObject> objects = lines.map(line -> { MyObject obj = new MyObject(); obj.setId(Integer.parseInt(line.split(",")[0])); obj.setName(line.split(",")[1]); return obj; }); objects.foreach(obj -> System.out.println(obj.getId() + ": " + obj.getName())); } public static class MyObject { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static class MyKryoRegistrator implements KryoRegistrator { @Override public void registerClasses(Kryo kryo) { kryo.register(MyObject.class); } } } ``` 在上面的代码中,我们首先创建了一个SparkConf对象,并设置了应用名称和运行模式。然后,我们设置了序列化器为KryoSerializer,并指定了KryoRegistrator为MyKryoRegistrator。MyKryoRegistrator类是一个自定义的Kryo注册器,用于注册我们需要序列化的类MyObject。 接下来,我们使用JavaSparkContext读取了一个文本文件,并将每一行转换成一个MyObject对象。最后,我们对这些对象进行了遍历,并输出了它们的id和name属性。 需要注意的是,如果我们没有使用KryoSerializer序列化器,程序将默认使用Java自带的序列化器,这样可能会导致性能瓶颈。因此,建议在Spark中使用Kryo作为默认的序列化器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值