第2章

Spark部署和运行

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。

——《道德经》第六十四章

合抱的粗木,是从细如针毫时长起来的;九层的高台,是一筐土一筐土筑起来的;千里的行程,是一步又一步迈出来的。那么,Spark高手之路,是从Spark部署和运行开始的,只要坚持,就一定会有收获!

对于大部分想学习Spark的人而言,如何构建稳定的Spark集群是学习的重点之一,为了解决构建Spark集群的困难,本章内容从简入手,循序渐进,主要包括:部署准备工作、本地模式部署、独立模式部署、YARN模式部署,以及基于各种模式的应用程序运行。

很多优秀的集成部署工具值得推荐,如cloudera manager,但是本章重点讲解手动部署,借以加深对部署的理解。部署完毕,可以直接体验一下运行的快感,在自我陶醉的同时,细细品味过程中的细节。

2.1 部署准备

部署准备工作包括下载Spark、编译Spark和集群部署,接下来会一一阐述。

2.1.1 下载Spark

无论如何部署Spark,首先必须下载合适的版本。Spark提供源码压缩包和编译好的二进制文件压缩包。本书的内容主要以Spark 1.5.0版本为基础,熟悉SBT和Maven编译的读者,建议尝试自己编译适合的版本。

Spark下载路径:http://spark.apache.org/downloads.html。

Spark下载步骤如下:

1)选择Spark发行版本,截止到本书编写时最新版本为1.5.0;

2)选择发行包类型,可以选择Source Code[can build several Hadoop versions]、Pre-built for Hadoop 2.6 and later、Pre-built for Hadoop 2.4 and later、Pre-built for Hadoop 2.3、Pre-built for Hadoop 1.X;

3)选择下载方式,包括Direct Download、Select Apache Mirror;

4)点击选定的版本Download Spark。

图2-1所示为Spark 1.5.0版本的选择与下载过程。

图2-1 Spark选择与下载步骤图

2.1.2 编译Spark版本

Spark源码编译主要包括:使用SBT编译和使用Maven编译两种方式,编译的前置条件是配置Java环境变量。

1.配置Java环境变量

如果没有配置Java环境,需要先配置Java环境变量,从Oracle官网下载Java版本。

配置步骤如下:

第一步,安装Java程序,主要包括三种方式:

1)下载安装包进行安装;

2)通过软件源执行安装命令进行安装;

3)直接复制相同操作系统的安装文件目录(集群部署时一般采取这种模式)。

三种安装方式网上都有详细的参考资料。

第二步,配置Java环境,使用vim命令在/etc/prof ile文件中增加变量,以Ubuntu 12.04操作系统为例,命令如下:

     sudo vim /etc/profile
     export JAVA_HOME=$YOUR_JAVA_HOME#$YOUR_JAVA_HOME为实际安装路径
     export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
     export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

如果想立即生效,可以通过运行source /etc/prof ile,否则只能在下次用户重新登录加载环境变量时生效。

第三步,测试Java环境:

打开终端,输入java -version。如若有显示Java的版本信息,则表示安装成功。

注意

关于JDK的环境变量配置,一般包括四种方式:

1) 在用户环境变量文件/etc/prof ile文件中添加变量,需要具有root权限才能进行配置,对Linux下所有用户长期有效。

2) 在用户目录下的.prof ile文件中增加变量,对当前用户长期生效。

3) 直接运行export命令定义变量,只对当前shell临时有效。在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell或其子shell下是有效的,若shell关闭,变量则失效,再打开新shell时就没有这个变量,若需要使用,则还需要重新定义。

4) 在系统环境变量/etc/environment中进行配置。

2.使用SBT编译

Spark使用SBT(simple build tool,简单编译工具)进行编译,编译源码时需要花费一些时间,如果没有安装sbt,Spark构建脚本将会为你下载正确的SBT版本。下载好Spark源码之后,在源码目录(默认spark-1.5.0)执行打包命令:

    ./sbt/sbt package

如果底层存储采用HDFS,而其版本又和Spark默认的版本不一致,则需要修改Spark根目录所在的project/SparkBuild.scala文件中的HADOOP_VERSION,然后重新编译。执行重新编译命令:

    ./sbt/sbt clean compile

从源码构建Spark将花费一些时间,当编译过程停顿很长时间没有反应之后,停止,然后重新执行./sbt/sbt package打包命令。

其中,Spark的SBT文件工程结构中包含以下文件:

□ project——工程定义文件;

□ project/build/.scala——主要的工程定义文件;

□ project/build.properties——工程,SBT以及Scala版本定义;

□ src/main——应用代码目录,不同的子目录名称表示不同的编程语言(例如,src/main/scala、src/main/java);

□ src/main/resources——你想添加到Jar包里的静态文件(如日志配置文件);

□ lib_managed——工程所依赖的Jar文件存放路径,在SBT更新时添加到该目录;

□ target——最终生成的文件存放的目录(例如,生成的thrift代码、class文件、Jar文件)。

3.使用Maven编译

Maven是一个采用纯Java编写的开源项目管理工具。Maven采用POM(Project Object Model,项目对象模型)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM. xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编译、构建、测试、发布、报告等。目前Apache下绝大多数项目都已经采用Maven进行管理,Maven本身还支持多种插件,可以更加方便灵活地控制项目。

使用Maven编译流程如下:

1)Maven下载:http://maven.apache.org/;

2)Maven配置:export M2_HOME=$your_path; export PATH=$M2_HOME/bin:$PATH;

3)Maven编译Spark。

在任意目录下以命令行的形式设置Maven参数。其中,-Xmx为Java虚拟机堆内存最大允许值,-XX:MaxPermSize为最大允许的非堆内存大小,-XX:ReservedCodeCacheSize为缓存大小。

在Spark源码目录(默认spark-1.5.0)下,编译参数hadoop.version可根据具体版本修改,编译Nexus依赖可以通过pom.xml文件修改,编译Spark运行环境命令如下:

          export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M
          -XX:ReservedCodeCacheSize=512m"
          mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -DskipTests clean package

2.1.3 集群部署概述

在进行Spark编程之前,我们要进行Spark集群部署,目前与Spark相关的集群环境,也就是集群管理器(cluster manager),主要包括:Spark自带的Standalone资源管理器、Mesos集群管理器和Hadoop YARN资源管理器。

表2-1总结了集群部署和运行过程中,可能会使用到的集群相关基础概念,可以对集群部署和运行有个更深刻的理解。

表2-1 集群相关基础概念