【问题标题】:Spark saveAsNewAPIHadoopFile java.io.IOException: Could not find a serializer for the Value classSpark saveAsNewAPIHadoopFile java.io.IOException:找不到值类的序列化程序
【发布时间】:2017-09-01 12:21:08
【问题描述】:

我正在尝试将 java 对 RDD 存储为 Hadoop 序列文件,如下所示:

JavaPairRDD<ImmutableBytesWritable, Put> putRdd = ...
config.set("io.serializations","org.apache.hadoop.io.serializer.JavaSerialization,org.apache.hadoop.io.serializer.WritableSerialization");
putRdd.saveAsNewAPIHadoopFile(outputPath, ImmutableBytesWritable.class, Put.class, SequenceFileOutputFormat.class, config);

但即使我设置了io.serializations,我也会遇到异常:

2017-04-06 14:39:32,623 ERROR [Executor task launch worker-0] executor.Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.io.IOException: Could not find a serializer for the Value class: 'org.apache.hadoop.hbase.client.Put'. Please ensure that the configuration 'io.serializations' is properly configured, if you're usingcustom serialization.
    at org.apache.hadoop.io.SequenceFile$Writer.init(SequenceFile.java:1192)
    at org.apache.hadoop.io.SequenceFile$Writer.<init>(SequenceFile.java:1094)
    at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:273)
    at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:530)
    at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getSequenceWriter(SequenceFileOutputFormat.java:64)
    at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getRecordWriter(SequenceFileOutputFormat.java:75)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1$$anonfun$12.apply(PairRDDFunctions.scala:1030)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1$$anonfun$12.apply(PairRDDFunctions.scala:1014)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
    at org.apache.spark.scheduler.Task.run(Task.scala:88)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
2017-04-06 14:39:32,669 ERROR [task-result-getter-0] scheduler.TaskSetManager: Task 0 in stage 0.0 failed 1 times; aborting job

知道如何解决这个问题吗??

【问题讨论】:

  • 你在向 HBase 写入什么样的数据?
  • 感谢@Vidya 我已经找到了修复并在下面分享了

标签: java hadoop apache-spark serialization hdfs


【解决方案1】:

我找到了解决方法,显然 Put(和所有 HBase 突变)有一个特定的序列化程序 MutationSerialization

以下行解决了这个问题:

config.setStrings("io.serializations", 
    config.get("io.serializations"),
    MutationSerialization.class.getName(),
    ResultSerialization.class.getName());

【讨论】:

  • 我遇到了一个非常相似的情况,但我的类型是:JavaPairRDD&lt;ImmutableBytesWritable, Result&gt;,使用上面的类没有帮助,我应该使用哪一个? Result 是从 org.apache.hadoop.hbase.client.Result 导入的。
  • ResultSerialization 应该足够了,但如果我尝试执行putRdd.first()putRdd.collect() 我仍然会看到火花序列化异常。就我而言,我只想存储到 HDFS 或返回到 HBase,上面的代码就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2022-09-24
  • 2021-10-07
  • 2021-03-30
  • 2019-08-04
相关资源
最近更新 更多