Spark中的自定义输入阅读器

时间:2014-10-08 13:24:18

标签: scala hadoop apache-spark hadoop-streaming

我是Spark新手,想将Wikipedia转储中的页面记录加载到RDD中。

我尝试使用hadoop流中提供的记录阅读器,但无法弄清楚如何使用它。任何人都可以帮我制作以下代码创建一个带页面记录的漂亮RDD吗?

import org.apache.hadoop.io.Text
import org.apache.hadoop.streaming.StreamXmlRecordReader

import org.apache.hadoop.mapred.JobConf
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object WikiTest {

  def main(args: Array[String]) {

    // configuration
    val sparkConf = new SparkConf()
      .setMaster("local[4]")
      .setAppName("WikiDumpTest")

    val jobConf = new JobConf()
    jobConf.set("input", "enwikisource-20140906-pages-articles-multistream.xml")
    jobConf.set("stream.recordreader.class", "org.apache.hadoop.streaming.StreamXmlRecordReader")
    jobConf.set("stream.recordreader.begin", "<page>")
    jobConf.set("stream.recordreader.end", "</page>")

    val sparkContext = new SparkContext(sparkConf)

    // read data
    val wikiData = sparkContext.hadoopRDD(
        jobConf, 
        classOf[StreamXmlRecordReader],
        classOf[Text], 
        classOf[Text])

    // count rows
    println(wikiData.count)
  }
}

似乎Spark拒绝使用StreamXmlRecordReader。我收到以下错误:

  

[error] found:Class [org.apache.hadoop.streaming.StreamXmlRecordReader(classOf [org.apache.hadoop.streaming.StreamXmlRecordReader])

     

[error] required:Class [_&lt ;: org.apache.hadoop.mapreduce.InputFormat [?,?]]

     

[error] classOf [StreamXmlRecordReader]

如果我忽略Eclispse的警告并启动prgramm,我会遇到java.lang.ClassNotFoundException。

2 个答案:

答案 0 :(得分:2)

您应该使用classOf[org.apache.hadoop.streaming.StreamInputFormat]代替classOf[StreamXmlRecordReader]

java.lang.ClassNotFoundException是因为你想运行你的类WikiTest但它不存在,因为它无法编译。

答案 1 :(得分:2)

您正在使用java.lang.ClassNotFoundException因为您尝试在spark(StreamXmlRecordReader)中使用外部依赖项。您必须创建一个胖jar,并将其部署在Spark中。

这是关于如何创建这种类型的jar的一个很好的例子:gradle fat jar tutorial

如果您在解析XML文件时遇到问题,也可以查看此处: parsing tutorial