【问题标题】:Initializing cluster partition table arrangement... in Hazelcast 3.9.1 takes too longHazelcast 3.9.1 中的初始化集群分区表排列...耗时太长
【发布时间】:2018-02-26 18:41:06
【问题描述】:

我正在尝试创建一个 Hazelcast 服务项目,其中我将订阅 RDBMS (Oracle DB 12c) 数据存储,使用反射动态创建 POJO/Java Bean,然后解析该 Java Bean 对象将 JDBC ResultSet 作为 Result 行值映射到 Java Bean 对象中,并将这些映射的对象加载到分布式映射中。

我在 Hazelcast IMap 中检查了我试图从中加载的两个表的数据量,它低至 0.0625 和 0.0316 MB。所以这是一个更简单的 Hazelcast 实现,只是在 localhost 上初始化两个并行实例/节点。

我在 Java Main 方法中计算从创建 Java POJO 类的那一刻起的总运行时间,并在 Hazelcast IMAP 中创建和加载每个相应的对象。

据我了解,从系统的角度来看,这花费了太长时间,因为即使在具有系统规格的测试和产品框中,我们也看到了类似的行为 比下面给出的要好 3 到 4 倍。请帮助提供有关有什么问题的建议,或者这是第一次在一个 hazelcast IMDG,集群中有 2 个节点。

系统规格如下:

Macbook Pro 2014 处理器:2.6 GHz 英特尔酷睿 i5 内存:8 GB 1600 MHz DDR3

请找到日志...

2018 年 2 月 26 日上午 10:30:39 com.hazelcast.internal.partition.impl.PartitionStateManager INFO: [xx.xxx.xx.xxx]:5702 [dev] [3.9.1] 正在初始化集群分区表排列... userMaster Map 中的条目数:883

userMaster Map 中的条目数:7499

持续时间约为:92520 毫秒 2018 年 2 月 26 日上午 10:32:10 com.hazelcast.core.LifecycleService 信息:[xx.xxx.xx.xxx]:5701 [dev] [3.9.1] [xx.xxx.xx.xxx]:5701 是 SHUTTING_DOWN

【问题讨论】:

  • 您是否反映了结果集中的所有 883 行?是什么让你觉得 Hazelcast 很慢——你能把日志记录在 MapLoader.loadloadAllloadAllKeys 方法中吗?
  • 我创建了一个基于反射的类,并创建了直接放入地图的对象,而不是使用 Maploader 实现来实现持久性。但无论我为 2 个表运行我的程序,一个有 883 条记录,另一个有 7499 条记录,根据规格,这需要一点时间。您能否指定使用 MapLoader 是否更高效。
  • 嗨,我尝试使用在同一台机器上运行的不同服务器和客户端创建 MapLoader,并使用正确的 keySet() 实现 loadAllKeys()。这是在服务器(创建 Hazelcast 实例)通过单独的 jar 时调用还是在调用客户端时调用。 <map name="userMaster"> <map-store enabled="true" initial-mode="EAGER"> <class-name>com.beans.JPojo</class-name> </map-store> </map> 以上是要运行的服务器的 hazelcast.xml 中的配置。但它不会在服务器启动或通过客户端调用时在 IMap 中加载任何内容。
  • 如果没有MapLoader,您的处理就好像它是串行的。一个进程从 Oracle 加载并保存到网格节点。使用MapLoader 这是并行化的,每个网格节点直接读取它所托管的数据份额。在 2 节点网格上,加载时间可能会减半,但还有其他因素会影响这一点,例如数据库如何处理两倍的连接负载。
  • 你能创建一个mvce 并以某种方式分享吗?这可能有助于理解出了什么问题。 Github 会很好。

标签: java performance hazelcast hazelcast-imap


【解决方案1】:

虽然我无法修复 MapLoader 问题,但 ResultSet setFetchSize() 的主要问题。这被设置为 10,这导致网络 i/o 太高。一旦我增加到说 1000 或更多,它就会变得更快。

日志:

使用常规 FetchSize(): PreparedStatement.getFetchSize():10 2018 年 2 月 28 日晚上 7:24:51 com.hazelcast.internal.partition.impl.PartitionStateManager INFO: [xx.xxx.xx.xx]:5702 [dev] [3.9.1] 正在初始化集群分区表排列...

userMaster Map 中的条目数:26464

持续时间约为:276178 毫秒

使用更大的 FetchSize():

preparedStatement.getFetchSize():1000 2018 年 2 月 28 日晚上 7:31:06 com.hazelcast.internal.partition.impl.PartitionStateManager INFO: [xx.xxx.xx.xx]]:5702 [dev] [3.9.1] 正在初始化集群分区表排列...responseCode:404 url​​:http://localhost:8080/mancenter/collector.do userMaster Map 中的条目数:26464

持续时间约为:11279 毫秒

我肯定会发布代码的服务器和客户端版本以寻求 MapLoader 的帮助,这听起来是最好的方法。

作为进一步的帮助,您能否提供一些关于是否可以为运行时创建的对象/类编写 extends Mapload/Mapstore technique 的信息,因为我单独尝试的较小示例是使用固定的 Java Bean。

我记得文档中提到了MapStoreFactory() 选项。这会有帮助吗?

【讨论】:

  • 这可能会让您开始使用MapStore。如果你想插入一个 MapStore,它是一个 Spring Bean 或有一些其他复杂的配置,MapStoreFactory 会更有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2019-05-19
相关资源
最近更新 更多