前言

前面我们已经搭建了 本地模式伪分布式模式

接着上节我们开始搭建一个完全分布式模式.

再开始搭建之前我们要考虑有几台服务器,每天服务器怎么编排。

准备

将之前编译hadoop的虚拟机进行克隆(Ubuntu16.04)克隆出三台,分别为 master1slave1slave2

PS 最好是在配置完 Hadoop 之后再复制,然后再设置 hostname 修改静态 ip、最后配置免密登录。

HostNameIPNNDNRMNMSNN
master1192.168.8.101
slave1192.168.8.201
slave2192.168.8.202
  • NNNameNode
  • DNDataNode
  • RMResourceManager
  • NMNodeManager
  • SNNSecondaryNameNode

配置静态 IP

分别在三台机器配置静态 IP 地址

1
sudo vim /etc/network/interfaces

配置 master1IP

1
2
3
4
5
6
auto ens33
iface ens33 inet static
address 192.168.8.101
netmask 255.255.255.0
gateway 192.168.8.1
dns-nameserver 114.114.114.114

配置 slave1IP

1
2
3
4
5
6
auto ens33
iface ens33 inet static
address 192.168.8.201
netmask 255.255.255.0
gateway 192.168.8.1
dns-nameserver 114.114.114.114

配置 slave2IP

1
2
3
4
5
6
auto ens33
iface ens33 inet static
address 192.168.8.202
netmask 255.255.255.0
gateway 192.168.8.1
dns-nameserver 114.114.114.114

重启 network 服务

1
sudo /etc/init.d/networking restart

配置 Host

配置三台主机,主机名到 ip 的映射,首先修改三台虚拟机的 hostname 分别为 master1slave1slave2

1
sudo vim /etc/hostname

分别为三台虚拟机添加 host 配置

1
sudo vim /etc/hosts

在文件尾部添加

1
2
3
192.168.8.101 master1
192.168.8.201 slave1
192.168.8.202 slave2

然后重启三台主机。

免密登录

首先分别为三天虚拟机生成 ssh key

1
ssh-keygen -t rsa

生成密钥成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
SHA256:t4L2a8imf3c3osZdQ2sGQD1HkaskNomfAdwbgoHNF9o bennie@master1
The key's randomart image is:
+---[RSA 2048]----+
| +.+.+.. .oo |
| . +o= + o o |
| ..E+ = o . |
| . B o o |
| So.* + . |
| . .o.. * |
| .o..... + . |
| .+.o.+ + o |
| .+.oo+.o o . |
+----[SHA256]-----+

分别在三台虚拟机复制公钥到另外两天虚拟机

命令为 ssh-copy-id 主机名

1
2
ssh-copy-id slave1
ssh-copy-id slave2

然后使用 ssh 主机名 测试是否需要输入密码,如果无需密码说明设置成功。

时间同步

首先分别为三台虚拟机设置时区为 Asia/Shanghai

1
sudo cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

然后安装 ntpdate 服务,并从阿里云时间同步服务器同步系统时间。

1
2
3
sudo apt-get install ntpdate -y
ntpdate ntp1.aliyun.com
hwclock --systohc

配置 Hadoop

core-site.xml

修改 core-site.xml 文件,添加如下配置:

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
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master1:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/bigdata/hadoop-2.7.7/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>

hdfs-site.xml

修改 hdfs-site.xml 文件,添加如下配置:

首先创建 namedata 目录

1
2
mkdir ${HADOOP_HOME}/name
mkdir ${HADOOP_HOME}/data
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>
<!-- 指定Hadoop SecondaryNameNode 主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master1:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/bigdata/hadoop-2.7.7/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/bigdata/hadoop-2.7.7/data</value>
</property>
<!-- 配置副本数量为2,默认为3 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--开启 web hdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.web.ugi</name>
<value>supergroup</value>
</property>
</configuration>

mapred-site.xml

修改 mapred-site.xml 文件,添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<configuration>
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master1:19888</value>
</property>
</configuration>

yarn-site.xml

修改 yarn-site.xml 文件,添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master1</value>
</property>
</configuration>

