您的位置:首页 > 其它

IgniteRDD学习笔记(五)缓存模式CacheMode

2015-12-04 13:16 337 查看
最近的项目里之前实现了用IgniteRDD共享SparkRDD,但性能却还不如直接处理hdfs文件来的快,代码里能把collect去掉的基本都取代了,最后从ignite着手,发现有个缓存模式,决定尝试一番。

先附上官网上的缓存模式的介绍:

缓存模式

Ignite提供了三种不同的缓存操作模式,分区、复制和本地。缓存模型可以为每个缓存单独配置,缓存模型是通过CacheMode枚举定义的。

分区模式:

分区模式是扩展性最好的分布式缓存模式,这种模式下,所有数据被均等地分布在分区中,所有的分区也被均等地拆分在相关的节点中,实际上就是为缓存的数据创建了一个巨大的内存内分布式存储。这个方式可以在所有节点上只要匹配总可用内存就可以存储尽可能多的数据,因此,可以在集群的所有节点的内存中可以存储TB级的数据,也就是说,只要有足够多的节点,就可以存储足够多的数据。

与复制模式不同,它更新是很昂贵的,因为集群内的每个节点都需要更新,而分区模式更新就很廉价,因为对于每个键只需要更新一个主节点(可选择一个或者多个备份节点),然而,读取变得较为昂贵,因为只有特定节点才持有缓存的数据。

为了避免额外的数据移动,总是访问恰好缓存有要访问的数据的节点是很重要的,这个方法叫做关系组合,当工作在分区化缓存时强烈建议使用。

分区化缓存适合于数据量很大而更新频繁的场合。

复制模式:

复制模式中,所有数据都被复制到集群内的每个节点,因为每个节点都有效所以这个缓存模式提供了最大的数据可用性。然而,这个模式每个数据更新都要传播到其他所有节点,因而会对性能和可扩展性产生影响。

Ignite中,复制缓存是通过分区缓存实现的,每个键都有一个主拷贝而且在集群内的其他节点也会有备份。

因为相同的数据被存储在所有的集群节点中,复制缓存的大小受到RAM最小的节点的有效内存限制。这个模式适用于读缓存比写缓存频繁的多而且数据集较小的场景,如果应用超过80%的时间用于查找缓存,那么就要考虑使用复制缓存模式了。

复制缓存适用于数据集不大而且更新不频繁的场合。

本地模式:

本地模式是最轻量的模式,因为没有数据被分布化到其他节点。他适用于或者数据是只读的,或者需要定期刷新的场景中。当缓存数据失效需要从持久化存储中加载数据时,他也可以工作与通读模式。除了分布化以外,本地缓存包括了分布式缓存的所有功能,比如自动数据回收,过期,磁盘交换,数据查询以及事务。

配置

default-config.xml



不配置默认为PARTITIONED

分区模式:PARTITIONED

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
...
<property name="cacheConfiguration">
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Set cache mode. -->
<property name="cacheMode" value="PARTITIONED"/>
...
</bean>
</property>
</bean>


复制模式:REPLICATED

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
...
<property name="cacheConfiguration">
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Set cache mode. -->
<property name="cacheMode" value="REPLICATED"/>
...
</bean>
</property>
</bean>


本地模式:LOCAL

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
...
<property name="cacheConfiguration">
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Set cache mode. -->
<property name="cacheMode" value="LOCAL"/>
...
</bean>
</property>
</bean>


测试:

下面是我在项目里用默认、本地、分区、副本四种模式测出来的性能以及与不用共享RDD而使用中间表存HDFS的方式的对比结果:(因为是公司的真实项目,所以做了打码处理)

其中1~5号为从HDFS读取的表处理的结果存储在ignite缓存中,6~9号为读取ignite缓存以及hdfs文件做聚合后的结果并写入ignite缓存,10~11号为读取ignite缓存以及hdfs文件做聚合后的结果写出到HDFS文件。





可以看出本地模式明显比另外两种模式效率更快,但可靠性就会相应降低。

下面是不使用ignite缓存(即中间结果都存储在hdfs上) 和 10个ignite节点的性能对比:

其中1~5号为从HDFS读取的表处理的结果存储在ignite缓存中,6~9号为读取ignite缓存以及hdfs文件做聚合后的结果并写入ignite缓存,10~11号为读取ignite缓存以及hdfs文件做聚合后的结果写出到HDFS文件。



可以看出当本地模式6台提升到10台时性能基本没有改变,spark集群为10台机器,9个worker,如果开启6个igniteNodes同时为本地模式,即有三台worker的缓存写入了其他机器上,但目前来看10台igniteNodes与6台igniteNodes的性能并没有大的不同。

但本地缓存模式比HDFS快是不争的事实,却没有想到只快了一丢丢,也许还有更多的优化没有做到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: