【问题标题】:Spark, NegativeArraySizeException when sequencefileSpark,NegativeArraySizeException 时序列文件
【发布时间】:2019-08-24 15:12:32
【问题描述】:

我使用的 spark 是 2.3。

我有这段代码sn-p,它读取'hdfspath'下的序列文件(这个路径下大约有20个文件,每个文件大约60MB),

SparkSession spark = ...;
JavaSparkContext jsc = JavaSparkContext.fromSparkContext(spark.sparkContext());
JavaPairRDD<BytesWritable, BytesWritable> temp = jsc.sequenceFile(hdfspath, BytesWritable.class, BytesWritable.class);
temp.take(1);

它给了我这个错误,

19/04/03 14:50:18 INFO CodecPool: Got brand-new decompressor [.gz]
19/04/03 14:50:18 INFO CodecPool: Got brand-new decompressor [.gz]
19/04/03 14:50:18 INFO CodecPool: Got brand-new decompressor [.gz]
19/04/03 14:50:18 INFO CodecPool: Got brand-new decompressor [.gz]
19/04/03 14:50:18 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.NegativeArraySizeException
    at org.apache.hadoop.io.BytesWritable.setCapacity(BytesWritable.java:144)
    at org.apache.hadoop.io.BytesWritable.setSize(BytesWritable.java:123)
    at org.apache.hadoop.io.BytesWritable.readFields(BytesWritable.java:179)
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:71)
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:42)
    at org.apache.hadoop.io.SequenceFile$Reader.deserializeKey(SequenceFile.java:2606)
    at org.apache.hadoop.io.SequenceFile$Reader.next(SequenceFile.java:2597)
    at org.apache.hadoop.mapred.SequenceFileRecordReader.next(SequenceFileRecordReader.java:82)
    at org.apache.spark.rdd.HadoopRDD$$anon$1.getNext(HadoopRDD.scala:277)

我试图读取的 hdfs 文件是一个旧的 mapreduce 作业的输出,输出设置如下,

job.setOutputKeyClass(BytesWritable.class);
job.setOutputValueClass(BytesWritable.class);
job.setOutputFormatClass(SequenceFileAsBinaryOutputFormat.class);
SequenceFileAsBinaryOutputFormat.setOutputCompressionType(job, CompressionType.BLOCK);

我研究了 org.apache.hadoop.io.BytesWritable.setCapacity(...) 方法,

public void setSize(int size) {
if (size > getCapacity()) {
  setCapacity(size * 3 / 2);
}
this.size = size;
}

不知怎么的size参数是808464432,做size*3的时候溢出,最终导致NegativeArraySizeException。

谁能帮忙解释一下这是怎么发生的,以及如何解决它?

【问题讨论】:

    标签: java apache-spark hadoop


    【解决方案1】:

    想通了。使用JavaSparkContext#newAPIHadoopFile 而不是JavaSparkContext#sequenceFile

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多