初学ignite时的一些问题

一.对等类加载

当分布式闭包进行传输和执行时,需要在每个节点上进行如下配置(即对等类加载):

IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setPeerClassLoadingEnabled(true);

否则,会出现下面的错误:

                                                                                  图1:有节点没有设置

                                                                             图2:所有节点均没有设置

这就是ignite中的零部署问题:

                                                                               图3: ignite的零部署介绍

二.localpeek()

 

                                                               图 4:get和localPeek操作示例代码

根据图4中的代码,如果我们使用cache.get(k).get()代码时,执行是正常的,使用默认的per-task轮询式负载平衡进行操作,两个节点分别存储5个key,如图5和图6所示。

                                                                            图 5: node1输出的key和value

                                                                      图 6: node2输出的key和value

如果使用localpeek()操作(localpeek从本地缓存中查询数据如图7介绍),那么node1(本地节点)有一些key的value取的时候为null,使用Optional容器修饰后就会报图8中的空指针异常,现在还未找到原因。

                                                                                图 7: localpeek定义

                                                                                   图 8:空指针异常

 

[email protected]

我们有一些类具有一定的相关性,比如Student类和Department类,每个学生都属于某个院系。我们在建立StudnetKey(图 9)和DepartmentKey(图10)时需要将缓存键(前者)映射到亲和键(后者)上。如果在缓存的配置对象里没有显式的指定亲和映射,那么默认的AffinityKeyMapper实现的affinityKey(Object key)方法,会首先扫描这个key对象里是否有被@AffinityKeyMapped注解的属性或者方法,有的话就直接返回,没有的话将会把原本的缓存键作为亲和键返回,这样进行亲和关联时就没有意义了。图11显示了被关联的key会存储在相同的节点上。

                                                                          图 9:StudentKey定义

                                                                         图 10:DepartmentKey定义

                                     图 11:相关联的StudentKey和DepartmentKey存储在相同节点上

 

四.基于Cron的调度

除了ignite的核心模块,也可以一个个导入独立模块,ignite使用的独立模块主要如图12所示。

                                                                         图 12:ignite独立模块

但是有一些模块有LGPL依赖,无法部署到maven中央仓库:ignite-hibernate, ignite-geospatial, ignite-schedule在进行周期性任务调度需要导入ignite-schedule相关的依赖,如果没有相关依赖,会报错误如图13所示。

                                                               图 13:不支持schedule功能的错误

 要使用这些模块,需要手工从源代码进行构建然后加入自己的项目,比如,要将ignite-hibernate安装到本地库,可以在Ignite的源代码包中运行如下的命令:

mvn clean install -DskipTests -Plgpl -pl modules/hibernate -am

GridGain提供自己的Maven仓库,包含了Apache Ignite的LGPL构件,比如ignite- schedule。 注意位于GridGain的Maven库中的构件仅仅为了方便使用,并不是官方的Apache Ignite构件。

https://www.gridgainsystems.com/nexus/content/repositories/external/下载cron4j-2.2.5.jar和ignite-schedule-2.7.1.jar,需要将这两个jar包导入本地仓库,主要用到maven的命令:

mvn install:install-file   -Dfile=xxx-x.x.x.jar  -DgroupId=x.x  -DartifactId=xx -Dversion=x.x  -Dpackaging=jar          

上面的命令解释,-Dfile:指明你当前jar包的位置(就是第1步存放jar的路径+jar包名);-DgroupId,-DartifactId,-Dversion三个参数就是指明了存放maven仓库中的位置; -Dpackaging就是指明文件类型。图14和15显示导入jar包成功的过程。

                                                                      图 14:安装ignige-schedule过程

                                                                                      图 15:安装con4j过程

导入需要的包之后,我们就可以正常的进行任务调度的编程了。