Spark集群配置(1):基础配置

前言

本文是《Spark集群配置》的第一篇。主要讲解安装Spark前系统的基础配置。其他的几篇传送门:

. Spark集群配置(2):安装Hadoop
. Spark集群配置(3):安装Spark
. Spark集群配置(4):其他填坑杂项

本文要求读者有一定的Linux命令基础,最好有一个或多个比较好的机器,可以跟着一步一步安装。下面我们开始正文。

安装Linux

本文使用的Ubuntu-16.10-x64版本的Linux。
这里需要说一下版本的选择,我个人的感觉是,最好选择老一点稳定一点的版本。我之前使用过Ubuntu-16.04版本的,结果蓝屏了好几次,感觉是很不稳定。之所以选择16.10,主要是想体验下新版本,不过还好,目前还没啥问题。

需要提醒的是,安装时要选择安装英文版,主要原因是英文版的文件目录中不会出现汉字,可以为后续操作省去很多麻烦。如果英文实在不好,也要先安装为英文版,安装完成后再选择系统语言为中文版。此外在安装过程中,会要求你设置机器的名称和创建新用户。我的建议是,选定一台机器为主节点,命名为master,其他为从节点,依次命名为slave1slave2slave3等。然后所有机器创建的用户名一定要相同,比如都为spark,密码为了方便记住,也尽量设为一致的。

配置root用户密码

安装完毕后,打开终端,执行命令sudo passwd,会要求你先输入当前用户的密码,然后输入root用户的密码并重复即可。

安装Vim

Vim是Linux上使用终端修改文件的工具。一般情况下,我们对于有界面的机器可以使用记事本之内的编辑器直接编辑,但对于部分权限限制文件、系统隐藏文件和远程文件,编辑器则无能为力,一般是因为权限不够或者无法显示界面。因此需要使用Vim。想使用Linux,则最好熟练使用Vim,其道理类似于想使用互联网,则最好有个浏览器一样。
保持机器联网,在所有机器上执行执行:

1
2
3
4
5
# Ubuntu用户
$ sudo apt-get install vim
# Centos用户
sudo yum install vim

安装完成后可以通过这里学习Vim的命令《Vim配置及插件安装管理》

配置hosts

首先确保所有机器在同一局域网络中,并且能ping通。在每台机器上执行ifconfig命令,获取每台机器的IP地址。
使用终端命令sudo vim /etc/hosts打开hosts文件。hosts件是本地的DNS路由表,使用vim命令来修改。
假设各个机器的IP分别为

1
2
3
192.168.1.10 master
192.168.1.11 slave1
192.168.1.12 slave2

以修改master机器为例:保留127.0.0.1 localhost,并将hosts文件中127.0.0.1 master 修改为 192.168.1.10 master,并在文件尾添加所有剩下机器的信息比如我这里的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1 localhost
192.168.1.10 master
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.1.11 slave1
192.168.1.12 slave2

其他机器也同理修改。

配置ssh无密码登录

本部分请参考《Linux下SSH免密登录设置》
配置ssh的要求是,主节点(master)可以免密登录所有从节点(slave)即可。从节点无需访问主节点和其他从节点。

安装JDK

JDK所有机器都安装。在下载JDK时,要看清楚自己系统的位数,下载对应的版本。可以去JAVA官网下载,要求是1.7及更新版本。完成后依次执行以下命令:

1
2
3
4
5
6
7
8
# 执行解压命令
$ tar -xzvf jdk-8u111-linux-x64.tar.gz
# 移动解压目录到/usr目录,并重命名为jdk
$ mv jdk1.8.0_111 /usr/jdk
# 修改文件夹及内部文件的所属用户和所属组均为 spark
$ sudo chown -R spark:spark /usr/jdk

然后修改环境变量。环境变量的修改方法有很多种,最推荐的是修改系统环境变量/etc/profile,这样在使用各种用户身份时可以免去很多麻烦。执行命令sudo vim /etc/profile,将以下内容添加到文件结尾处并保存:

1
2
3
4
export JAVA_HOME="/usr/jdk"
export JRE_HOME="$JAVA_HOME/jre"
export CLASSPATH=".:$JAVA_HOME/lib"
export PATH="$JAVA_HOME/bin:$PATH"

执行source /etc/profile重新加载环境变量,并执行java -version即可查看JDK是否安装好。

安装Scala

同安装JDK的方法相同,去Scala官网下载合适版本,执行:

