此篇博文记录一个小白如何用虚拟机搭建一个集群的血泪史,用来体验Spark的分布式计算。
在搭建之前,先理清一些概念。
此篇讲述的是第2种。
而第2种集群方式,是建立在第1种之上的。也就是说,搭建了第2钟,就可以同时使用第1、2种了。
首先,就只建立一台虚拟机出来。待配置好基本通用的配置信息后,我们再克隆出两台来,这样会方便许多。
我的系统采用的是Ubuntu14,虚拟机网络适配器选择桥接模式,手动配置IP,关闭防火墙。另外,系统用户名就叫hadoop。
先去各自官网下载软件。
以下我都以~/software 为工作目录为例。
将下载的安装包解压到一个自己指定的目录。
tar -zxvf jdk-8u101-linux-x64.tar.gz -C ~/software
然后修改环境变量文件 sudo vi /etc/profile
,在末尾添加:
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_101
export JRE_HOME=/home/hadoop/software/jdk1.8.0_101/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
保存关闭后,source /etc/profile
,使修改生效。
然后可以验证JAVA是否生效,java -version
。
像以上那样就是对的。如果结果是OpenJDK什么的,就要自己google下怎么替换JAVA成我们自己安装的这种。
过程跟JAVA差不多。
就是修改profile有点区别:
export SCALA_HOME=/home/hadoop/software/scala-2.11.8
export PATH=$PATH:$SCALA_HOME/bin
然后还是保存关闭后source一下,让它生效。
最后scala -version
,看看版本。
sudo vi /etc/hostname
,将里面的主机名字改为master。sudo vi /etc/hosts
10.1.1.100 master
10.1.1.101 slave1
10.1.1.102 slave2
这里要注意问题是,hosts文件里正常会存在一个localhost 及其 对应的IP地址,千万不要删除它,直接把以上三行信息给加到后边就行了,删除了localhost,Spark会找不到入口!
sudo apt-get install openssh-server
ping slave1
,ping slave2
1 . 首先继续配置每台主机的SSH环境。刚才我们仅仅相当于在每台主机上安装了SSH,下面要配置成免密码登录模式,以免以后集群运算时,频繁提示输入密码。
在每台主机上都生成私钥和公钥。ssh-keygen -t rsa
,一直按回车就行。
然后将slave1与slave2上的id_rsa.pub用scp命令发送给master,
scp ~/.ssh/id_rsa.pub hadoop@master:~/.ssh/id_rsa.pub.slave1
scp ~/.ssh/id_rsa.pub hadoop@master:~/.ssh/id_rsa.pub.slave2
在master上,将所有公钥加到用于认证的公钥文件authorized_keys中,
cat ~/.ssh/id_rsa.pub* >> ~/.ssh/authorized_keys
将公钥文件authorized_keys分发给每台slave,
scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh/
scp ~/.ssh/authorized_keys hadoop@slave2:~/.ssh/
最后在每台主机上,用SSH命令,检验下是否能免密码登录。SSH master
,SSH slave1
,SSH slave2
2 . 在以上测试均成功地情况下,我们可以安装Spark、Hadoop了。这里采用的基本思想也是只在master上配置,待配置成功后,再用SSH将其分发到各个节点上,就能正常启动了。
1 . 解压已经下载的hadoop到~/software/
目录。
2 . 进入hadoop配置目录,~/software/hadoop-2.7.3/etc/hadoop
,在此目录中,我们需要配置几个文件。
# The java implementation to use.
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_101
# some Java parameters
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_101
slave1
slave2
< configuration>
< property>
< name>fs.defaultFSname>
< value>hdfs://master:9000/value>
< /property>
< property>
< name>hadoop.tmp.dirname>
< value>file:/home/hadoop/software/hadoop-2.7.3/tmpvalue>
< /property>
< /configuration>
< configuration>
< property>
< name>dfs.namenode.secondary.http-addressname>
< value>master:9001value>
< /property>
< property>
< name>dfs.namenode.name.dirname>
< value>file:/home/hadoop/software/hadoop-2.7.3/dfs/namevalue>
< /property>
< property>
< name>dfs.datanode.data.dirname>
< value>file:/home/hadoop/software/hadoop-2.7.3/dfs/datavalue>
< /property>
< property>
< name>dfs.replicationname>
< value>3value>
< /property>
< /configuration>
< configuration>
< property>
< name>mapreduce.framework.namename>
< value>yarnvalue>
< /property>
< /configuration>
< configuration>
< property>
< name>yarn.nodemanager.aux-servicesname>
< value>mapreduce_shufflevalue>
< /property>
< property>
< name>yarn.nodemanager.aux-services.mapreduce.shuffle.classname>
< value>org.apache.hadoop.mapred.ShuffleHandlervalue>
< /property>
< property>
< name>yarn.resourcemanager.addressname>
< value>master:8032value>
< /property>
< property>
< name>yarn.resourcemanager.scheduler.addressname>
< value>master:8030value>
< /property>
< property>
< name>yarn.resourcemanager.resource-tracker.addressname>
< value>master:8035value>
< /property>
< property>
< name>yarn.resourcemanager.admin.addressname>
< value>master:8033value>
< /property>
< property>
< name>yarn.resourcemanager.webapp.addressname>
< value>master:8088value>
< /property>
< /configuration>
3 . 最后就可以将配置好的hadoop-2.7.3文件夹分发给所有slave了。
scp -r ~/software/hadoop-2.7.3 hadoop@slave1:~/software/
scp -r ~/software/hadoop-2.7.3 hadoop@slave2:~/software/
4 . 启动hadoop。cd到hadoop主目录。然后先格式化namenode,然后再启动。
bin/hadoop namenode -format
sbin/start-all.sh
5 . 用jps命令查看hadoop进程。
在master上应该有:
3407 SecondaryNameNode
3218 NameNode
3552 ResourceManager
3910 Jps
在slave1与slave2上应该有:
2072 NodeManager
2213 Jps
1962 DataNode
并且,在master节点,浏览器输入 master:8088 能够访问hadoop管理界面,并看到slaves的存在。
1 . 解压已经下载的Spark到到~/software/
目录。
2 . 进入到Spark配置目录,~/software/spark-2.0.0-bin-hadoop2.7/conf
,在此目录下,可以看到很多配置文件。但是很多文件都是以template结尾的,这是因为spark给我们提供的模板配置文件,我们可以拷贝一份,然后将.template
给去掉,变成真正的配置文件后再编辑。
export SCALA_HOME=/home/hadoop/software/scala-2.11.8
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_101
export HADOOP_HOME=/home/hadoop/software/hadoop-2.7.3
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_MASTER_IP=master
SPARK_LOCAL_DIRS=/home/hadoop/software/spark-2.0.0-bin-hadoop2.7
SPARK_DRIVER_MEMORY=512M
slave1
slave2
3 . 最后就可以将配置好的spark-2.0.0-bin-hadoop2.7文件夹分发给所有slave了。
scp -r ~/software/spark-2.0.0-bin-hadoop2.7 hadoop@slave1:~/software/
scp -r ~/software/spark-2.0.0-bin-hadoop2.7 hadoop@slave2:~/software/
4 . 启动Spark,cd到spark主目录,然后sbin/start-all.sh
。
5 . 如果启动成功,那么用jps命令可以看到:
在master节点上有7805 Master
进程,
在slaves有3759 Worker
进程。
同样的,在master节点,浏览器输入 master:8080 能够访问spark管理界面,并看到slaves的存在。
spark使用spark-submit 进行提交程序,这个文件接收各种参数。
例如,我们要提交一个任务,并且让YARN来调度资源,那么我们可以用以下命令:
./bin/spark-submit --master yarn pi.py
如果在没有安装YARN的集群上,可以使用spark自带的集群管理器,可以用以下命令:
./bin/spark-submit --master spark://master:7077 pi.py