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 Ignite的作用后,下面我们可以通过模拟编写一个大数据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.结束语

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

联系方式:
邮箱:smartloli.org@gmail.com
Twitter:https://twitter.com/smartloli
QQ群(Hadoop - 交流社区1):424769183
温馨提示:请大家加群的时候写上加群理由(姓名+公司/学校),方便管理员审核,谢谢!

热爱生活,享受编程,与君共勉!

作者:哥不是小萝莉 [关于我][犒赏]

出处:http://www.cnblogs.com/smartloli/

转载请注明出处,谢谢合作!

Apache Ignite剖析相关推荐

  1. 用Apache Ignite实现可扩展的数据网格

    在本文中,我们将先介绍数据网格(Data Grid)的基本概念.属性.以及能够提供的服务,然后讨论如何设计可扩展的数据网格,以满足实际场景的业务需求. 什么是数据网格? 数据网格是一组能够提供共享数据 ...

  2. Apache Ignite——集合分布式缓存、计算、存储的分布式框架

    Apache Ignite内存数据组织平台是一个高性能.集成化.混合式的企业级分布式架构解决方案,核心价值在于可以帮助我们实现分布式架构透明化,开发人员根本不知道分布式技术的存在,可以使分布式缓存.计 ...

  3. Apache Ignite(五):Ignite的集群部署

    Ignite具有非常先进的集群能力,本文针对和集群有关的技术点做一个简短的介绍,然后针对实际应用的可能部署形式做了说明和对比,从中我们可以发现,Ignite平台在部署的灵活性上,具有很大的优势.\ 1 ...

  4. Apache Ignite与Apache Hive的个人理解与总结

    首先,贴一下官网链接辟邪:官网链接 下面,就看我强行总结吧,如果理解有误,请大佬及时指正,感激不尽! Apache Ignite是啥玩意,在上一篇已经讲过了,可能还比较易于理解:理解Ignite传送门 ...

  5. 基准测试:Apache Ignite仍然领先于Hazelcast

    为什么80%的码农都做不了架构师?>>>    当在谷歌中搜索Apache Ignite时,发生了一个奇怪的事:Hazelcast的广告跑到了列表的顶部,建议说Hazelcast比I ...

  6. Apache Cassandra和Apache Ignite:关系并置和分布式SQL

    为什么80%的码农都做不了架构师?>>>    在上一篇文章中,回顾和总结了Cassandra中使用的查询驱动数据模型(或者说非常规数据模型)方法论的缺陷.事实证明,如果不对查询有深 ...

  7. apache ignite_Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署

    apache ignite 以前,我们已经成功创建了第一个由Apache Ignite支持的Spring boot Application. 在此博客上,我们将重点介绍Kubernetes方面需要做的 ...

  8. apache ignite_Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序

    apache ignite 在之前的一系列博客中,我们在Kubernetes集群上启动了一个Ignite集群. 在本教程中,我们将使用先前在Spring Boot Application上创建的Ign ...

  9. apache ignite_Kubernetes集群上的Apache Ignite和Spring第3部分:测试应用程序

    apache ignite 在上一个博客中,我们为Ignite应用程序创建了Kubernetes部署文件. 在此博客上,我们将在Kubernetes上部署Ignite应用程序. 我将在此使用minik ...

最新文章

  1. python下的橡皮线_python下载吴恩达deep learning编程习题
  2. 网站建设案例欣赏_网站制作设计案例_成都辰星建站
  3. html一级二级菜单,纯JS添加一级二级菜单的代码
  4. 每个程序员都必须遵守的编程原则
  5. Python中__new__和__init__的区别与联系
  6. LinkDevelop平台新建一个产品
  7. [react] render函数中return如果没有使用()会有什么问题?
  8. html5软件下载页面源码
  9. ctreectrl 设置选中_CTreeCtrl点击获得选中项
  10. c++排序函数_Excel的排名函数rank,不得不说好用
  11. 宠物王国6java变态版,宠物王国外传999999级变态版
  12. 基于COMSOL的螺栓连接 的几种有限元建模方
  13. PTA作业记录2(计算油费)
  14. PHPnow-1.5.6中升级php-5.2.14-Win32到php-5.3.5
  15. ATX安装及简单使用
  16. Vue学习第36天——PC端和移动端常用的Vue UI组件库
  17. 【技巧】修改windows10在高分屏下的应用的dpi
  18. DeeCamp 2020总冠军,Mixlab社区专访 | AI+积木 = 方仔照相馆
  19. win10安装和搭建vue环境(超详细教程)Vue新手教程(1):
  20. Outlook共享日历编辑权限

热门文章

  1. 英特尔支持员工自带设备办公
  2. CSLA.Net 3.0.5 项目管理示例 名值列表基类、只读基类、业务负责人基类
  3. 一个多线程应用的最佳示例
  4. python-django框架中使用docker和elasticsearch配合实现搜索功能
  5. 同步锁Lock的使用
  6. 4节点近160万IOPS:SDS/超融合测试不能只看数字
  7. Django 操作Mysql数据库 对表进行增删改查
  8. TypeScript 初识
  9. IE下使用jquery ajax失效的原因
  10. 类的成员函数指针和mem_fun适配器的用法