一、概述
对于想学习 spark 集群搭建及应用的人来说,专门买多台物理主机往往成本太高,其实我们只需要利用虚拟机(我用的是 VMWare)搭建多台虚拟主机即可。在学习过程中,在网上搜了各种资料,参考了很多优秀的博客,发现在虚拟机上搭建 spark 集群主要有两种方法。第一种是充分利用 VMWare 的虚拟机克隆功能,只需要配置好一台主机,直接克隆生成
其他主机
并修改少量配置即可。第二种与在实际物理主机上部署类似,该方法可以直接应用到实际部署中。首先创建多台新的虚拟机,然后在每台主机上分别进行配置。当然,该方法也不是每一台机器都重新配置,下面将会具体讲到,对于 hadoop 和 spark 安装文件,只需要在一台机器上配置好然后复制到其他主机即可。为了让这篇文章更具通用性,我们以介绍第二种搭建方法为主线,毕竟实际的集群是布置在物理主机上的。对于想在虚拟机上快速搭建 spark 集群的读者,我们也会在叙述过程中提到克隆虚拟机后需要修改的地方。另外,由于 spark 需要用到 hadoop 的文件管理系统 HDFS 和任务调度系统 YARN,所以在搭建 spark 之前需要先搭建好 hadoop。
下面的叙述将会以西面的思路展开。在介绍集群搭建之前,分别介绍 hadoop 和 spark 单机搭建方法,因为上面提到的两种方法的单机搭建与配置方法是相同的。介绍完单机搭建及配置方法,我们将会介绍如何将单机的配置应用到集群里面。
下面是本文用到的各个软件的版本:
虚拟机:VMWare
操作系统:Ubuntu-14.04.1-desktop-amd64
Hadoop 版本:hadoop-2.7.2
Spark 版本:spark-1.6.1-bin-without-hadoop
为了避免权限问题,建议下面下载的所有文件都放在 home 目录下,比如 ~/spark。这里就是在 home 目录下新建一个 spark 目录,下面的所有文件都放在里面。实际上下面提到的所有软件都不需要安装,直接在官网上下载安装包并解压就行了。
二、单机 hadoop 搭建
1、准备工作
在正式搭建 hadoop 之前,需要对系统及环境进行一些配置,主要有以下几点,命令详细解释参考[1]:
(1)创建 hadoop 用户。一般情况下,我们安装 Ubuntu 时都不会直接用 hadoop 作为用户名。为了方便后面搭建集群,我们需要重新创建一个叫做 hadoop 的用户。另外,在 Ubuntu 终端黏贴命令需要用 ctrl+shift+v。完成以下命令后,注销当前用户,进入 hadoop 用户后再进行之后的操作。
命令:
sudo useradd -m hadoop -s /bin/bash //添加 hadoop 用户
sudo passwd hadoop //修改 hadoop 用户密码,一般也用 hadoop 就行了
sudo adduser hadoop sudo //为 hadoop 用户增加管理员权限,防止之后产生权限问题
(2)更新 apt。这一步不是必须的,做这一步的目的是更新所有的依赖软件,以防后面某些软件安装不成功。如果所有主机 Ubuntu 的软件都是最新的,就不需要这一步了。
命令:
sudo apt-get update
(3)安装 Java 环境。由于 hadoop 依赖于 Java 运行环境,所以在安装 hadoop 之前,需要先安装 Java 环境 JDK。在官网下载最新版 Java,并解压到 ~/spark 目录,解压后的 Java 文件夹可以直接更名为 java。
命令:
sudo tar -zxvf download.gz //download 就是你下载的 Java 安装包名字,tar 是解压命令
sudo mv ./download ./java //将原来的文件夹名字修改为 java
sudo gedit /etc/profile //修改环境变量,需要修改的东西比较多,可以参考[5]
2、安装 hadoop
Hadoop 的安装非常简单,只需要在网上下载相应的编译好的 hadoop 包,解压到 ~/spark 文件夹就大功告成了。当然,如果有时间可以试一试下载源码自己编译,方法参考[3]。
命令:
sudo tar -zxvf download.gz //download 就是你下载的 hadoop 安装包名字,tar 是解压命令
sudo mv ./download ./hadoop //将原来的文件夹名字修改为 hadoop
我们发现,打开 hadoop 文件夹以后,里面有很多子文件夹,下面介绍几个重要的文件夹及其作用,因为之后的 hadoop 配置和运行都需要用到。
(1)./etc/hadoop:这个文件夹主要存放 hadoop 的配置文件。hadoop 的运行模式都是通过改变这些配置文件来实现的。Hadoop 配置文件一般以 .xml 为后缀,每一条配置都是以声明 property 的 name 和 value 来实现的。具体的配置方法需要参考 hadoop 官方手册。
(2)./bin:这个文件夹主要存放一些可执行文件。是 hadoop 功能实现的主要载体,可以看成是一个一个小的应用程序。
(3)./sbin:这个文件夹主要存放一些批处理文件。主要用于实现一些相对复杂的任务,比如开启和关闭 namenode 和 datanode 守护程序,开启和关闭 yarn 等。
3、配置 hadoop
用以下命令进入 hadoop 配置文件夹。
命令:
sudo cd ~/spark/hadoop/etc/hadoop //进入 hadoop 配置文件夹
Hadoop 的配置主要有以下几个步骤(具体配置参数参考[5]):
(1)在hadoop-env.sh中配置JAVA_HOME
(2)在yarn-env.sh中配置JAVA_HOME
(3)在slaves中配置slave节点的ip或者host
(4)修改core-site.xml
(5)修改hdfs-site.xml
(6)修改mapred-site.xml
(7)修改yarn-site.xml
(8)格式化 namenode
三、单机 spark 搭建
1、准备工作
(1)安装好 hadoop。这一步上面已经做好了。
(2)安装 Scala。Scala 是 spark 的主要编程语言,所以在搭建安装 spark 之前需要安装该语言环境。在官网下载最新 Scala 安装包然后解压。
命令:
sudo tar -zxvf download.tgz
sudo mv ./download ./scala //将原来的文件夹名字修改为 scala
sudo gedit /etc/profile //修改环境变量,需要修改的东西比较多,可以参考[5]
2、安装 spark
跟 hadoop 一样,spark 的安装也非常简单,
也是在网上下载相应的编译好的 spark 包,解压到 ~/spark 就行了。
命令:
sudo tar -zxvf download.gz
sudo mv ./download ./spark //将原来的文件夹名字修改为 spark
3、配置 spark
用以下命令进入 spark 配置文件夹。
命令:
sudo cd ~/spark/spark/conf //进入 spark 配置文件夹
spark 配置文件放在 ~/spark/spark/conf 这个文件夹中,这里我们只需要配置两个文件就可以了(具体配置参数参考[5])。
(1)配置 spark-env.sh 文件
(2)
在 slaves 中配置 slave 节点的 ip 或者 host
到此为止,单机 spark 就安装并配置完成了,接下来将会介绍集群搭建方法。
四、集群搭建
如果想在虚拟机上快速搭建 spark 集群,先跳到本章的第三步,也就是建立 ssh 无密码登陆环境,设置好一台机器的 ssh 环境后直接克隆其他虚拟机即可。如果想按第二种方法搭建集群,只需要按步骤设置即可。
1、修改机器名。克隆完虚拟机也需要对克隆后的每一台虚拟机进行这一步操作,否则所以主机的机器名都是一样的。
命令:
sudo gedit /etc/hostname //对每一台电脑用 gedit 打开主机名文件,修改成不同的机器名,一般集群主机取名 master,从机取名 slave1,slave2 ... 修改完机器名必须重启!!!否则执行其他命令时会报错。
2、设置 host 映射。克隆完虚拟机也需要对克隆后的每一台虚拟机进行这一步操作。
命令:
sudo gedit /etc/hosts //打开 hosts 文件
Host 文件本质上是一个 IP 地址与机器名对应关系的文件,跟 windows 的 host 文件差不多,其格式一般如下所示:
192.168.86.128 master
192.168.86.132 slave1
192.168.86.133 slave1
前面是每台机器的 IP 地址,后面是机器名。在 Linux 下查看本机 IP 地址一般用 ifconfig 命令。需要注意的是,有些博客说虚拟机需要设置桥接连接方式,但经过我的测试,用 NAT 模式也是可以的,这样就可以免去使用路由器的麻烦。所以为了方便部署,建议采用 NAT 模式。
3、建立 ssh 无密码登陆环境
安装 ssh,并配置 SSH 为无密码登录。SSH 是一个远程登录功能,比传统的 Telnet 安全。为了之后搭建的集群相互访问时不需要反复输密码,我们需要配置 SSH 为无密码登录。第一种搭建方法和第二种搭建方法有点不太一样,下面分别介绍。
对于第一种搭建方法,在克隆前的主机执行下面命令即可。
命令:
sudo apt-get install openssh-server //安装 SSH server
cd ~/.ssh/ //打开 .ssh 文件
ssh-keygen -t rsa //生成秘钥,一路回车
cat ./id_rsa.pub >> ./authorized_keys //将秘钥加入授权
对于第二种搭建方法,稍微复杂一点。其基本步骤跟第一种方法差不多,只不过需要多重复几次。每一台主机都需要先安装 ssh server,然后各自生成自己的秘钥,所有 slave 把自己的秘钥全部传给 master,master 把所有秘钥都加入授权文件 authorized_keys,最后把授权文件 authorized_keys 分发给所有 slave。具体可以参考[5]。
4、把 master 上配置好的 hadoop 和 spark 分发到各个 slave 节点。注意,如果是使用克隆虚拟机的方法,可以直接忽略这一步。
命令:
scp -r ~/spark/hadoop hadoop@slave1:~/spark/ //这个命令都是在 master 上执行的,把 master 上配置好的 spark 安装文件分发给每一个 slave, hadoop@slave1 代表 slave1 上的 hadoop 用户。事实上,这种方法是通过网络的方式传输文件。如果在实际部署中,所有机器都在一个地方,那么用 U 盘拷贝可能速度会快一些。如果在 VMWare 上实现那就更容易了,从一台机器复制粘贴到另一台机器就行了,前提是安装了 VMTools。
scp -r ~/spark/spark hadoop@slave1:~/spark/ //功能同上。
5、验证安装是否成功
命令:
~/spark/hadoop/sbin/start-dfs.sh //启动 hadoop 文件管理系统 HDFS
~/spark/hadoop/sbin/start-yarn.sh //启动 hadoop 任务管理器 YARN
~/spark/spark/sbin/start-all.sh //启动 spark
以上命令都是在 master 上执行的,在每一台机器上通过下面命令查看启动的进程
jps //查看进程
如果集群安装成功,在 master 上将会有下面几个进程:
7949 Jps
7328 SecondaryNameNode
7805 Master
7137 NameNode
7475 ResourceManager
在 slave 上将会有下面几个进程:
3132 DataNode
3759 Worker
3858 Jps
3231 NodeManager
注意,如果集群设置成功,master 能直接启动 slave 上的进程,不需要在 slave 上进行任何操作了
5、启动集群
Sparkshell 是 spark 自带的编译环境。如果集群安装成功,以后每次想要启动 spark 编译环境 sparkshell 时,只需要依次输入以下命令。
~/spark/hadoop/sbin/start-dfs.sh //启动 hadoop 文件管理系统 HDFS
~/spark/hadoop/sbin/start-yarn.sh //启动 hadoop 任务管理器 YARN
~/spark/spark/sbin/start-all.sh //启动 spark
~/spark/spark/bin/spark-shell //启动 sparkshell
启动完会有类似于下列的界面出现,接下来就可以进行 scala 编程了。关于 scala 编程方法将会在后续的博客中进行介绍。
Reference
[1] Hadoop 安装教程_单机/伪分布式配置:
http://www.powerxing.com/install-hadoop/
(这篇博客的介绍非常详细,包括每一步的作用以及一些 Linux 的概念都解释得非常清楚)
[2] Spark快速入门指南 – Spark安装与基础使用:
http://www.powerxing.com/spark-quick-start-guide/
[3] 倾情大奉送--Spark入门实战系列:
http://blog.csdn.net/yirenboy/article/details/47291765
(这篇博客用的是 CentOS 操作系统,有些操作跟 Ubuntu 不一样,仅供参考)
[4] Ubuntu 12.04下Hadoop 2.2.0 集群搭建:
http://www.cnblogs.com/tec-vegetables/p/3778358.html
[5] Spark On YARN 集群安装部署:
http://wuchong.me/blog/2015/04/04/spark-on-yarn-cluster-deploy/
(这篇博客对 Ubuntu 上安装 spark 集群的方法讲解的也比较详细,可以和本文参考着一起看)