当前位置: 首页 > 知识库问答 >
问题:

火花作业中的Kryo序列化错误

印晋
2023-03-14
public class SerializeTest {

    public static class Toto implements Serializable {
        private static final long serialVersionUID = 6369241181075151871L;
        private String a;

        public String getA() {
            return a;
        }

        public void setA(String a) {
            this.a = a;
        }
    }

    private static final PairFunction<Toto, Toto, Integer> WRITABLE_CONVERTOR = new PairFunction<Toto, Toto, Integer>() {
        private static final long serialVersionUID = -7119334882912691587L;

        @Override
        public Tuple2<Toto, Integer> call(Toto input) throws Exception {
            return new Tuple2<Toto, Integer>(input, 1);
        }
    };

    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("SerializeTest");
        conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
        conf.registerKryoClasses(new Class<?>[]{Toto[].class});
        JavaSparkContext context = new JavaSparkContext(conf);

        List<Toto> list = new ArrayList<Toto>();
        list.add(new Toto());
        JavaRDD<Toto> cursor = context.parallelize(list, list.size());

        JavaPairRDD<Toto, Integer> writable = cursor.mapToPair(WRITABLE_CONVERTOR);
        writable.saveAsHadoopFile(args[0], Toto.class, Integer.class, SequenceFileOutputFormat.class);

        context.close();
    }

}

IOException:找不到键类'com.test.serializetest.toto'的序列化程序。如果使用自定义序列化,请确保配置“io.serializations”配置正确。在org.apache.hadoop.io.sequenceFile$writer.init(sequenceFile.java:1179)在org.apache.hadoop.io.sequenceFile$writer.(sequenceFile.java:1094)在org.apache.hadoop.io.sequenceFile.createWriter(sequenceFile.java:1094)在org.apache.hadoop.io.sequenceFile.createWriter(sequenceFile.java:273)在在org.apache.spark.rdd.pairrddfunctions$$anonfun$13.在org.apache.spark.rdd.pairrddfunctions.scala:1068)在org.apache.spark.rdd.pairrddfunctions$$anonfun$13.在org.apache.spark.schedure.resulttask.runtask(resulttask.scala:1059)在org.apache.spark.schedure.task.run(task.scala:61)在203)在java.util.concurrent.ThreadPoolExecutor.runworker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor$worker.run(ThreadPoolExecutor.java:617)在java.lang.thread.run(thread.java:745)15/09/21 17:49:14 WARN TaskSetManager:在stage 0.0(TID 0,localhost)中丢失了任务0.0:java.io.ioException:找不到键类的序列化程序:“com.test.serializetest.toto”。如果使用自定义序列化,请确保配置“io.serializations”配置正确。在org.apache.hadoop.io.sequenceFile$writer.init(sequenceFile.java:1179)在org.apache.hadoop.io.sequenceFile$writer.(sequenceFile.java:1094)在org.apache.hadoop.io.sequenceFile.createWriter(sequenceFile.java:1094)在org.apache.hadoop.io.sequenceFile.createWriter(sequenceFile.java:273)在在org.apache.spark.rdd.pairrddfunctions$$anonfun$13.在org.apache.spark.rdd.pairrddfunctions.scala:1068)在org.apache.spark.rdd.pairrddfunctions$$anonfun$13.在org.apache.spark.schedure.resulttask.runtask(resulttask.scala:1059)在org.apache.spark.schedure.task.run(task.scala:61)在203)在java.util.concurrent.ThreadPoolExecutor.runworker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor$worker.run(ThreadPoolExecutor.java:617)在java.lang.thread.run处(thread.java:745)

谢了。

共有1个答案

戚同
2023-03-14

这个错误既与Spark无关,也与Kryo无关。

使用Hadoop输出格式时,需要确保键和值是可写的实例。Hadoop默认情况下不使用Java序列化(您也不想使用它,因为它非常无效)

您可以在配置中检查io.serializations属性,您将看到使用的序列化程序列表,包括org.apache.hadoop.io.serializer.writableSerialization

 类似资料:
  • 每次使用cassandra connector在spark中运行scala程序时都会出现此错误 这是我的程序

  • 我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。

  • 我的spark任务是在运行时抛出不可序列化的任务。谁能告诉我我做错了什么吗? 以下是stacktrace:

  • 我对Kafka和克里奥很陌生。我一直在使用默认的Kafka序列化器处理Kafka上的简单字符串消息,但我试图使用Kryo序列化,但没有成功。 谁能解释一下或者给我看一个用kryo序列化(生产者和消费者)通过Kafka发送java对象的例子吗?

  • 启用Kryo和FST 使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可: <dubbo:protocol name="dubbo" serialization="kryo"/> <dubbo:protocol name="dubbo" serialization="fst"/> 注册被序列化类 要让Kryo和FST完全发挥出高性能,最好将那些需要被序列化的