群起集群

  1. 配置 slaves
  2. 切换目录到:hadoop 安装目录 /opt/bigdata/hadoop-2.7.7
  3. ${HADOOP_HOME}/etc/hadoop/ 目录下的 slaves 文件中添加如下内容
  4. scp 发送 hadooop 目录到 slave1slave2
1
2
slave1
slave2

注意结尾不能有空格,文件中不能有空行

编写同步脚本 xsync

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
34
35
36
37
pcount=$#
if((pcount==0)); then
echo no args;
exit;
elif((pcount>2)); then
echo error args;
exit;
fi

# 获取当前用户名称
user=`whoami`

# 获取文件名称
p1=$1
if [ $p1 = "file" ]; then
file=$2
fname=`basename $file`
echo fname=$fname
# 获取上级目录到绝对路径 –P指向实际物理地址,防止软连接
pdir=`cd -P $(dirname $file); pwd`
echo pdir=$pdir

# 发送文件
for slave in $slaves
do
rsync -rvl $pdir/$fname $user@$slave$host:$pdir
done
elif [ $p1 = "cmd" ]; then
cmd=$2
for slave in $slaves
do
echo "$slave execute cmd $cmd"
ssh $user@$slave$host $cmd
done
else
echo error cmd;
fi

xsync 脚本文件复制到 ${HDAOOP_HOME}/bin 目录下,并赋予执行权限

1
2
cp xsync ${HDAOOP_HOME}/bin/
sudo chmod +x ${HDAOOP_HOME}/bin/xsync

scp 命令发送 hadoopslave1slave2

如果没有请先创建 bigdata 目录,并修改目录所属用户,组

1
2
scp -r ${HADOOP_HOME} slave1:/opt/bigdata
scp -r ${HADOOP_HOME} slave2:/opt/bigdata

添加环境变量 slaves,多个用空格隔开

1
export slaves="master1 slave1 slave2"

启动 Hadoop

同步所有节点的配置文件

1
xsync file ${HDAOOP_HOME}/etc/hadoop/slaves

分别到三台虚拟机格式化 namenode

1
xsync cmd "hdfs namenode -format"

启动 hdfs

1
${HADOOP_HOME}/sbin/start-dfs.sh

输出日志

1
2
3
4
5
6
Starting namenodes on [master1]
master1: starting namenode, logging to /opt/bigdata/hadoop-2.7.7/logs/hadoop-bennie-namenode-master1.out
slave2: starting datanode, logging to /opt/bigdata/hadoop-2.7.7/logs/hadoop-bennie-datanode-slave2.out
slave1: starting datanode, logging to /opt/bigdata/hadoop-2.7.7/logs/hadoop-bennie-datanode-slave1.out
Starting secondary namenodes [master1]
master1: starting secondarynamenode, logging to /opt/bigdata/hadoop-2.7.7/logs/hadoop-bennie-secondarynamenode-master1.out

jps 查看 java 进程

jps 查看 java 进程

  • master1
1
2
3
4
bennie@master1:/opt/bigdata/hadoop-2.7.7$ jps
62481 Jps
62372 SecondaryNameNode
62164 NameNode
  • slave1
1
2
3
bennie@slave1:/opt$ jps
3667 Jps
3593 DataNode
  • slave2
1
2
3
bennie@slave1:/opt$ jps
3667 Jps
3593 DataNode

启动 yarn

1
${HADOOP_HOME}/sbin/start-yarn.sh

输出日志

1
2
3
4
starting yarn daemons
starting resourcemanager, logging to /opt/bigdata/hadoop-2.7.7/logs/yarn-bennie-resourcemanager-master1.out
slave2: starting nodemanager, logging to /opt/bigdata/hadoop-2.7.7/logs/yarn-bennie-nodemanager-slave2.out
slave1: starting nodemanager, logging to /opt/bigdata/hadoop-2.7.7/logs/yarn-bennie-nodemanager-slave1.out

jps 查看 java 进程

  • master1
1
2
3
4
5
bennie@master1:/opt/bigdata/hadoop-2.7.7$ jps
62372 SecondaryNameNode
62164 NameNode
62534 ResourceManager
62794 Jps
  • slave1
1
2
3
4
bennie@slave1:/opt$ jps
3729 NodeManager
3593 DataNode
3850 Jps
  • slave2
1
2
3
3382 NodeManager
3503 Jps
3247 DataNode