2015-10-16 14 views
1

我正在尝试解决使用Java的HashMaps的Spark序列化问题。 我指的是链接Save Spark Dataframe into Elasticsearch - Can’t handle type exception无法转换为org.apache.spark.serializer.Serializer

现在我打了以下问题:

java.lang.ClassCastException: com.spark.util.umf.MyKryoRegistrator cannot be cast to org.apache.spark.serializer.Serializer 
    at org.apache.spark.SparkEnv$.create(SparkEnv.scala:259) 
    at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:163) 
    at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:267) 
    at org.apache.spark.SparkContext.(SparkContext.scala:270) 
    at org.apache.spark.api.java.JavaSparkContext.JavaSparkContext.scala:61) 
    at com.spark.util.umf.MyMain.main(MyMain.java:46) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:480) 
15/10/16 01:47:22 INFO yarn.ApplicationMaster: Final app status: 
FAILED, exitCode: 15, (reason: User class threw exception: 
com.spark.util.umf.MyKryoRegistrator cannot be cast to 
org.apache.spark.serializer.Serializer) 

创建我Kryo registrator如下:

import java.io.Serializable; 
import org.apache.spark.serializer.KryoRegistrator; 
import com.esotericsoftware.kryo.Kryo; 

public class MyKryoRegistrator implements KryoRegistrator, Serializable { 
    @Override 
    public void registerClasses(Kryo kryo) { 
     // Product POJO associated to a product Row from the DataFrame    
     kryo.register(MyRecord.class); 
    } 
} 

主要方法:

public static void main(String args[]){ 

    SparkConf sConf= new SparkConf().setAppName("SparkTestJob"); 
    sConf.set("spark.driver.allowMultipleContexts", "true"); 
    //Kryo kryo = new Kryo();; 
    //kryo.setDefaultSerializer(MyRecord.class); 
    //my.registerClasses(kryo); 
    sConf.set("spark.serializer","com.spark.util.umf.MyKryoRegistrator"); 

    [...] 
} 
+0

'main'在哪里定义?请发布完整的代码,因为它看起来像'MyKryoRegistrator'是一个内部类,如果是这样'尝试'公共静态类MyKryoRegistrator' ... – earcam

+0

好的。这是我的错误。 我用过“sConf.set(”spark.serializer“,”com.spark.util.umf.MyKryoRegistrator“);”它应该像 sConf.set(“spark.kryo.registrator”,“com.spark.util.umf.MyKryoRegistrator”); – Harisyam

+0

你可以把评论作为你自己问题的答案;-) – earcam

回答

3

根据我提供的答案在你提到的问题链接中,你可以看到你已经定义好了ED两个参数:

spark.serializerspark.kryo.registrator

所以,你必须设定两个参数。

如果您在未设置序列化程序的情况下设置注册程序,则kryo序列化程序将不会被设置。

相关问题