搭建spark on yarn集群全过程

机器配置

在VMware上创建4个虚拟机来搭建集群。其中一个master,三个salve。
每台虚拟机配置1G内存,1核CPU,20G的硬盘。
统一安装Linux系统,ubuntu 14.04.1 server 64位的发布版本。

网络配置

所有的虚拟机都在同一个NAT虚拟网络中,ip地址由VMware的DHCP服务器分发。
网段为192.168.100.0/24。

设置静态IP

由于DHCP分发的IP地址可能会变化,为了使每台虚拟机有固定的IP地址,需要设置静态IP地址。

静态IP地址在/etc/network/interfaces中如下设置:

1
2
3
4
5
auto eth0
iface eth0 inet static
address 192.168.100.150/24
gateway 192.168.100.2
dns-nameservers 192.168.100.2

以上设置了静态IP地址192.168.100.150,并设置了网关和DNS为192.168.100.2

在每台机器上都做如此设置,这样每台机器就都有固定的IP地址了。

修改hosts文件

为了在以后的配置文件中不用写IP地址,给每台机器起一个主机名,并与其IP地址对应起来,写入hosts文件中:

1
2
3
4
5
6
127.0.0.1       localhost

192.168.100.150 master
192.168.100.151 slave1
192.168.100.152 slave2
192.168.100.153 slave3

该hosts文件需要拷贝到每一台机器上。

搭建yarn平台

安装jdk7

虽然现在jdk7官方已经停止更新了,但是经过试验,jdk8在使用时还是会遇到各种问题,所以建议还是先用jdk7吧。

下载jdk7并解压到/opt/jdk1.7.0_80,环境变量到目前为止还不需要配置。

安装配置hadoop2.6.0

去官方下载hadoop2.6.0编译好的版本,或者自己编译也可以,这里我直接下载了编译好的版本,解压到/opt/hadoop-2.6.0。

配置稍微复杂一点,需要以下的配置:

1. hadoop-env.sh配置JAVA路径

1
export JAVA_HOME=/opt/jdk1.7.0_80

2. core-site.xml设置核心参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<configuration>
<!-- hdfs -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>

<!-- buffer size -->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>

<!-- tmp dir -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/hadoop/tmp</value>
</property>
</configuration>

可以看到我们配置的hdfs运行在master主机上的9000端口(这里指的是namenode)。所以我们的hdfs的访问地址就是hdfs://master:9000

3. hdfs-site.xml设置hdfs的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<configuration>

<!-- hdfs namenode local location -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/hadoop/hdfs/name</value>
</property>

<!-- hdfs datanode local location (on each data node) -->
<property>
<name>dfs.namenode.data.dir</name>
<value>file:/opt/hadoop/hdfs/data</value>
</property>

<!-- duplication count -->
<property>
<name>dfs.replication</name>
<value>3</value> <!-- we have three slaves -->
</property>

<!-- namenode http address -->
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
</property>

<!-- secondary namenode (will read file secondarynamenode)-->
<property>
<name>dfs.secondary.http.address</name>
<value>slave1:50070</value>
</property>

</configuration>

4. yarn-site.xml设置yarn的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- ResourceManager port -->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>

以上配置了yarn的ResourceManager运行在master节点上。由于我们是想要在yarn上运行spark,而不需要运行MapReduce,所以不许需要配置与MapReduce相关的东西了。

5. slaves文件配置工作节点

1
2
3
slave1
slave2
slave3

由于在hosts中设置了这些主机名,所以在这里就可以不用写IP地址直接写主机名了。

运行hdfs

将jdk和hadoop2.6按以上设置安装好,并拷贝到每台虚拟机的相同位置中。

第一次运行hdfs时,需要格式化namenode,用如下命令:

1
bin/hdfs namenode -format

然后运行hadoop2.6.0/sbin目录下的start-dfs.sh文件:

1
2
3
4
5
6
7
8
spark@master:~$ sbin/start-dfs.sh
Starting namenodes on [master]
master: starting namenode, logging to /opt/hadoop-2.6.0/logs/hadoop-spark-namenode-master.out
slave3: starting datanode, logging to /opt/hadoop-2.6.0/logs/hadoop-spark-datanode-slave3.out
slave2: starting datanode, logging to /opt/hadoop-2.6.0/logs/hadoop-spark-datanode-slave2.out
slave1: starting datanode, logging to /opt/hadoop-2.6.0/logs/hadoop-spark-datanode-slave1.out
Starting secondary namenodes [slave1]
slave1: starting secondarynamenode, logging to /opt/hadoop-2.6.0/logs/hadoop-spark-secondarynamenode-slave1.out

此时在master、slave1、slave2上执行jps输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
spark@master:~$ jps
3233 Jps
3003 NameNode

spark@slave1:~$ jps
1854 DataNode
1952 SecondaryNameNode
2031 Jps

spark@slave2:~$ jps
1794 DataNode
1894 Jps

这时可以访问 http://master:50070 查看namenode的情况,访问 http://slave1:50070 查看secondarynamenode的情况。

运行yarn

将jdk和hadoop2.6按以上设置安装好,并拷贝到每台虚拟机的相同位置中。

在master上运行hadoop2.6.0/sbin目录下的strat-yarn.sh文件:

1
2
3
4
5
6
spark@master:~$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/hadoop-2.6.0/logs/yarn-spark-resourcemanager-master.out
slave2: starting nodemanager, logging to /opt/hadoop-2.6.0/logs/yarn-spark-nodemanager-slave2.out
slave1: starting nodemanager, logging to /opt/hadoop-2.6.0/logs/yarn-spark-nodemanager-slave1.out
slave3: starting nodemanager, logging to /opt/hadoop-2.6.0/logs/yarn-spark-nodemanager-slave3.out

此时在master、slave1、slave2上执行jps输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spark@master:~$ jps
3003 NameNode
3277 ResourceManager
3533 Jps

spark@slave1:~$ jps
2080 NodeManager
1854 DataNode
1952 SecondaryNameNode
2222 Jps

spark@slave2:~$ jps
1951 NodeManager
1794 DataNode
2077 Jps

这时可以访问 http://master:8088 来查看yarn集群的的情况。

到目前为止,yarn集群已经搭建成功,并成功运行。下面用spark来做一下测试。

安装spark

到spark官网上去下载为hadoop2.6版本编译好的spark可执行版本,或者也可以自己编译。

我在这里直接用了下载的版本,下载解压到spark@master:/opt/spark-1.4.1-bin-hadoop2.6

spark只需要安装到master节点上就可以了。

这样spark就安装好了。现在要运行spark,需要先配置一些环境变量,把下面这些写入.bashrc中(有些可能不是必须的 ):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# set up java env
export JAVA_HOME=/opt/jdk1.7.0_80
export PATH=$PATH:$JAVA_HOME/bin

# set hadoop
export HADOOP_HOME=/opt/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

# set up spark env
export SPARK_HOME=/opt/spark-1.4.1-bin-hadoop2.6
export PATH=$PATH:$SPARK_HOME/bin

# hadoop conf dir
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

现在可以运行一个spark程序了:

1
spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster --num-executors 3 --driver-memory 4g --executor-memory 2g --executor-cores 1 $SPARK_HOME/lib/spark-examples*.jar 10

运行结束之后,在 http://master:8088 中对应的application的logs中可以看到输出:

1
Pi is roughly 3.145108

至此,基本的安装配置都已经完成了。如果后续需要对进行hdfs和yarn的优化,可以在修改配置文件后,重新复制配置文件到每台机器上,然后重新启动hdfs和yarn就可以了。