Avro的Spark教程

时间:2015-03-17 16:48:30

标签: apache-spark

我从Spark开始,我的用例是阅读Avro文件(数据源)并根据规则执行ETL。首先,我只是想尝试阅读AVRO并创建一个RDD。根据其中一个stackoverflow站点的建议我

object abc {

  def main(args: Array[String]): Unit = 
  { 
    //val master = Properties.envOrElse("MASTER",args(0))
    val path = args(0)
    val sparkContext = new SparkContext(new SparkConf().setAppName("My-spark-app"))
    val jobConf = new JobConf(sparkContext.hadoopConfiguration)
    val rdd = sparkContext.hadoopFile (
        path, 
        classOf[org.apache.avro.mapred.AvroInputFormat[GenericRecord]],
        classOf[org.apache.avro.mapred.AvroWrapper[GenericRecord]],
        classOf[org.apache.hadoop.io.NullWritable],
        10)

    println(rdd.first)

  }
}`

我的环境是CDH 5.1.3。我收到以下错误。

15/03/17 08:53:58 INFO YarnClientClusterScheduler: YarnClientClusterScheduler.postStartHook done
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/mapred/AvroInputFormat
        at com.scif.afw.abc$.main(abc.scala:30)
        at com.scif.afw.abc.main(abc.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:292)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.avro.mapred.AvroInputFormat
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

我使用Maven构建了项目,我的POM有Avro jar,我可以在jar中看到这个类。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

如果您正在使用纱线群集,可能会有来自yarn.application.classpath的avro jar。 NoClassDefFound可能是由类路径中同一个类的多个实例引起的(来自jar的1个,来自默认的yarn app类路径的第2个)