即使照着文档一步一步来也会遇到不少坑,好吧,还是详细记录一下!
部署Spark集群
实验环境
三台虚拟机:
操作系统:Ubuntu 14.04 LTS
静态ip地址,分别是:192.168.1.10-12
使用spark 1.5.1官网预编译的版本
设置计算机名
把三台计算机名分别设置为mater、slave1、slave2. 并且修改/etc/hostname和/etc/hosts两个文件是它们相互能ping到。
配置ssh无密码登录
从master上要访问到slave1和slave2,并能控制他们的启动和停止,需要配置一下ssh无密码登录。由于暂时不需要相互访问,只需让master能访问slave1和slave2即可,需要相互访问的话,按照同样道理添加。看了别人的讲解和介绍,主要是分为以下几步:
生成master的公钥
ssh-keygen -t rsa
一路回车,不需要输入密码. 执行该操作将在/home/user/.ssh下生成id_rsa, id_rsa.pub文件,其中id_rsa.pub是公钥。
把公钥文件分发到各个slave上面
进入.ssh文件夹,使用scp命令把id_rsa.pub文件拷贝到各个slave:
scp id\_rsa.pub shenshen@192.168.1.11:~/.ssh/
scp id\_rsa.pub shenshen@192.168.1.12:~/.ssh/
这里要注意,.ssh文件夹如果不存在的话要自己创建,并且注意该文件夹的权限设置应该是700.
在各个slave上面,把刚拷贝过来的id_rsa.pub文件加入到authorized_keys文件中
authorized_keys文件默认是不存在的,使用下面的命令把刚拷贝过来的id_rsa.pub文件加入到authorized_keys文件中:
cat id\_dsa.pub >> ~/.ssh/authorized\_keys
设置文件和目录权限
设置authorized_keys权限
chmod 600 authorized\_keys
设置.ssh目录权限
chmod 700 -R .ssh
好了,这样就可以通过ssh访问不需要密码了!通过下面的命令测试:
ssh localhost
ssh slave1
ssh slave2
这里是个不好理解的地方:A将公钥发给B,不是说让B来访问A,而是A就可以访问B了。太霸道了!也就是说B不能在.ssh文件夹下的authorized_keys保留A的公钥,如保存就是把自己让给别人来访问!
启动Spark集群
在master主机上启动spark standalone集群之前还需要配置conf/slaves文件,spark提供了一个模板,首先拷贝一份出来:
cp slaves.template slaves
vim slaves
里面默认就只有一行localhost,把各个slaves的hostname加进去:
# A Spark Worker will be started on each of the machines listed below.
localhost
slave1
slave2
然后启动集群:
sbin/start-all.sh
通过浏览器访问http://192.168.1.10:8080,可以监控spark Standalone集群的情况。
<img src="./media/image1.jpeg" width="1299" height="591" />
启动不成功,错误消息是"JAVA_HOME is not set"
这是个奇怪的问题,每个虚拟机的/etc/profile中都设置了JAVA_HOME的环境变量,但启动集群时还是出错。在网上搜了一下,普遍遇到这个问题,解决方法是,要在每台虚拟机的$SPARK_HOME/conf/spark-env.sh中添加一行,重新设置变量如下:
export JAVA\_HOME=/usr/lib/jvm/jdk1.8.0\_60
参考