【问题标题】:Apache spark project with single executable JAR with DataNucleus具有单个可执行 JAR 和 DataNucleus 的 Apache spark 项目
【发布时间】:2020-06-16 17:18:59
【问题描述】:

我正在尝试运行一个使用 Apache Spark 和 Java 的 Java 项目。该项目是从 git 克隆的:https://github.com/ONSdigital/address-index-data。我是 Spark 和 Java 的新手,这对我没有帮助。我无法使用类似问题的答案找到解决方案,例如here

如果我按原样从 IntelliJ 运行代码(在 application.conf 中使用正确的本地 Elasticsearch 设置),那么一切正常 - IntelliJ 似乎会下载所需的 jar 文件并在运行时链接它们。但是,我需要配置项目以便我可以从命令行运行它。这似乎是 github 项目中列出的已知问题,没有提供解决方案。

如果我跑了

sbt clean assembly

按照说明,它成功地制作了一个完整的 JAR 文件。但是,然后使用

java -Dconfig.file=application.conf -jar batch/target/scala-2.11/ons-ai-batch-assembly-version.jar

发生这种情况:

20/06/16 17:06:41 WARN Utils: Your hostname, MacBook-Pro.local resolves to a loopback address: 127.0.0.1; using 192.168.1.163 instead (on interface en0)
20/06/16 17:06:41 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
20/06/16 17:06:43 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
20/06/16 17:06:44 WARN Persistence: Error creating validator of type org.datanucleus.properties.CorePropertyValidator
ClassLoaderResolver for class "" gave error on creation : {1}
org.datanucleus.exceptions.NucleusUserException: ClassLoaderResolver for class "" gave error on creation : {1}
        at org.datanucleus.NucleusContext.getClassLoaderResolver(NucleusContext.java:1087)
        at org.datanucleus.PersistenceConfiguration.validatePropertyValue(PersistenceConfiguration.java:797)
        at org.datanucleus.PersistenceConfiguration.setProperty(PersistenceConfiguration.java:714)

来自以前的帖子,例如,我认为这是因为 sbt 正在合并 jar 文件并且信息丢失了。但是,我看不到如何

  1. 正确合并,或
  2. 使用构建脚本来整理所有必要的 JAR 文件(包括 Scala 库),该脚本构建类路径并使用 java 命令执行 JAR 文件。

我该如何继续?请保持明确的说明,因为我真的不确定 xml 配置等。谢谢!

【问题讨论】:

    标签: java scala apache-spark datanucleus


    【解决方案1】:

    所以在我的头撞墙很久之后,我终于设法解决了这个问题。答案主要在另外两个 stackoverflow 解决方案中(herehere)(非常感谢那些作者!)但我会添加更多细节,因为我仍然需要更多指针。

    作为 Oscar Korz 说,问题在于“DataNucleus 核心尝试将模块加载为 OSGi 包,即使它没有在 OSGi 容器中运行。只要 jar 不合并,它就可以正常工作”,我需要这样做。因此,在运行“sbt clean assembly”时,合并后的 jar 错误地合并了 datanucleus 插件文件,并且没有在 MANIFEST.MF 中添加额外的 OSGi 部分。

    我将详细说明我如何修复“胖罐”。

    1. 为了得到“胖罐子”的大部分,我跑了

    sbt clean assembly

    但我确保我还在 build.sbt 的 assemblyMergeStrategy 中添加了 plugin.xml(使用第一个或最后一个,所以我们保留 plugin.xml):

    assemblyMergeStrategy in assembly := {
        ...
        case "plugin.xml" => MergeStrategy.first
        ...
      }
    

    这会在 batch/target/scala-XXX 文件夹中提供一个“胖 jar”(仍然无法工作),其中 XXX 是使用的 scala 版本。

    1. 将生成的 jar tar 文件复制到单独的目录中,然后使用以下命令解压缩:

    jar xvf your-jar-assembly-0.1.jar

    1. 在解压后的文件夹中,编辑 META-INF/MANIFEST.MF 文件,添加到末尾:

      Bundle-SymbolicName: org.datanucleus;singleton:=true

      Premain-Class: org.datanucleus.enhancer.DataNucleusClassFileTransformer

    2. 现在我们需要通过合并 3 个数据核文件来修复 plugin.xml。找到并解压原始的datanucleus jar文件(如上)并分离出每个plugin.xml(它们是不同的)。 Anebril 在stackoverflow solution 中的解决方案为合并这三个文件提供了一个良好的开端。但我会添加一个提示来帮助:

    使用此命令将 3 个 datanucleus 文件中的内容管道化,这将告诉您哪些扩展需要合并:

    cat plugin_core.xml plugin_rdbms.xml plugin_api.xml | grep -h "extension point" | tr -d "[:blank:]"| sort | uniq -d

    您仍然需要手动管理突出显示为重复的元素的合并。

    1. 在解压后的 your-jar-assembly-0.1.jar 文件夹中,将原来的 plugin.xml 替换为新合并的 plugin.xml。
    2. 再次 tar jar 文件(但包括清单!)

    jar cmvf META-INF/MANIFEST.MF your-jar-assembly-0.1.jar *

    1. 将此 jar 文件复制回 batch/target/scala-XXX 文件夹(替换原来的)。

    然后你可以使用

    java -Dconfig.file=application.conf -jar batch/target/scala-2.XXX/your-jar-assembly-0.1.jar

    运行胖罐。瞧!

    【讨论】:

    • 我按照这些步骤操作并收到以下错误 - 名称为“datanucleus1”的标识符工厂未注册!请检查您的 CLASSPATH 是否存在包含该工厂的插件,以及您的标识符工厂的 PMF 设置知道如何解决这个问题吗?我已经看遍了,但没有运气!
    • 我也做了一个快速搜索,找不到太多用处。也许检查您的 CLASSPATH 并查看您已注册的内容。也许这个页面可能会有所帮助:datanucleus.org/products/accessplatform/jdo/persistence.html.
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 2016-12-13
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-02-03
    • 2017-08-22
    相关资源
    最近更新 更多