Apache Ignite剖析

1.概述

  Apache Ignite和Apache Arrow很类似,属于大数据范畴中的内存分布式管理系统。在《Apache Arrow 内存数据》中介绍了Arrow的相关内容,它统一了大数据领域各个生态系统的数据格式,避免了序列化和反序列化所带来的资源开销(能够节省80%左右的CPU资源)。今天来给大家剖析下Apache Ignite的相关内容。

2.内容

  Apache Ignite是一个以内存为中心的数据平台,具有强一致性、高可用、强大的SQL、K/V以及其所对应的应用接口(API)。结构分布图如下所示:

  在整个Ignite集群中的多个节点中,Ignite内存中的数据模式有三种,分别是LOCAL、REPLICATED和PARTITIONED。这样增加了Ignite的扩展性,Ignite可以自动化的控制数据如何分区,使用者也可以插入自定义的方法,或是为了提供效率将部分数据并存在一起。

  Ignite和其他关系型数据库具有相似的行为,但是在处理约束和索引方面略有不同。Ignite支持一级和二级索引,但是只有一级索引支持唯一性。在持久化方面,Ignite固化内存在内存和磁盘中都能良好的工作,但是持久化到磁盘是可以禁用的,一般将Ignite作为一个内存数据库来使用。

  由于Ignite是一个全功能的数据网格,它既可以用于纯内存模式,也可以带有Ignite的原生持久化。同时,它还可以与任何第三方的数据库集成,包含RDBMS和NoSQL。比如,在和Hadoop的HDFS、Kafka等,开发基于大数据平台下的SQL引擎,来操作HDFS、Kafka这类的大数据存储介质。

2.1 内存和磁盘

  Apache Ignite是基于固化内存架构的,当Ignite持久化存储特性开启时,它可以在内存和磁盘中存储和处理数据和索引。在固化内存和Ignite持久化存储同时开启时,具有以下优势:

2.1.1 内存优势

  • 对外内存
  • 避免显著的GC暂停现象
  • 自动化碎片清理
  • 可预估的内存消耗
  • 高SQL性能

2.1.2 磁盘优势

  • 可选的持久化
  • 支持SSD介质
  • 分布式存储
  • 支持事物
  • 集群瞬时启动

2.2 持久化过程

  Ignite的持久化存储时一个分布式的、支持ACID、兼容SQL的磁盘存储。它作为一个可选的磁盘层,可以将数据和索引存储到SSD这类磁盘介质,并且可以透明的与Ignite固化内存进行集成。Ignite的持久化存储具有以下优势:

  • 可以在数据中执行SQL操作,不管数据在内存还是在磁盘中,这意味着Ignite可以作为一个经过内存优化的分布式SQL数据库
  • 可以不用讲所有的数据和索引保持在内存中,持久化存储可以在磁盘上存储数据的大数据集合,然后只在内存中保持访问频繁的数据子集
  • 集群是瞬时启动,如果整个集群宕机,不需要通过预加载数据来对内存进行数据“预热”,只需要将所有集群的节点都连接到一起,整个集群即可正常工作
  • 数据和索引在内存和磁盘中以相似的格式进行存储,避免复杂的格式转化,数据集只是在内存和磁盘之间进行移动

  持久化流程如下图所示:

2.3 分布式SQL内存数据库

  在Apache Ignite中提供了分布式SQL数据库功能,这个内存数据库可以水平扩展、容错且兼容标准的SQL语法,它支持所有的SQL及DML命令,包含SELECT、INSERT、DELETE等SQL命令。依赖于固化内存架构,数据集和索引可以同时在内存和磁盘中进行存储,这样可以跨越不同的存储层执行分布式SQL操作,来获得可以固化到磁盘的内存级性能。可以使用Java、Python、C++等原生的API来操作SQL与Ignite进行数据交互,也可以使用Ignite的JDBC或者ODBC驱动,这样就具有了真正意义上的跨平台连接性。具体架构体系,如下图所示:

3.代码实践

  了解Apache的作用后,下面我们可以通过模拟编写一个大数据SQL引擎,来实现对Kafka的Topic的查询。首先需要实现一个KafkaSqlFactory的类,具体实现代码如下所示:

