2014-11-20 39 views
0

我见过各种火花和Avro的问题(包括How can I load Avros in Spark using the schema on-board the Avro file(s)?),但没有一个解决方案,为我的工作有以下Avro的文件:如何使用spark&scala读取此avro文件?

http://www.4shared.com/file/SxnYcdgJce/sample.html

当我尝试使用该解决方案来读取的Avro文件上面,我得到关于它不是序列化的错误(spark java.io.NotSerializableException:org.apache.avro.mapred.AvroWrapper)。

如何设置spark 1.1.0(使用scala)来读取此示例avro文件?

- 更新 -

我搬到这个邮件列表:http://apache-spark-user-list.1001560.n3.nabble.com/How-can-I-read-this-avro-file-using-spark-amp-scala-td19400.html

+0

你直接收集的?你应该将它们映射到一些Serializable类,因为它们不能被序列化。 – zsxwing 2014-11-21 02:04:27

回答

1

我的解决方案是使用火花1.2和sparkSQL在我的问题链接:

val person = sqlContext.avroFile("/tmp/person.avro") 
2

编辑串行是KRYO应该做的伎俩。

一种方式是注释掉/etc/spark/conf/spark-defaults.conf行:

spark.serializer org.apache.spark.serializer.KryoSerializer

4

当试图读取Avro文件时,我遇到了同样的问题。原因是AvroWrapper没有实现java.io.Serializable接口。

解决方案是使用org.apache.spark.serializer.KryoSerializer

import org.apache.spark.SparkConf 

val cfg = new SparkConf().setAppName("MySparkJob") 
cfg.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
cfg.set("spark.kryo.registrator", "com.stackoverflow.Registrator") 

但是这还不够,因为我的课,这是在Avro的文件,没有实行Serializable无论是。

因此我添加了自己的注册人,扩展为KryoRegistrator,并包含chill-avro库。

class Registrator extends KryoRegistrator { 
    override def registerClasses(kryo: Kryo): Unit = { 
    kryo.register(classOf[MyClassInAvroFile], AvroSerializer.SpecificRecordBinarySerializer[MyClassInAvroFile]) 
    kryo.register(classOf[AnotherClassInAvroFile], AvroSerializer.SpecificRecordBinarySerializer[AnotherClassInAvroFile]) 
    } 
} 

然后,我能读这样的文件:

ctx.hadoopFile("/path/to/the/avro/file.avro", 
    classOf[AvroInputFormat[MyClassInAvroFile]], 
    classOf[AvroWrapper[MyClassInAvroFile]], 
    classOf[NullWritable] 
).map(_._1.datum()) 
+0

感谢您的分享!为什么我总是得到'线程中的异常“main”java.lang.NoClassDefFoundError:com/twitter/chill/KryoInstantiator'? – qqibrow 2015-10-06 03:06:06

+0

您是否添加了依赖项并将其包含在最终的工件中? – lpiepiora 2015-10-06 04:12:30

+0

有趣。我试过包'com.twitter“%”chill-java“%”0.7.0“'但它不起作用,只有'0.7.1'版本可以工作,无论如何,你的解决方案是唯一可行的。 – qqibrow 2015-10-08 18:23:56

相关问题