【发布时间】:2015-10-26 15:21:57
【问题描述】:
我在运行我的 spark 应用程序时遇到了一个奇怪的问题。
场景
有两个 jars 包含相同的包名 (com.example.app)。一个是我的实际代码,另一个是用于运行集成测试的非生产代码。我在主代码下有一个包类,其中包含主代码中的 scala 类使用的类型。 我正在使用 spark-job 服务器创建一个上下文,并首先将测试 jar 上传到服务器,然后将 main.jar 上传到服务器。在测试 jar 中运行作业后,我试图在 main.jar 中运行作业,但失败并出现异常提示
scala.reflect.internal.MissingRequirementError: object com.example.app.CommonUtils.package not found.
at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16) ~[scala-reflect-2.10.5.jar:na]
at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17) ~[scala-reflect-2.10.5.jar:na]
at scala.reflect.internal.Mirrors$RootsBase.ensureModuleSymbol(Mirrors.scala:126) ~[scala-reflect-2.10.5.jar:na]
at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:161) ~[scala-reflect-2.10.5.jar:na]
at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:21) ~[scala-reflect-2.10.5.jar:na]
但是当我创建一个上下文并单独上传主 jar 并在主 jar 中运行作业时,它工作正常。
这意味着, 在火花工作目录中,当主罐子和测试罐子都存在时,作业失败,然后它就失败了。 如果只有主 jar 存在,则通过。
package.scala
src/test/scala/
`-- com
`-- example
`-- app
|-- CommonUtils
package object CommonUtils {
type CompositeKey = (String, Int, Int)
...
}
问题
- jvm 如何在 scala 中查找包对象?
- 这个包类应该放在哪里?
- 测试包的命名约定是什么?
【问题讨论】:
-
错误是由于两个 jars 中存在一个类文件。一个是测试罐,另一个是主罐。当两个 jar 在一个上下文中使用并且主 jar 执行时,将拾取测试 jar 类文件并在测试 jar 中搜索包对象。
标签: scala apache-spark jvm