1
2
3
$ tar -xzvf scala-2.12.1.tgz
$ mv scala-2.12.1 /usr/scala
$ sudo chown -R spark:spark /usr/scala

然后添加以下内容到/etc/profile

1
2
export SCALA_HOME="/usr/scala"
export PATH="$SCALA_HOME/bin:$PATH"

执行source /etc/profile重新加载环境变量,并执行scala -version即可查看scala是否安装好。

安装Anaconda

Anaconda是一个集成的Python安装环境,是专门为科学计算和数据分析制作的。安装它的原因是,许多需要用到的科学计算库之间有着复杂的依赖关系,而且很多是不同版本的依赖,如果单纯需要使用时才安装的话,各种安装错误绝对会把人逼疯。因此强烈推荐安装。

需要注意的是,不同版本的Anaconda包含了不同版本的Python,最新版的Anaconda3-4.3.1-Linux-x86.sh对应的是最新版的Python3.6,然而最新版本的Spark尚不支持Python3.6,会导致运行错误。
因此我在这里强烈推荐使用Anaconda3-4.2.0-Linux.sh,由于安装包较大,推荐去清华大学镜像站下载。下载时要选择正确的位数(32位或者64位)。

下载完成后,执行命令开始安装程序。

1
bash ./Anaconda3-4.2.0-Linux-x86_64.sh

安装时会询问你安装在什么位置。为了方便后面的配置,请选择与之前一致的目录,即要输入安装路径为 /usr/anaconda3,然后一路回车。其中有一项是问你是否添加到环境变量,选择不添加(稍后我们手动添加)。

安装完毕后,将以下内容添加到环境变量:

1
export PATH="/usr/anaconda3/bin:$PATH"

执行source /etc/profile重新加载环境变量,并执行python -V,如果提示类似为Python 3.5.2 :: Anaconda 4.2.0 (64-bit)即为安装成功。

如果显示的是系统自带的Python版本,可以按照这篇文章《Ubuntu更改默认python版本的两种方法》修改系统默认的Python版本。需要注意的是,千万不要卸载系统自带的Python,因为很多系统工具都是依赖于系统自带的Python,一旦卸载,很可能会导致系统崩溃。

配置Jupyter Notebook远程访问

Jupyter Notebook的前身是IPython Notebook,是一个将命令行搬到浏览器中的工具。在浏览器中执行命令行的好处是可以方便复制,可以查看历史,可以保存命令记录等等,反正是好处多多。而且在配置完集群之后,如果每次要执行程序都要到集群中写代码无疑是很不方便的,而使用Jupyter可以很方便的远程上传、修改、执行文件。
Jupyter在上一步安装Anaconda时会自动被安装了。这里我们只需要配置一下Jupyter就可以了。需要注意的是,这里只用配置master机器的,从节点不需要配置。
首先进入Python命令行,执行:

1
2
3
4
5
from notebook.auth import passwd
passwd()
- Enter password:
- Verify password:
- 'sha1:ce23d945972f:34769685a7ccd3d08c84a18c63968a41f1140274'

上面的执行中会要求你输入一个密码,这是你之后远程访问Jupyter时的密码,以防止别人访问你的机器。输入密码后你会获得一个很长的字符串,这是一个加盐的 sha1加密 字符串,记录下这个字符串(单引号内部的全部内容)。然后退出Python。

在spark用户下执行jupyter notebook --generate-config,该命令是用来生成Jupyter的配置文件。
打开该文件vim /home/spark/.jupyter/jupyter_notebook_config.py,修改为以下内容:

1
2
3
4
5
6
7
8
# 允许远程访问的IP,*代表所有
c.NotebookApp.ip='*'
# 设置访问密码,即之前生成的字符串
c.NotebookApp.password = 'sha1:ce23d945972f:34769685a7ccd3d08c84a18c63968a41f1140274'
# 启动Jupyter时是否立即启动浏览器,因为我们要远程访问,因此不需要启动浏览器
c.NotebookApp.open_browser = False

修改后保存,此时终端中执行Shell命令jupyter notebook,就可以发现启动了Jupyter,其中有条提示为:

1
The Jupyter Notebook is running at http://[all ip address on your system]:8888/

换一台同局域网内的电脑打开浏览器,访问http://master:8888就可进入Jupyter登录页面了,输入你自己设置的密码即可进入。
关于如何使用Jupyter,可以参见《Jupyter Notebook各种使用方法记录》,这里不再啰嗦。

到此基础配置部分就结束了,如需继续进行,可以参见Spark集群配置(2):安装Hadoop