- Spark核心技术与高级应用
- 于俊等
- 144字
- 2023-02-02 15:30:32
第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 集群相关基础概念