gpt4 book ai didi

scala - 在 Spark 上运行 Tika 的类路径问题

转载 作者:行者123 更新时间:2023-12-01 12:30:59 25 4
gpt4 key购买 nike

我尝试在 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 ) 发现了一个类似的问题,解决方案是构建一个 fat jar。但我想知道是否有其他方法可以解决依赖问题?

顺便说一句:我在没有 Spark 的情况下尝试了这个片段(所以只需使用一个带有文件名的数组和一个 foreach 循环并相应地更改 tikaFunc 签名。我在没有任何参数的情况下运行它并且它运行得很好。

编辑:更新了现在用于 sbt 程序集的片段。

最佳答案

I already found a similar problem here (Apache Tika 1.11 on Spark NoClassDeftFoundError) where the solution was to build a fat jar. But I would like to know if there is any other way so solve the dependency issues?

找到所有依赖项并将它们添加到--jars。你可以用 https://github.com/jrudolph/sbt-dependency-graph 来做.但我不明白为什么你更喜欢这个而不是构建一个将它们组合在一起的 jar 。

I ran it without any arguments and it worked perfectly.

SBT 已经确保您拥有类路径上的所有依赖项,但 Spark 不使用 SBT 来运行您的程序。

关于scala - 在 Spark 上运行 Tika 的类路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com