当前位置: 首页 > 知识库问答 >
问题:

在Spark Cluster上运行Drools-获取空指针org.kie.internal.builder.知识库actory.new知识库

司寇安宜
2023-03-14

我使用drools with Spark来执行一些规则。我已经编写了一个加载.drl文件的方法。并实例化“InternalKnowledgeBase”的对象。下面的代码在本地模式下工作,但当我在集群(EMR)中运行时,我遇到以下异常。附加代码和异常堆栈跟踪。

def loadDrl(drlFilePath: String): Option[InternalKnowledgeBase] = {
try {
  val resource = ResourceFactory.newClassPathResource(drlFilePath)
  val kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder() //Exception Occurs
  kbuilder.add(resource, ResourceType.DRL)

  if (kbuilder.hasErrors()) {
    throw new RuntimeException(kbuilder.getErrors().toString())
  }
  val kbase = KnowledgeBaseFactory.newKnowledgeBase()
  kbase.addPackages(kbuilder.getKnowledgePackages())
  Some(kbase)
} catch {
  case e: Exception => { 
    e.printStackTrace()
    None 
    }
 }
}

请查找异常堆栈跟踪。

java.lang.NullPointerException
    at org.kie.internal.builder.KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.java:48)
    at $line27.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.loadDrl(<pastie>:44)
    at $line33.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.<init>(<console>:39)
    at $line33.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw.<init>(<console>:44)
    at $line33.$read$$iw$$iw$$iw$$iw$$iw$$iw.<init>(<console>:46)
    at $line33.$read$$iw$$iw$$iw$$iw$$iw.<init>(<console>:48)
    at $line33.$read$$iw$$iw$$iw$$iw.<init>(<console>:50)
    at $line33.$read$$iw$$iw$$iw.<init>(<console>:52)
    at $line33.$read$$iw$$iw.<init>(<console>:54)
    at $line33.$read$$iw.<init>(<console>:56)
    at $line33.$read.<init>(<console>:58)
    at $line33.$read$.<init>(<console>:62)
    at $line33.$read$.<clinit>(<console>)
    at $line33.$eval$.$print$lzycompute(<console>:7)
    at $line33.$eval$.$print(<console>:6)
    at $line33.$eval.$print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:793)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1054)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:645)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:644)
    at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
    at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:644)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:576)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:572)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:819)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:691)
    at scala.tools.nsc.interpreter.ILoop.processLine(ILoop.scala:404)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:425)
    at org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply$mcZ$sp(SparkILoop.scala:285)
    at org.apache.spark.repl.SparkILoop.runClosure(SparkILoop.scala:159)
    at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:182)
    at org.apache.spark.repl.Main$.doMain(Main.scala:78)
    at org.apache.spark.repl.Main$.main(Main.scala:58)
    at org.apache.spark.repl.Main.main(Main.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
    at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:849)
    at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
    at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
    at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
    at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

感谢你的帮助!谢谢。

共有1个答案

红富
2023-03-14

我不久前也有类似的问题。我的工作是用shade插件制作一个罐子。找到其中一个问题后解决了它(记不清了):

>

如何在storm拓扑中使用drools

不得不把这个变压器加到我的pom.xml

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
    <resource>META-INF/kie.conf</resource>
</transformer>
 类似资料:
  • 我们正在使用Drools 7.5.0和Java8。 我们有一个处理传感器事件的服务器应用程序,大约有1200个会话。每个会话都是一个参数化的知识。当我们重新启动服务器时,我们必须恢复所有没有我们希望看到的那么快的会话。因此,尝试通过从数据库加载序列化的知识库来优化恢复过程。 我们使用以下代码来序列化和反序列化知识库: 事件是不可变的,并且具有最终字段。恢复会话时,会出现以下异常: 它被抛出到这行代

  • 我在运行一个简单的helloworld示例drools项目时遇到了以下错误。 代码: 口水代码:

  • 知识词库 1.知识词库类型 爱客服知识库系统支持多种知识词库,包括同义词库、敏感词库、专业词库、变量词库等,支持用户高度自定义自身词库,从而完善机器人问答能力,词库类型如下: 同义词库:同义词是用于多义词、同义词的优先识别,例如:订单、定单,同义词既可以是日常包含的同义词,也可以是易识别错的同音词 敏感词库:敏感词库的设立是用于将返回给用户的答案进行过滤,敏感词库中的词语将在最后的会话中进行过了,

  • 1. 内存 内存含义: 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分。 内存:内部存贮器,暂存程序/数据——掉电丢失 SRAM、DRAM、DDR、DDR2、DDR3。 外存:外部存储器,长时间保存程序 数据—掉电不丢ROM、ERRROM、FLASH(NAND、NOR)、硬盘、光盘。 内存是沟通cpu与硬盘的桥梁: 暂存放CPU中的运算数据 暂存与硬盘等外部存储器交换

  • 指针是一种数据类型,具有指针类型的变量称为指针变量。实际上,可以把指针变量(也简称为指针)看成一种特殊的变量,它用来存放某种类型变量的地址。一个指针存放了某个变量的地址值,就称这个指针指向了被存放地址的变量。简单地说,指针就是内存地址,它的值表示被存储的数据的所在的地址,而不是被存储的内容。 内存是按字节(8位)排列的存储空间,每个字节有一个编号,称之为内存地址,就象一个大楼里各个房间有一个编号一

  • 1 最佳实践 1.1 避免使用 GroupByKey   让我们看一下使用两种不同的方式去计算单词的个数,第一种方式使用 reduceByKey, 另外一种方式使用 groupByKey: val words = Array("one", "two", "two", "three", "three", "three") val wordPairsRDD = sc.parallelize(words