在慢速网络上,从Ignite缓存中读取所有键值对会花费很长时间

时间:2018-09-17 07:56:10

标签: ignite

我正在从已创建的具有1M键值对的Ignite缓存中读取所有行。当我从运行ignite群集的同一网络中读取数据时,大约需要20秒。但是,当我从运行ignite群集的网络外部的机器上读取该文件时,需要10分钟。整个缓存的大小约为100 MB。我尝试通过传输大小为100MB的文件来测试点燃群集网络与外部网络之间的带宽。只花了5秒钟。我想知道为什么Ignite花费600秒的时间从缓存中传输所有键值对吗?

//缓存配置

CacheConfiguration<BenchmarkCacheStoreKey, OptionalDouble> cfg = new CacheConfiguration<BenchmarkCacheStoreKey, OptionalDouble>();
cfg.setName(cacheName);
cfg.setCacheMode(CacheMode.PARTITIONED);
//1 backup of each cache
cfg.setBackups(1);
cfg.setStatisticsEnabled(true);
cfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
cfg.setGroupName(CACHE_GROUP_NAME);
cfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
//do not blockk read/write for cache rebalancing
cfg.setRebalanceMode(CacheRebalanceMode.ASYNC);

从下面的缓存中读取的逻辑:

Map<K, V> readMap = new HashMap<>();
IgniteCache cache = ignite.cache(cacheName)
cache.forEach(action ->readMap.put(action.getKey(), action.getValue()));

1 个答案:

答案 0 :(得分:2)

尝试将文件拆分为1M个部分,然后再按部分再次传输。我认为这次您的结果将类似于10分钟。

  

cache.forEach(action-> readMap.put(action.getKey(),   action.getValue()));

forEach会进行扫描查询,默认情况下,扫描查询的页面大小== 1024,您可以尝试增加它,它将增加批处理大小,您可以这样做:

cache.query(new ScanQuery<>().setPageSize(10_240));

这是一个群集解决方案,所有默认设置都配置为在同一网络中工作,因此,如果您的网络较差并且在与服务器不同的群集中运行客户端,则可能需要对其进行调整。 但是,与其将数据移动到客户端,不如将计算任务发送到服务器,并在可能的情况下将一些小的结果返回给客户端,是更好的选择。