在集群上运行Spark
之前的所有实例中Spark都是运行在本地模式下,实际项目中应该要运行到集群中。本地模式下的代码完全可以运行在集群中,因此在测试开发阶段变得非常方便。
本部分会先简单介绍Spark的运行时架构,并讨论集群运行时的一般步骤,具体的使用实例会在今后的实战中详细说明。
1. Spark的运行时架构
在分布式环境下,Spark集群采用的是主 / 从结构。
在一个Spark集群中,有一个节点负责中央协调,调度各个分布式工作节点。这个中央协调节点被称为驱动器(Driver)节点。与之对应的工作节点被称为执行器(executor)节点。
Spark应用通过一个叫作集群管理器(Cluster Manager)的外部服务在集群中的机器上启 动。Spark自带的集群管理器被称为独立集群管理器。Spark也能运行在Hadoop YARN和Apache Mesos这两大开源集群管理器上。
驱动器节点
Spark 驱动器是执行你的程序中的main()方法的进程。在本地模式中,Spark-shell就自动启动了一个驱动器程序。
驱动器程序主要完成两个任务:把用户程序转为任务,为执行器节点调度任务。
驱动器程序会将一些 Spark 应用的运行时的信息通过网页界面呈现出来,默认在端口4040上。比如,在本地模式下,访问http://localhost:4040就可以看到这个网页了。
执行器节点
Spark应用启动时,执行器节点就被同时启动。如果有执行器节点发生了异常或崩溃,Spark应用也可以继续执行。
执行器进 程有两大作用:第一,它们负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程; 第二,它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
集群管理器
Spark依赖于集群管理器来启动执行器节点,而在某些特殊情况下,也依赖集群管理器来启动驱动器节点。
2. 集群上运行Spark的一般步骤
(1) 用户通过 spark-submit 脚本提交应用。
(2) spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法。
(3) 驱动器程序与集群管理器通信,申请资源以启动执行器节点。
(4) 集群管理器为驱动器程序启动执行器节点。
(5) 驱动器进程执行用户应用中的操作。根据程序中所定义的对 RDD 的转化操作和行动操 作,驱动器节点把工作以任务的形式发送到执行器进程。
(6) 任务在执行器程序中进行计算并保存结果。
(7) 如果驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。
3. 其余未详细介绍内容
(九)Spark调优与调试
这部分涉及到一些调优,监控Spark集群的方式。
(十)Spark SQL
这部分是用SQL语句来操作结构化或半结构化的数据,是从零开始学习Spark(六)数据读取与保存中的部分内容的扩展。
(十一)Spark Streaming
有时数据是以数据流形式实时到达的,这个时候就要使用Spark Streaming来处理这种形式的数据
(十二)基于MLlib的机器学习
这部分介绍了非常有用的MLlib库,它提供了一些非常适合机器学习的数据结构,以及RDD操作,让机器学习变得非常方便。