基于Apache Spark的大数据分析引擎应用研究
2018-04-17王军
王军
(西安外事学院,陕西西安,710077)
0 引言
工业和研究领域数据量的增长带来了巨大的机遇,同时也带来了巨大的计算挑战。由于数据规模已经超出了单机的计算能力,用户需要新系统将计算扩展到多个计算节点。因此,针对不同计算负载的新型集群编程模型大量涌现。刚开始,这些模型相对专业化,为解决新的负载问题开发新模型。例如,MapReduce支持批处理,但Google也开发了用于交互式SQL查询的Dremel和用于迭代图算法的Pregel。在开源的Apache Hadoop堆栈中,Storm和Impala等系统也是为专门的运算开发的。即使在关系数据库领域里,基本趋势也是要避免“通用”的系统。然而现实情况中大多数大数据应用程序需要结合许多不同的处理类型。“大数据”的本质在于它是多样性和无序性;典型的工作流程需要类似MapReduce的代码用于数据加载、类似SQL的查询以及迭代机器学习,使用专门的引擎会造成系统更加复杂,效率低下。为此,用户还必须将不同的系统连接在一起,某些应用程序甚至根本无法在任何引擎中高效表达。
1 Apache Spark编程模型
Spark框架编程的核心概念是弹性分布式数据集(RDDs),RDD是跨群集分区对象的容错集合。Spark通过Scala、Java、Python和R等编程语言中的功能性API来提供RDD接口,用户通过对自己的数据申请转换操作(如map、filter和groupBy等)来创建RDD。Spark允许RDD为用户的计算找到一个有效的计划,用户的转换操作返回一个表示计算结果的新RDD对象,当一个动作被调用时,Spark会查看用于创建执行计划的整个转换图,进而进行计算。
除了提供数据共享和各种并行操作外,RDD还可以自动从故障中恢复,因而具有很强的容错能力。传统的分布式计算系统通过数据复制或检查点提供容错功能,而Spark采用一种称为“lineage”的方法,每个RDD跟踪用于构建它的转换图,并在基础数据上重新执行转换操作以重建任何丢失的分区。基于lineage的恢复比数据密集型工作负载中的复制效率更高,因为通过网络写入数据比将数据写入RAM以及存储器的存储空间要慢得多。有损节点通常包含多个RDD分区,这些分区可以在其他节点上并行重建,因而恢复通常比重新运行程序快得多。
Spark与存储系统具有良好的集成性能。与谷歌的MapReduce很像,Spark被设计为与多个外部系统一起用于长期存储。Spark最常用于集群文件系统,如HDFS、S3和Cassandra等的键值存储,它也可以连接Apache Hive作为数据目录。虽然Spark SQL JDBC服务器等应用程序也可以在多个用户之间共享RDD,而RDD通常仅在应用程序中存储临时数据。Spark引擎与存储系统无关的设计理念使用户可以轻松地针对现有数据运行计算并增加多种数据源。
2 ApacheSpark高层库应用
RDD编程模型仅提供对象和函数的分布式集合, Spark使用RDD针对许多专用计算引擎构建了各种更高级的库。核心的思想是,控制存储在RDD中的数据结构、跨节点的数据分区以及在其上运行的功能,就可以在其他引擎中实现许多执行操作。事实上,这些库通常可以针对任务提供最优秀的性能,同时在库组合使用时也具有显著的优势。现讨论Apache Spark包含的四个主要库。
SQL和DataFrames。数据处理中最常见的应用之一是关系查询,Spark SQL及其前身Shark 23使用类似于分析数据库的技术在Spark上执行关系查询。这些系统支持列式存储、基于成本的优化和用于查询执行情况的代码生成,背后的主要思想是使用与分析数据库相同的数据布局,即压缩列式存储和内部RDD。在Spark SQL中,RDD中的每条记录都包含一系列以二进制格式存储的行数组,系统会生成代码以直接针对这些行数组来运行。
除了运行SQL查询之外,Spark SQL引擎为基本数据转换DataFrames提供了更高级别的抽象,这些数据转换是具有确定模式的RDD。DataFrames是R和Python中表格数据的常用抽象方式,用于过滤、计算和聚合新列的编程方法。在Spark中,这些操作映射到Spark SQL引擎并接收其所有优化。
Spark Streaming。Spark Streaming使用“离散化流”模型实现增量流处理。为了实现Spark的流式处理,我们将输入数据在时间上(如每200毫秒)进行分割,再与RDD中存储的状态相结合来产生新结果。由于使用谱系故障恢复较为便宜,因此可以将流式传输与批处理和交互式查询结合起来。
GraphX。GraphX提供了一个类似于Pregel和GraphLab的图形计算界面,通过为其构建的RDD选择分区功能,实现与这些系统相同的布局优化。
MLlib。MLlib是Spark的机器学习库,实现了50多种分布式模型训练的常用算法,包括决策树(PLANET)、潜在狄利克雷分配和交替最小二乘矩阵分解等。
Spark库可以在数据的所有RDD上运行,因而它们在应用程序中的组合也相对容易。由于Spark提供跨处理库的优化功能,因此除了在API层的兼容性,Spark的库组合在执行层也很有效。如果一个库运行映射函数,另外一个库在其映射结果上运行另外一个映射,则Spark将这些操作融合到一个映射中。同样,Spark的故障恢复功能可以在这些库中无缝连接,无论哪个库生成它,都可以重新计算丢失的数据。
3 小结
本文介绍了Apache Spark的发展历史,并详细介绍了编程模型并且解释了其非常普遍的原因,针对高层库介绍了ApacheSpark四个常用的库,以及这些库之间的相互调用的组合使用方法和应当注意的问题。对研究基于ApacheSpark的分布式大数据处理具有很好的参考价值。