最新动态
apache ignite系列(三):数据处理(数据加载,数据并置,数据查询)
2024-10-31 21:50

​ 使用ignite的一个常见思路就是将现有的关系型数据库中的数据导入到ignite中,然后直接使用ignite中的数据,相当于将ignite作为一个缓存服务,当然ignite的功能远不止于此,下面以将ignite集成进java服务的方式进行演示ignite的数据存储和查询相关的功能。由于个人习惯,示例演示没有使用测试代码,而是使用rest接口演示。

apache ignite系列(三):数据处理(数据加载,数据并置,数据查询)

​ 在讲数据加载之前,ignite中存储的几种模式(LOCAL, REPLICATED, PARTITIONED):

LOCAL:本地模式,数据都存储在本地,无数据再平衡,类似常见的存储服务;

PARTITIONED:分区模式,数据分散到集群中的各个节点,分区模式适合存储数量庞大的数据

如图所示是设置了Backup备份数的,默认备份数是0,如果分区模式下不设置备份数的话则会存在丢失数据的风险。

REPLICATED:复制模式,有数据再平衡过程,主节点(Primary)数据与分区模式的一致,只是复制模式默认备份了除主节点数据外的其余数据。复制模式适合存储数据量小,增长不快的数据。

分区模式和复制模式各有优点和缺点,具体选择要根据实际场景的特点去权衡:

模式 优点 缺点 分区模式(PARTITIONED) 能存储海量数据,频繁更新对其影响不大 查询缓存涉及到数据移动,对查询性能有影响 复制模式(REPLICATED) 适合存储数据量不大的数据,数据查询性能稳定 频繁更新对其影响较大

这里使用查询MYSQL里的数据然后存入ignite,完整代码可以参考:

https://github.com/cording/ignite-example

为了演示,需要先在MYSQL中生成样本数据,相关sql脚本为,执行该SQL脚本即可完成表的创建和测试数据的初始化。

在配置文件中定义缓存

添加相关依赖

​ 一般将数据导入ignite集群的方式是使用方法,但是当有大量的数据需要导入的时候,put的效率已经无法满足了,针对大量数据导入可以使用ignite的流处理器:

导入数据之后,可以在监控程序中看到数据存储情况:

​ 流之所以能提高加载数据的速度,是因为流本质就是一个批处理。ignite是通过一致性哈希保证一致性的,每往集群中存入一条cache记录,ignite会先根据一致性哈希算法计算出这条cache映射到哪个节点,然后会将这条记录存储在该节点。而在流处理器中,流处理器会将映射到相同节点的数据批量存储到对应节点,这样会显著提升数据加载的效率。

​ 最直接的查询缓存方式是使用方法,这种方式只能应对简单的key-value缓存,如果是设置了索引类型(indexedTypes),则缓存就会变成,这个时候就需要使用SQL方式查询,当使用SQL方式查询的时候,一般会有各种查询条件,这些查询条件对应的字段均需要预先设置索引。ignite里面有两种索引,一种是普通索引,一种是组合索引,要用到注解。而查询用到的api主要是和,前者是域查询,也就是查询部分字段结果集,而后者是普通查询。

​ 所以,如果想使用SQL查询,就需要在加载数据之前在缓存定义中设置索引类型(indexedTypes),并对查询中可能用到的字段在对应实体类中相关属性添加注解,有必要的情况下还要设置索引。当定义缓存的时候设置了索引类型,则缓存不再是普通的KV形式的缓存了,而是具有数据库表的特性,这时候ignite就变成了分布式的内存数据库了,其sql相关功能是基于h2的sql引擎实现的。

1) 设置缓存索引类型

  • JAVA代码定义缓存时设置索引类型
  • 这里以long为主键,String为实体类作为示例:

    使用即可设置索引

  • XML配置中设置索引类型
  • 同样也是设置属性即可

    2) 注解的三种用法

  • 启用实体类属性为查询域
  • 加上该注解后,字段才可以在语句中访问,这种形式不对该属性列创建索引。

  • 启用查询域并为该列设置普通索引
  • 启用查询域并设置组合索引
  • 其中name属性指定了组合索引的名字,order表示该字段在组合索引中的顺序。

    该组合索引与普通数据库类似,同样遵循最左原则,即组合索引是否会用到会受到最左原则的限制。

    3) 使用 SqlFieldsQuery进行域查询

    SQL语法中有两个预定义字段和:

    : 表示缓存中的所有键

    : 表示缓存中的所有值对象

    4) 使用进行普通查询

    运行结果如下:

    ​ 数据的并置主要是针对采用分区模式存储的数据,所谓的数据并置,就是提供一种约束,将相关连的数据存储在相同的网格节点上,这样在数据查询或者分布式计算的时候就不需要数据移动了,这样会提升整体的性能。

    ​ 以下以X,Y,Z三个cache的并置作为示例,完整代码请查看示例工程。

    其中X,Y,Z为三个分区模式的cache,Y与X并置,也就是说,Y的数据在存储的时候,会根据其属性,将数据存储在对应的X所在的节点上,同理,Z与Y并置,也就是将Z的数据存储在其YId属性对应的Y所在的节点上。以此形成一种约束,使得数据的分配可以人为控制。

    要使用数据并置,就不得不提到一个API了,也就是,当一个cache与另外一个cache并置的时候,其cache的Key就得是类型了。

    首先进行数据初始化:

    而cache并置之后怎么校验并置是否成功呢?这就要用到的方法了,其作用是根据给定的key,找到存储该key的节点信息,具体使用方法如下:

    执行之后,无异常抛出,在监控程序中查看一下存储情况:

    会发现三个cache的数据分布完全一致,这与验证程序的结果(无异常抛出)保持一致,说明cache并置成功。

    当数据并置成功后,就可以使用关联查询了,可以类比数据库中的多表联查:

    执行结果如下:

    如果是没有并置的缓存,在关联查询的时候就需要启用非并置的分布式关联:

        以上就是本篇文章【apache ignite系列(三):数据处理(数据加载,数据并置,数据查询)】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/3851.html 
         行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多