/**
 * TODO
 *
 * @author smartloli.
 *
 *         Created by Mar 9, 2018
 */
public class KafkaSqlFactory {

	private static final Logger LOG = LoggerFactory.getLogger(KafkaSqlFactory.class);

	private static Ignite ignite = null;

	private static void getInstance() {
		if (ignite == null) {
			ignite = Ignition.start();
		}
	}

	private static IgniteCache<Long, TopicX> processor(List<TopicX> collectors) {
		getInstance();
		CacheConfiguration<Long, TopicX> topicDataCacheCfg = new CacheConfiguration<Long, TopicX>();
		topicDataCacheCfg.setName(TopicCache.NAME);
		topicDataCacheCfg.setCacheMode(CacheMode.PARTITIONED);
		topicDataCacheCfg.setIndexedTypes(Long.class, TopicX.class);
		IgniteCache<Long, TopicX> topicDataCache = ignite.getOrCreateCache(topicDataCacheCfg);
		for (TopicX topic : collectors) {
			topicDataCache.put(topic.getOffsets(), topic);
		}
		return topicDataCache;
	}

	public static String sql(String sql, List<TopicX> collectors) {
		try {
			IgniteCache<Long, TopicX> topicDataCache = processor(collectors);
			SqlFieldsQuery qry = new SqlFieldsQuery(sql);
			QueryCursor<List<?>> cursor = topicDataCache.query(qry);
			for (List<?> row : cursor) {
				System.out.println(row.toString());
			}
		} catch (Exception ex) {
			LOG.error("Query kafka topic has error, msg is " + ex.getMessage());
		} finally {
			close();
		}
		return "";
	}

	private static void close() {
		try {
			if (ignite != null) {
				ignite.close();
			}
		} catch (Exception ex) {
			LOG.error("Close Ignite has error, msg is " + ex.getMessage());
		} finally {
			if (ignite != null) {
				ignite.close();
			}
		}
	}

}

  然后,模拟编写一个生产者来生产数据,并查询数据集,实现代码如下所示:

public static void ignite(){
		List<TopicX> collectors = new ArrayList<>();
		int count = 0;
		for (int i = 0; i < 10; i++) {
			TopicX td = new TopicX();
			if (count > 3) {
				count = 0;
			}
			td.setPartitionId(count);
			td.setOffsets(i);
			td.setMessage("hello_" + i);
			td.setTopicName("test");
			collectors.add(td);
			count++;
		}

		String sql = "select offsets,message from TopicX where offsets>6 and partitionId in (0,1) limit 1";
		long stime = System.currentTimeMillis();
		KafkaSqlFactory.sql(sql, collectors);
		System.out.println("Cost time [" + (System.currentTimeMillis() - stime) / 1000.0 + "]ms");
	}

  执行结果如下所示:

4.总结

  Apache Ignite整体来说,它基本把现在分布式的一些概念都集成了,包含分布式存储、分布式计算、分布式服务、流式计算等等。而且,它对Java语言的支持,与JDK能够很好的整合,能够很友好的兼容JDK的现有API,当你开启一个线程池,你不需要关系是本地线程池还是分布式线程池,只管提交任务就行。Apache Ignite在与RDBMS、Hadoop、Spark、Kafka等传统关系型数据库和主流大数据套件的集成,提供了非常灵活好用的组件API。

5.结束语

  这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

原文地址:https://www.cnblogs.com/smartloli/p/8542960.html

时间: 2024-10-10 14:19:57

Apache Ignite剖析的相关文章

Apache Ignite——新一代数据库缓存系统

Apache Ignite是一个通用的数据库缓存系统,它不仅支持所有的底层数据库系统,比如RDBMS.NoSQL和HDFS,还支持Write-Through和Read-Through.Write-Behind Caching等可选功能. Apache Ignite是一个聚焦分布式内存计算的开源项目,它在内存中储存数据,并分布在多个节点上以提供快速数据访问.此外,可选地将数据同步到缓存层同样是一大优势.最后,可以支持任何底层数据库存储同样让 Ignite成为数据库缓存的首先.

