Spark大数据处理与分析
上QQ阅读APP看书,第一时间看更新

第2章 理解Spark

从较高级别看,每个Spark应用程序都包含一个驱动程序,该程序运行用户的主要功能并在集群上执行各种并行操作。Spark运行框架包括了一些重要的概念,用来实现独特的数据处理机制。Spark首先提供的抽象概念是弹性分布式数据集(Resilient Distributed Dataset,RDD),是跨集群节点划分的元素集合,可以并行操作。通过读取存在于Hadoop文件系统(或任何其他Hadoop支持的文件系统)的文件或驱动程序中现有的Scala集合,Spark将其进行转换来创建RDD。用户还可以要求Spark将RDD持久存储在内存中,从而使其可以在并行操作中高效地重用。Spark中的第二个抽象概念是可以在并行操作中使用的共享变量。默认情况下,当Spark作为一组任务在不同节点上并行运行一个函数时,它会将函数中使用的每个变量的副本传送给每个任务。有时,需要在任务之间或任务与驱动程序之间共享变量。Spark支持两种类型的共享变量:广播变量可用于在所有节点上的内存中缓存值;累加器是仅做加法的变量,可以用作计数和求和。这里提到的共享变量概念会在后面的章节中介绍。

另外,Spark基于弹性分布式数据集支持两种类型的操作:一种类型为转换(Transformation),可以通过改变现有数据集的结构创建新的数据集;另一种类型为动作(Action),可以在数据集上进行计算,然后返回结果到驱动程序。例如,Spark的函数库中,map(func)就是一个转换操作,将每个数据集元素传递给一个函数func并且返回一个新的数据集。另一方面,reduce(func)是一个动作,使用函数func对数据集上的所有元素进行聚合计算,并且将最终的结果返回到驱动程序。

在Spark中,所有转换都是延迟处理的,也就是说转换操作不会马上在数据集上运行,转换只是定义了需要执行操作的步骤,并且Spark可对这些步骤进行优化。只有当执行动作操作需要将结果返回给驱动程序的时候,这些记录的转换过程才会被Spark实际执行。这个设计能够让Spark运行得更加高效,可以实现通过转换创建新数据集,并且仅需要将计算结果传递到驱动程序时才会执行相应的动作,尤其对于基于大数据的分析操作,应该避免将全部数据集返回到驱动程序,可以减少出现硬件系统的内存和网络问题,一般地,需要将非常大的数据集聚合后进行传递。

默认情况下,每个转换过的数据集都会在每次执行动作的时候重新计算一次,然而,也可以使用persist()或cache()方法持久化一个数据集到内存中。在这种情况下,Spark会在集群上保存数据集的相关元素,下次查询时直接在内存中调用会变得更快。考虑到内存的容量有限,也可以将同样的数据集持久化到Hadoop的集群中,这种解决方式可以实现多个节点间的数据复制。