我是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。
答案 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