使用Spark newAPIHadoopFile(FileInputFormat)遇到了NotSerializableException

时间:2017-04-04 19:59:07

标签: apache-spark serialization hadoop2

我正在使用spark 2.1.0和hadoop 2.7.3。

我试图在main方法的一个类中使用newAPIHadoopFile,非常简单的代码:

val spark = SparkSession.builder().appName("test").master("local[*]").getOrCreate()
    val sparkContext = spark.sparkContext
    val sparkConf = sparkContext.getConf
    val file = "src/main/resources/chat.csv"
    sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    sparkContext.getConf.registerKryoClasses(Array(
      Class.forName("org.apache.hadoop.io.LongWritable"),
      Class.forName("org.apache.hadoop.io.Text")
    ));
    sparkConf.set("spark.kryo.classesToRegister", "org.apache.hadoop.io.LongWritable, org.apache.hadoop.io.Text")
    val rdd = sparkContext.newAPIHadoopFile(file, classOf[KeyValueTextInputFormat], classOf[Text], classOf[Text])
    rdd.collect().foreach(println)

我检查了StackOverflow中的很多帖子,但仍然出现错误:

java.io.NotSerializableException: org.apache.hadoop.io.Text

Serialization stack:

    - object not serializable (class: org.apache.hadoop.io.Text, value:   How about Italian?"})

    - field (class: scala.Tuple2, name: _1, type: class java.lang.Object)

    - object (class scala.Tuple2, (  How about Italian?"},))

    - element of array (index: 0)

    - array (class [Lscala.Tuple2;, size 3)

    at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)

编辑:chat.csv的内容:

{from:"Gert", to:"Melissa", message:"Want to have dinner?"}
{from:"Melissa", to:"Gert", message:"Ok\
How about Italian?"}

1 个答案:

答案 0 :(得分:0)

我在我的机器上运行了与spark 1.6.0提供的相同代码并且工作正常(我在HDFS中使用了制表符分隔文件)。你正在使用什么版本的spark / hadoop?

在某些情况下(可能是较低版本)Text不实现可序列化。所以在将它映射到String之前再试一次,

如下所示,newAPIhadoopFile的结果将是键值的元组,

rdd.map(x=>(x._1.toString,x._2.toString)).collect().foreach(println)

试试这个。

REF:click here