Spark+ignite 实现海量数据低成本高性能 OLAP
Spark 的核心定位是一个分布式统一大数据分析引擎,经过先进的 RDD 模型和大量内存的使用,解决了使用 Hadoop 的 MapReduce 进行多轮迭代式计算的性能问题。而后在 RDD 的基础上不断完善,引入了 Dataset 和 DataFrame、SparkSQL、Spark Streaming、SparkML 等更高级的功能。Spark 对 Hadoop 技术栈有很是好的支持,不少能够直接集成,虽然也能够支持 RDBMS 的读写,可是这不是 Spark 主要的关注方向。其性能瓶颈在于会做大量数据抽取时数据会进行大量 IO 操作。IO 直接影响 Spark Action 性能。
Ignite 可以说这是目前生产中使用的最快的原子数据处理平台之一,是一个分布式的内存数据计算平台,为事务型、分析型和流式负载而设计,在保证扩展性的前提下提供了内存级的性能。该平台使用内存作为存储层,具有很高的性能。支持 HTAP 应用程序的事务和实时分析,并且可以支持物联网 (IoT) 程序或跨数据湖和操作数据集的实时分析。 Ignite 提供任何规模的实时性能和线性水平可扩展性,无论是部署在本地、公共或私有云中,还是在混合环境中。
从介绍描述看,两个技术是可以互补,即是 IgniteRDD, IgniteRDD 是一个 SparkRDD 抽象的实现,实现 RDD 在 Ignite 与 Spark 中互认互通。
通过 IgniteRDD 整合这两种技术整合后带来若干明显的好处:
通过避免大规模的数据移动,且基于内存读取数据,可以实现真正的大规模的性能提升。
完全基于分布式的数据操作可以提升 RDD、DataFrame 和 SQL 性能。
状态和数据可以更轻松地在 Spark 作业之间共享。
Spark 与 Ignite 集成后可以看到 Spark 底层的数据 IO 被 Ignite 分布式适配到了数据层。
Ignite 提供了一个 SparkRDD 的实现,即 IgniteRDD,这个实现可以在内存中跨 Spark 作业共享任何数据和状态,IgniteRDD 为 Ignite 中相同的内存数据提供了一个共享的、可变的视图,它可以跨多个不同的 Spark 作业、工作节点或者应用,相反,原生的 SparkRDD 无法在 Spark 作业或者应用之间进行共享。
IgniteRDD 作为 Ignite 分布式缓存的视图,既可以在 Spark 作业执行进程中部署,也可以在 Spark 工作节点中部署,也可以在它自己的集群中部署。因此,根据预配置的部署模型,状态共享既可以只存在于一个 Spark 应用的生命周期的内部(嵌入式模式),或者也可以存在于 Spark 应用的外部(独立模式)。
Ignite 还可以帮助 Spark 用户提高 SQL 的性能,虽然 SparkSQL 支持丰富的 SQL 语法,但是它没有实现索引。从结果上来说,即使在普通的较小的数据集上,Spark 查询也可能花费几分钟的时间,因为需要进行全表扫描。如果使用 Ignite,Spark 用户可以配置主索引和二级索引,这样可以带来上千倍的性能提升。
Ignite 集成 Spark RDD 后的优点除了上面总计的三点,还表现在以下方面的提升:
部署稳定性:
Ignite
Ignite 集群基于无共享架构,全部的集群节点都是平等的、独立的,整个集群不存在单点故障。 经过灵活的 Discovery SPI 组件,Ignite 节点能够自动地发现对方,所以只要须要,能够轻易地对集群进行缩放。
Ignite 能够独立运行,能够组成集群,能够运行于 Kubernetes 和 Docker 容器中,也能够运行在 Apache Mesos 以及 Hadoop Yarn 上,能够运行于虚拟机和云环境,也能够运行于物理机,从技术上来讲,集群部署在哪里,是没有限制的。
Ignite 还支持嵌入式部署,也就是和应用集成在一块儿。
Spark
Spark 支持四种分布式部署方式:分别是 Standalone、Spark on Mesos、Spark on YARN 和 Kubernetes。
Spark 的部署属于 Master/Slave 模式,可能存在单点故障问题,可是能够经过 ZooKeeper 解决。
存储支持灵活
Ignite
RDBMS:Ignite 做为一个缓存系统,自然对 RDBMS 有良好的支持,基本上只要支持 JDBC/ODBC 协议的数据库都没有问题。对于数据的加载、数据的读写及其一致性(事务)保证、各类工具的支持、各类通讯协议的支持都包罗万象,是一个完整的方案;NoSQL:Ignite 对于各类 NoSQL 数据库的支持是有限的,由于功能定位的缘由,不是任何 NoSQL 产品都适合和 Ignite 整合进而提高能力,就目前来讲,Ignite 在不一样的功能场景对 NoSQL 提供了支持,包括对 HDFS 的支持,也包括与 Cassandra 的原生集成;原生持久化:Ignite 基于固化内存架构,提供了原生持久化,能够同时处理存储于内存和磁盘上的数据和索引,它将内存计算的性能和扩展性与磁盘持久化和强一致性整合到一个系统中。 原生持久化以有限的性能损失,透明地提供了更强大的功能,即便整个集群重启,内存不须要预热,数据能够直接访问。Spark
RDBMS:SparkRDD 能够将 RDBMS 做为数据来源之一,支持 RDBMS 数据的批量读写,也支持各类类型的 RDBMS,可是 Spark 对 RDBMS 的读写,属于批量模式,Spark 更多地会将 RDBMS 做为分析型业务的数据来源之一,最后若有必要,则将业务分析的结果批量回写 RDBMS;NoSQL:Spark 原生支持 JDBC、JSON、Parquet、csv、libsvm 以及 orcFile 等,也能够经过扩展接口自定义数据源。Spark 能够直接或者经过各类链接器读取 Hive、Hbase、Cassandra 中的数据,而后建立对应的 RDD,写入也是同理,这个能力是 Ignite 所不具有的;原生持久化:Spark 不具有原生的持久化能力。
流计算支持更丰富
Ignite
Ignite 能够与主流的流处理技术和框架进行集成,好比 Kafka、Camel、Storm 与 JMS,提供可扩展和容错的能力。流处理技术为 Ignite 提供了一种数据加载机制,针对流式数据,Ignite 也提供了各类处理和查询功能。Ignite 社区官方提供了 10 种流处理技术的集成实现,利用统一的 API,开发者也能够自行开发流处理技术实现。Ignite 为全部流入 Ignite 的数据以可扩展和容错的方式提供至少一次保证。
Spark
Spark Streaming 是基于 Spark 的流式批处理引擎,其基本原理是把输入数据以某一时间间隔批量的处理,即以时间为单位切分数据流,每一个切片内的数据对应一个 RDD,进而能够采用 Spark 引擎进行快速计算。其一样支持众多的数据源,内部的数据表示形式为 DStream。Spark Streaming 吞吐量高,能够作复杂的业务逻辑,可是秒级别的延迟是否符合业务需求须要确认。Spark Streaming 能够与 Spark 其余技术完美集成,包括 SparkML、SparkSQL 等。
两个框架的结合也可以解决实际项目中的一些痛点:(1)Spark 大数据基于原始 RMDB 计算时间长,IO 性能低。(2)大数据计算需要借助很重的大数据套件,交付成本高,比如比较重的 oracle。
整体可以实现基于开源系统加上更多的廉价计算节点可以实现高性能的数据仓库与计算分析。
版权声明: 本文为 InfoQ 作者【张磊】的原创文章。
原文链接:【http://xie.infoq.cn/article/ff89e7606cfd49b8e5004c011】。未经作者许可,禁止转载。
评论