为什么我们需要 ignite.sh 脚本?

What for do we need ignite.sh script?

我刚开始尝试 运行 我的简单多节点计算示例。我写了以下简单的应用程序:

try(Ignite ignite = Ignition.start("example-cache.xml")){
       IgniteCompute asyncCompute = ignite.compute().withAsync();
       for(int i = 0; i < 100; i++) {
           int[] a = new int[1];
           a[0] = i;
           asyncCompute.call(() -> {
               out.println(a[0]);
               return a[0];
           });
       }
 }

首先,我 运行 3 个服务器节点 ignite.sh 随二进制 ignite 分发一起提供。每个都在不同的 JVM 实例中。

然后我构建此应用程序并 运行 使用与之前 3 个服务器节点相同的 xml-spring 配置。

但实际上我遇到了以下异常:

class org.apache.ignite.IgniteCheckedException: com.test.App
        at org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:9826)
        at org.apache.ignite.internal.processors.job.GridJobWorker.initialize(GridJobWorker.java:432)
        at org.apache.ignite.internal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1108)
        at org.apache.ignite.internal.processors.job.GridJobProcessor$JobExecutionListener.onMessage(GridJobProcessor.java:1894)
        at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1222)
        at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:850)
        at org.apache.ignite.internal.managers.communication.GridIoManager.access00(GridIoManager.java:108)
        at org.apache.ignite.internal.managers.communication.GridIoManager.run(GridIoManager.java:790)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException: com.test.App
        at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:692)
        at org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1486)
        at org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1424)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:370)
        at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:828)
        at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read(BinaryFieldAccessor.java:639)
        at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:833)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1498)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1450)
        at org.apache.ignite.internal.binary.BinaryUtils.doReadObject(BinaryUtils.java:1640)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.readObject(BinaryReaderExImpl.java:1124)
        at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2V2.readBinary(GridClosureProcessor.java:2073)
        at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:823)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1498)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1450)
        at org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:298)
        at org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0(BinaryMarshaller.java:99)
        at org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:82)
        at org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:9820)
        ... 10 more
Caused by: java.lang.ClassNotFoundException: com.test.App
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8459)
        at org.apache.ignite.internal.MarshallerContextAdapter.getClass(MarshallerContextAdapter.java:185)
        at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:683)

这个异常非常清楚。但是我们需要 ignite.sh 脚本做什么?

您应该在所有点燃节点的 class 路径中添加 App class 或者 打开 peer-class-loading[1].

[1] https://apacheignite.readme.io/v1.9/docs/zero-deployment#peer-class-loading

您应该将 JAR 文件添加到 Apache Ignite 安装文件夹下的 lib/ 文件夹中。然后你可以启动 ignite.sh 并且你所有的 classes 将被自动加载。

或者,您可以按照上面的建议尝试启用 peer-class-loading,Ignite 将自动加载 classes。