2017-04-04 5 views
0

spark 2.1.0 및 hadoop 2.7.3을 사용하고 있습니다.Spark newAPIHadoopFile (FileInputFormat)을 사용할 때 NotSerializableException이 발생했습니다.

내가 주요 방법으로 하나의 클래스에 newAPIHadoopFile, 아주 간단한 코드를 사용하려고 시도했다 : I에 유래 많은 게시물을 확인하지만, 여전히 오류가있어

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)

:

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

 
Serialization stack: 
 

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

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

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

 
\t - element of array (index: 0) 
 

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

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

편집 : chat.csv의 내용 :

{에서 "거트"에 "멜리사", 메시지 : "저녁 식사를 원하십니까?"}에서

{: "멜리사"에 "거트", 메시지 : "좋아

어떻게 이탈리아어에 대한 \"}

이 도와주세요 ...

+0

당신이 클래스 이름과 모두와 함께 시작 여기에 코드를 붙여 넣을 수 있습니까? –

+0

모든 코드는 여기에 있습니다 .. 주요 방법 선언 및 가져 오기를 제외하고. – Furyegg

답변

0

난 당신이 내 컴퓨터에 스파크 1.6.0와 함께 제공되는 동일한 코드를 실행하는거야 그것은 잘 작동하고있다 (나는 HDFS에서 tab separated file을 사용했다). 사용중인 spark/hadoop의 버전은 무엇입니까?

일부 경우 (더 낮은 버전 일 수 있음) 텍스트는 직렬화 가능을 구현하지 않습니다. 그래서, 다음과 같은

뭔가를 String으로지도하고 다시 시도 수집하기 전에, newAPIhadoopFile의 결과는

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

이 시도, 키 값의 튜플 될 것입니다.

심판 : click here

+0

나는 spark 2.1.0과 hadoop 2.7.3을 사용하고 있는데, 나는이 정보를 질문에 추가 할 것이다. 감사. – Furyegg

+0

그리고 해당 게시물을 이미 확인했지만 아직 spark 2.1.0에서 작동하지 않습니다. – Furyegg

+0

입력 파일에 무엇이 있습니까? –