Hadoop SequenceFile 的键值输出不正确

问题描述

我正在使用 spark 3.0 和 scala 在 Amazon Emr 6.10 上运行作业。

问题:在将我的键值 RDD 导出到 S3 上的序列文件并读取它时,我看到一些键指向错误的值。在保存数据之前和读回数据之后,我确实打印了输出,并且键的值不同。 示例:

Export:
"a" -> ObjA,"b" -> ObjB,"c" -> ObjC,.....,"z" -> ObjZ
Import:
"a" -> ObjK,"b" -> ObjV,"z" -> ObjZ

导出的 RDD[(Text,ImmutableWriteble)],key 为字符串,value 为 Kryo V4 序列化对象。

使用的导出选项:

rdd.saveAsNewAPIHadoopFile(path,classOf[Text],classOf[ImmutableBytesWritable],classOf[SequenceFileOutputFormat[Text,ImmutableBytesWritable]],hadoopConfig)

rdd.saveAsSequenceFile(sitesOutputBucketSeq,Some(classOf[SnappyCodec]))

使用的回读选项:

sparkContext.newAPIHadoopFile[Text,ImmutableBytesWritable,SequenceFileInputFormat[Text,ImmutableBytesWritable]](sitesOutputBucketSeq,classOf[SequenceFileInputFormat[Text,hadoopConfig)

sparkContext.sequenceFile[String,ImmutableBytesWritable](sitesOutputBucketSeq)

结果是一样的 - 一些键和值被打乱

我在写入 300 个值和 300 万个值时遇到了这个问题。 我在保存为镶木地板格式并读取它时没有看到这个问题,在我的情况下看起来像序列格式输出的一些问题。

我的火花配置:

    scConf.set("spark.sql.parquet.enableVectorizedReader","false")
    scConf.set("spark.kryo.referenceTracking","false")
    scConf.set("spark.sql.parquet.compression.codec","snappy")
    scConf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
    scConf.set("spark.sql.adaptive.enabled","true")
    scConf.set("spark.sql.adaptive.coalescepartitions.enabled","true")
    scConf.set("mapreduce.map.output.compress","true")
    scConf.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec")
    scConf.set("mapred.map.output.compress.codec","org.apache.hadoop.io.compress.SnappyCodec")

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)