【问题标题】:Object not serializable error while reading multiple AVRO files读取多个 AVRO 文件时出现对象不可序列化错误
【发布时间】:2019-07-16 11:47:42
【问题描述】:

我正在尝试将 HDFS 目录中的小型 avro 文件合并到一个文件中。有人可以指导我如何使用 scala-spark 合并它们。提前致谢。

下面显示的代码使用 newAPIHadoopFile 方法创建一个 RDD。

val src = "/hdfs/path/to/folder"
val rdd = sc.newAPIHadoopFile(src, classOf[AvroKeyInputFormat[GenericRecord]], classOf[AvroKey[GenericRecord]], classOf[NullWritable], sc.hadoopConfiguration)

下面的错误告诉我我做错了什么:

scala> rdd.take(1).foreach(println)
19/07/16 07:28:59 WARN AvroKeyInputFormat: Reader schema was not set. Use AvroJob.setInputKeySchema() if desired.
19/07/16 07:28:59 ERROR Executor: Exception in task 0.0 in stage 2.0 (TID 2)
java.io.NotSerializableException: org.apache.avro.mapred.AvroKey
Serialization stack:
        - object not serializable (class: org.apache.avro.mapred.AvroKey, value: {someValue})
        - field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
        - object (class scala.Tuple2, (someValue,(null)))
        - element of array (index: 0)
        - array (class [Lscala.Tuple2;, size 1)

【问题讨论】:

    标签: scala apache-spark hadoop avro


    【解决方案1】:

    如果您不关心 rdd,更简单的方法是使用 Spark Dataframe。对于 Spark 2+,代码看起来像这样

    val spark = SparkSession.builder().getOrCreate()
    val inputAvro = spark.read.format("com.databricks.spark.avro").load("/hdfs/path/to/folder")
    inputAvro.coalesce(partitionNumber).write.format("com.databricks.spark.avro").save("<outputPath>")
    

    这里partitionNumber 是您想要将 avro 写入的文件数

    在运行此代码时,您必须包含 --packages com.databricks:spark-avro_2.11:4.0.0 以确保它能够读取 avro 阅读器

    【讨论】:

    • 感谢您的即时回复。但问题是我拥有的文件没有“.avro”扩展名,因此 databricks 包不起作用。如果您能提出其他方法,那真的很有帮助。
    • 嗯,这似乎很奇怪。标题是如何构建的。查看代码和您拥有的异常,标题似乎是一个问题
    • @tavish 有一个可配置的参数来读取不以 Avro 扩展名结尾的文件
    • 从 Spark 2.4.0 开始,不需要使用 com.databricks.spark.avro;它已经烘焙,可以通过format("avro")使用。
    • @cricket_007 是的,谢谢找到它。 spark.sparkContext.hadoopConfiguration.set("avro.mapred.ignore.inputs.without.extension", "false")
    猜你喜欢
    • 2020-07-06
    • 2019-01-19
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多