1.5 Spark RDD和DataFrame
本节关注数据以及Spark如何表示和组织数据。我们将介绍Spark RDD和DataFrame技术。
通过本节的学习,读者将掌握Spark的两个关键概念:RDD和DataFrame,并将它们应用于机器学习项目。
1.5.1 Spark RDD
Spark主要以一种分布式项集合的形式进行数据抽象,称之为弹性分布式数据集(Resilient Distributed Dataset,RDD)。RDD是Spark的关键创新,使其比其他框架计算更加快速和高效。
特别地,RDD是不可改变的对象集合,分布在集群之中。它静态地定义对象类型,例如RDD[T]对象类型则是T,主要有字符串RDD、整数RDD和对象RDD。
此外,RDD:
是基于用户划分的分布在集群上的对象集合
由并行转换器(如map和filter)创建
也就是说,RDD物理上分布在一个集群上,逻辑上作为一个实体进行操作。RDD具有容错特性,可以自动进行失效重建。
新的RDD可以从Hadoop输入格式化(HDFS文件)创建,或通过其他RDD进行转换得到。
创建RDD,用户可以:
通过驱动程序将对象集合分散化(使用Spark上下文的并行化方法)
加载外部数据集
转换已有的RDD
Spark团队称上述两类RDD操作为:行动(action)和转换(transformation)。
行动返回结果,转换返回新RDD的指针。RDD行动的例子有:collect、count和take。
转换是延迟评估的,RDD转换的例子有:map、filter和join。
RDD的行动和转换可以组合起来实现复杂的运算。
了解更多RDD的知识,可访问https://www.cs.berkeley.edu/~matei/papers/ 2012/ nsdi_spark.pdf。
1.5.2 Spark DataFrame
DataFrame是一个列数据组成的分布式数据集合,实际上,是按列的名字分组的分布式数据集合,也就是带有模式的RDD。换句话说,Spark DataFrame是RDD的扩展。
DataFrame相当于每列具有名字命名,可以使用名字替代索引进行操作的RDD。
Spark DataFrame在概念上与R语言DataFrame等价,与关系数据库中的表类似,这项技术促进了机器学习社区快速接受Spark。用户可以(使用Spark DataFrame)直接操作列数据,而这是RDD所不具备的。具备了数据模式知识,用户可以利用自己熟悉的SQL数据操作技术来操作数据,可以从很多原始数据源创建Spark DataFrame,例如结构化关系数据文件、Hive表或已有的RDD。
Spark已经创建了特殊的DataFrame API和Spark SQL来处理DataFrame。Spark DataFrame API和Spark SQL都支持Scala、Java、Python和R语言。作为已有RDD API的扩展,DataFrame API具有下列特性:
具备(从单个笔记本电脑几KB数据到大型集群PB级数据)可伸缩计算能力
支持各类数据格式和存储系统
通过Spark SQL Catalyst优化器提供最先进的优化和代码生成
通过Spark与所有大数据工具和框架无缝集成
Spark SQL与Spark DataFrame良好集成,有利于用户简便地进行ETL数据抽取和操作任何数据子集。用户可以对它们进行转换,并提供给包括R语言用户在内的其他用户。Spark SQL也可以与HiveQL一起使用,它的处理速度非常快。相对于使用Hadoop和直接使用RDD,使用Spark SQL可以大幅减少代码数量。
更多信息,请访问:http://spark.apache.org/docs/latest/sql-programming-guide.html。
1.5.3 R语言DataFrame API
DataFrame是机器学习编程的一个关键元素。Spark提供R语言、Java和Python的DataFrame API,以便用户在他们熟悉的环境和语言中操作Spark DataFrame。本节将简要介绍一下Spark DataFrame的操作,并提供一些简单的R语言例子,供读者实践。
在Spark环境中,所有相关功能的使用入口都是Spark的SQLContext类,或它的派生类。创建一个基本的SQLContext类,所有用户需要执行下面的SparkContext命令:
创建一个Spark DataFrame,用户可以执行如下命令:
下面给出一些Spark DataFrame操作的例子:
更多信息,请访问:http://spark.apache.org/docs/latest/sql-programming-guide.html#creating-dataframes。
1.5.4 机器学习框架、RM4E和Spark计算
本节,我们以RM4E作为例子讨论机器学习的框架,以及其与Spark计算的关系。
学习完本节之后,读者将掌握机器学习的概念和一些例子,并能够将它们与Spark计算相结合来规划和实现机器学习项目。
1.5.5 机器学习框架
正如前几节所讨论的,Spark计算与Hadoop的MapReduce非常不同,Spark计算速度更快,使用更加容易。在机器学习中采用Spark计算有很多的优势。
然而,对于机器学习专业人员来讲,只有具有良好的机器学习框架才能实现所有的优势。这里,机器学习框架意味着一个能够整合包括机器学习算法在内的所有机器学习元素的系统或方法,使用户最有效地使用它们。具体来讲,这包括数据表示与处理的方法、表示和建立预测模型的方法、评价和使用建模结果的方法。从这方面来看,在数据源的处理、数据预处理的执行、算法的实现,以及复杂计算支持方面的不同,使得机器学习框架与众不同。
目前有多种机器学习框架,正如有多种不同的计算平台支持这些框架。在所有可用的机器学习框架中,着重于迭代计算和交互处理的框架被公认为是最好的,因为这些特性可以促进复杂预测模型估计和研究人员与数据间的良好交互。当下,优秀的机器学习框架仍然需要包含大数据功能、大量快速处理能力,以及容错能力。优秀的框架通常包括大量的机器学习算法和可用的统计检验。
正如前几节提到的,由于采用了内存数据处理技术,Apache Spark拥有卓越的交互计算性能和较高的性价比。它可以兼容Hadoop的数据源和文件格式,由于拥有友好的API,它提供多种语言版本,另外它还具有更快速的学习曲线。Apache Spark还包含图像处理和机器学习能力。基于以上原因,以Apache Spark为基础的机器学习框架在机器学习从业者中很受欢迎。
尽管如此,Hadoop MapReduce是一个更加成熟的平台,它就是为解决批处理问题应运而生。相较于Spark,它对于处理一些无法放入内存或者由于有经验的研究人员追求更好的可用性的这类大数据来说更加高效。此外,由于具有更多的支持项目、工具和云服务,Hadoop MapReduce目前拥有更加庞大的生态系统。
即使目前看来Spark像是更大的赢家,但是机器学习从业者也很可能不只使用Spark平台,他们仍会使用HDFS存储数据,也可能会使用HBase、Hive、Pig、Impala,或者其他Hadoop工具。很多情况下,这意味着机器学习从业者为了处理全部的大数据程序包,仍需要运行Hadoop和MapReduce。
1.5.6 RM4E
在前几节,我们大致讨论了机器学习框架。具体来说,一个机器学习框架包括如何处理数据,分析方法,分析计算,结果评估和结果利用,RM4E可以很好地代表满足上述需求的框架。RM4E(Research Methods Four Elements)是总结机器学习组件和过程的一个很好的框架。RM4E包括:
方程:方程用来表示我们研究的模型。
估计:估计将方程(模型)和研究用数据联系起来。
评估:评估用来衡量模型是否适合数据。
解释:解释是将方程(模型)和我们的研究目标联系起来。我们如何解释研究结果通常依赖于研究目的和研究主体。
RM4E是区别一个机器学习方法的四个关键方面。在任意给定时刻,RM4E足以代表机器学习状态。此外,使用RM4E可以简便、充分地表示机器学习的工作流。
关联我们目前讨论的内容,方程类似于机器学习库,估计代表计算完成的方式,评估是评价一个机器学习是不是更好,至于迭代计算,是我们应该考虑继续还是停止。解释也是机器学习的关键部分,因为我们的目标是将数据转换为可使用的有见地的结果。
基于以上讨论,好的机器学习框架需要处理大规模数据提取和数据预处理,还需要处理快速计算、大规模和高速的交互式评估,以及简单易懂的结果解释和部署。
1.5.7 Spark计算框架
在本章前几节,我们讨论了Spark计算如何支持迭代机器学习计算。回顾机器学习框架,以及Spark计算如何与机器学习框架相关联之后,我们已经准备好去了解更多选择Spark计算用于机器学习的原因。
Spark是为服务机器学习和数据科学而开发的,能够使得大规模的机器学习和机器学习部署更加容易。如前所述,Spark在RDD上的核心创新使其具有快速方便的计算能力和良好的容错能力。
Spark是通用计算平台,其程序包括两个部分:驱动程序和工作程序。
为了编程,开发者需要编写一个执行应用高级控制流程,以及并行启动各种操作的驱动程序。所有开发的工作程序将在集群节点或在本地线程上运行,RDD操作会贯穿所有的工作程序。
正如前面提到的,Spark提供了并行编程的两个主要抽象概念:弹性分布式数据集以及对这些数据集的并行运算(通过将一个函数应用在数据集上来调用)。
此外,Spark支持两种类型的共享变量:
广播变量:如果有大量的只读数据段(例如,查找表)被用在多个并行操作中,最好是一次性将其分配给工作程序,而不是用每个闭包来打包。
累加器:这些变量工作程序只能添加到关联操作中,并且只能由驱动程序读出。它们可以在MapReduce中用来实现计数器,并且可以为并行求和提供一个更为必要的语法。可以为具有附加操作和零值的任何类型定义累加器。由于它们的语义只能添加,它们很容易具备容错能力。
总而言之,Apache Spark计算框架能够支持各种需要快速并行处理,并带有容错机制的机器学习框架。
更多内容请见如下网址:http://people.csail.mit.edu/matei/papers/2010/hotcl-o-ud_spark.pdf。