有关Apache Ignite的peer class loading (P2P class loading)

目前用的是最新孵化版本:1.3.0-incubating. 官方文档https://apacheignite.readme.io/docs/zero-deployment    这里给出了一个一个分布式类加载机制(distributed ClassLoader). 文档这么说的: The closures and tasks that you use for your computations may be of any custom class, including anonymous cla

分布式数据库缓存系统Apache Ignite

Apache Ignite内存数据组织是高性能的.集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升. 将数据存储在缓存中能够显著地提高应用的速度,因为缓存能够降低数据在应用和数据库中的传输频率.Apache Ignite允许用户将常用的热数据储存在内存中,它支持分片和复制两种方式,让开发者可以均匀地将数据分布式到整个集群的主机上.同时,Ignite还支撑任何底层存储平台,不管是RDBMS.NoSQL,又或是HDFS. 在

Apache Ignite 改装(一) -- 服务异步化支持

本文假设读者了解Apache Ignite,阅读过ignite service grid的官方文档,或使用过ignite的service grid,本文同样假设读者了解 java的CompletionStage的相关用法.本文涉及的ignite版本为2.4.0. 使用Apache Ignite的Service grid作为微服务开发框架, 通常是如下定义和实现Service的: 服务接口: public interface MyService { public String sayHello(S

apache ignite系列(一): 简介

apache-ignite简介(一) 1,简介 ? ignite是分布式内存网格的一种实现,其基于java平台,具有可持久化,分布式事务,分布式计算等特点,此外还支持丰富的键值存储以及SQL语法(基于h2引擎),可以看成是一个分布式内存数据库. 与ignite类似的产品有gemfire(12306目前正在使用),其开源版为geode.与gemfire相比,ignite对sql的支持比较完善,提供了数据并置来提升性能,还有对分布式事物的支持以及对spring的集成都比较友好,很方便进行嵌入式集成进

apache ignite系列(九):使用ddl和dml脚本初始化ignite并使用mybatis查询缓存

? 博客又断了一段时间,本篇将记录一下基于ignite对jdbc支持的特性在实际使用过程中的使用. 使用ddl和dml脚本初始化ignite 由于spring-boot中支持通过spring.datasource.schema属性指定初始化DDL脚本,spring.datasource.data指定初始化DML脚本.而ignite支持jdbc协议,测试了一下,发现一样可以通过该配置初始化ignite. spring.datasource.url=jdbc:ignite:thin://127.0.

Apache Ignite上的TensorFlow

任何深度学习都是从数据开始的,这是关键点.没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要.在做研究.构建新的神经网络架构.以及做实验时,会习惯于使用最简单的本地数据源,通常是不同格式的文件,这种方法确实非常有效.但有时需要更加接近于生产环境,那么简化和加速生产数据的反馈,以及能够处理大数据就变得非常重要,这时就需要Apache Ignite大展身手了. Apache Ignite是以内存为中心的分布式数据库.缓存,也是事务性.分析性和流式负载的处理平台,可以实

apache ignite系列(九):ignite调优

1,配置文件调优 1.1 设置页面大小(pagesize) 先查看系统pagesiz,使用PAGE_SIZE或者PAGESIZE # getconf PAGE_SIZE 4096 # getconf PAGESIZE 4096 ignite默认配置是4k,也就是4096,如果服务器和ignite默认配置不一致,那么就得在配置文件中指定: <bean class="org.apache.ignite.configuration.IgniteConfiguration"> &l

Apache Beam 剖析

1.概述 在大数据的浪潮之下,技术的更新迭代十分频繁.受技术开源的影响,大数据开发者提供了十分丰富的工具.但也因为如此,增加了开发者选择合适工具的难度.在大数据处理一些问题的时候,往往使用的技术是多样化的.这完全取决于业务需求,比如进行批处理的MapReduce,实时流处理的Flink,以及SQL交互的Spark SQL等等.而把这些开源框架,工具,类库,平台整合到一起,所需要的工作量以及复杂度,可想而知.这也是大数据开发者比较头疼的问题.而今天要分享的就是整合这些资源的一个解决方案,它就是 A