以下介绍两种分布式数据交互式处理解决方案。这两种方案都能在不需要ETL的基础上实现数据的交互式处理。
1.Prestosql
第一种是采用经典的数据联合查询引擎PrestoSQL而非PrestoDB。 Prestosql主要提供分布式的数据查询引擎,并不直接提供存储组件,而是依赖第三方数据库作为存储组件。
Presto查询引擎是一个传统的Master-Slave的架构,由一个Coordinator节点,一个Discovery Server节点,多个Worker节点组成,Discovery Server通常内嵌于Coordinator节点中。Coordinator负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行。Worker节点负责实际执行查询任务。Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息,Worker节点与HDFS交互读取数据。Presto使用ANSI SQL语法和语义。
既然Presto是一个交互式的查询引擎,我们最关心的就是Presto实现低延时查询的原理,我认为主要是下面几个关键点,当然还有一些传统的SQL优化原理,这里不介绍了。
- 完全基于内存的并行计算
- 流水线
- 本地化计算
- 动态编译执行计划
- 小心使用内存和数据结构
- 类BlinkDB的近似查询
- GC控制
注意:它只是内存计算,但是并不提供内存数据网格,因而是cacahe并不是全量数据存储在内存中,是查询运算在内存中进行,数据读取仍然是要去物理存储库读取。不支持机器学习计算。
分析:性能应该低于数据完全在内存中的ignite。
2.Ignite
通过内存数据引擎ignite。Apache ignite的数据以数据网格的形式在集群中进行组织和构建。这里所说的数据网格就是指数据的存储数据结构,由于以内存的形式在集群结点中进行存储,以物理看每个结点都是独立的数据存储,但是在ignite中通过虚拟化内存的方式,将各个结点中的数据进行组织,形成了一份完整的数据视图。因而以数据网格进行命名。
ignite是一种可管理的基于堆外的内存架构,ignite的内存数据被分割成固定大小的页面。让我们来看看下面的图片,并尝试更多地了解这个内存架构。
ignite内存中的数据网格是基于水平扩展的概念和实时添加节点的能力构建的;它被设计成线性扩展到数百个节点,为数据本地化和关联数据路由提供强大的语义,以减少冗余的数据噪声。ignite数据网格是一个内存分布式key-value存储,他可以被视为一个分布式分区哈希映射,每个集群节点拥有所有数据的一部分。这样,我们添加的集群节点越多,我们可以缓存的数据就越多。与其他键值存储不同,ignite用可插拔哈希算法来确定数据位置。每个客户端都可以通过将其插入到哈希函数中来确定哪个是key所在的节点,而不需要任何特殊的映射服务器或名称节点。
ignite数据网格支持本地的,重复的,分区的数据集,并允许自由的使用标准的SQL语法和KV操作、甚至是机器学习函数在那些数据之间交叉查询。ignite支持用标准SQL来查询内存数据,包括对分布式SQL联接的支持。ignite数据网格是快速的,他是在今天的集群中,最快速的事务或原子数据实现之一。
内存中数据网格是一种直读/直写缓存策略,其中应用程序层将数据网格视为主要数据存储。应用程序在内存集群中进行读写操作,该集群会将所有更改传播到任何基础数据库,从而自动使它们保持更新并与内存数据保持一致。
Ignite作为内存中的数据网格提供了简化其采用所需的所有必需API。这些API包括分布式键值和ANSI SQL查询,ACID事务,共置处理和机器学习模型。Ignite可以使用两个数据持久性选项将数据存储在内存和磁盘中。您可以将更改持久存储在外部数据库中,也可以让Ignite将数据保持在其本机持久性中。
通过Ignite实现的数据联邦架构如下:
通过在应用程序和数据库层之间作为内存中的数据网格插入,Ignite可以提高任何外部数据库(如RDBMS,NoSQL或Hadoop)的性能和可伸缩性,形成数据联邦。当应用程序将数据写入高速缓存时,Ignite会自动将所有数据修改直写或写到底层外部存储中。Ignite还执行ACID事务,它在整个集群以及数据库中协调和提交事务。
另外,可以将Ignite部署为共享的统一内存层,该层存储源自脱节数据库的数据集。您的应用程序可以将Ignite的所有数据作为单个存储使用,而Ignite可以在内存数据更新时使原始数据库保持同步。但是,如果将外部数据库用作Ignite内存中数据网格部署的持久层,则存在一些限制。例如,如果您运行Ignite SQL或扫描查询,则需要确保所有数据都已预加载到内存群集中。请注意,仅当数据以Ignite本机持久性存储时,Ignite SQL或扫描查询才能从磁盘读取数据。
采用Ignite作为数据联邦的cache们可以将需要的所有数据视图在ignite中进行构建。这样所需要的数据服务,查询,修改等,都已ignite为桥梁实现高性能的数据操作,ignite会自动把数据修改进行持久化。
优点:
- 所有的数据访问都是在内存中完成,具备高效性
- 数据以KV形式存储,可以进行机器学习运算
- 所有数据都在内存中,提供隐试的查询调度,不需要类似prestsql的查询调度。
- 提供ACID
缺点:
- 数据表、库元数据需要用户自己维护。
- 需要用户自己进行查询优化。
- 需要内存容量巨大