【发布时间】:2016-03-21 11:14:06
【问题描述】:
我尝试在 Tika 中处理一堆文件。文件的数量有数千个,所以我决定构建一个文件的 RDD 并让 Spark 分配工作负载。不幸的是,我收到了多个 NoClassDefFound 异常。
这是我的 sbt 文件:
name := "TikaFileParser"
version := "0.1"
scalaVersion := "2.11.7"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.5.1" % "provided"
libraryDependencies += "org.apache.tika" % "tika-core" % "1.11"
libraryDependencies += "org.apache.tika" % "tika-parsers" % "1.11"
libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.7.1" % "provided"
这是我的程序集.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.1")
这是源文件:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.input.PortableDataStream
import org.apache.tika.metadata._
import org.apache.tika.parser._
import org.apache.tika.sax.WriteOutContentHandler
import java.io._
object TikaFileParser {
def tikaFunc (a: (String, PortableDataStream)) = {
val file : File = new File(a._1.drop(5))
val myparser : AutoDetectParser = new AutoDetectParser()
val stream : InputStream = new FileInputStream(file)
val handler : WriteOutContentHandler = new WriteOutContentHandler(-1)
val metadata : Metadata = new Metadata()
val context : ParseContext = new ParseContext()
myparser.parse(stream, handler, metadata, context)
stream.close
println(handler.toString())
println("------------------------------------------------")
}
def main(args: Array[String]) {
val filesPath = "/home/user/documents/*"
val conf = new SparkConf().setAppName("TikaFileParser")
val sc = new SparkContext(conf)
val fileData = sc.binaryFiles(filesPath)
fileData.foreach( x => tikaFunc(x))
}
}
我正在运行这个
spark-submit --driver-memory 2g --class TikaFileParser --master local[4]
/path/to/TikaFileParser-assembly-0.1.jar
并得到java.lang.NoClassDefFoundError: org/apache/cxf/jaxrs/ext/multipart/ContentDisposition,它是解析器的依赖项。出于好奇,我将包含此类的 jar 添加到 Spark 的 --jars 选项并再次运行。这次我得到了一个新的NoClassDefFoundError(不记得是哪个了,还有一个 Tika 依赖)。
我已经在这里 (Apache Tika 1.11 on Spark NoClassDeftFoundError) 发现了一个类似的问题,解决方案是构建一个胖罐。但是我想知道是否有其他方法可以解决依赖问题?
顺便说一句:我在没有 Spark 的情况下尝试了这个 sn-p(所以只需使用带有文件名和 foreach 循环的数组并相应地更改 tikaFunc 签名。我在没有任何参数的情况下运行它并且它运行良好。
编辑:现在更新了 sn-ps 以用于 sbt 程序集。
【问题讨论】:
标签: scala jar apache-spark classpath apache-tika