1.1 安装环境

操作系统deepin 15.11, VMware Workstation,hadoop 3.1.3 版本。在deepin 操作系统中安装 VMware Workstation,在 VMware Workstation中安装两个deepin系统,采用两个节点作为集群环境,一个作为Master节点,一个作为Slave 节点。

1.2 hadoop的安装准备

在Master节点和Slave节点都需要进行如下准备工作,主要是配置hadoop用户,安装SSH server和安装Java 环境。

  1. 在安装虚拟机系统时,每个系统都创建hadoop用户。
  2. 选择一个节点作为Master, ctrl+alt+t打开终端,通过命令行方式进行安装,更新apt,执行如下命令。
sudo apt-get update
  1. 安装vim ,用于后续修改配置文件。
sudo apt-get install vim
  1. 安装SSH并登录主机。
sudo apt-get install openssh-server
	ssh localhost
  1. 配置SSH无密码登录,由于hadoop 远程登录只能无密码登录,因此需要配置无密登录。
退出登录: exit
	cd ~/.ssh/
	sh-keygen -t rsa
   cat ./id_rsa.pub >> ./authorized_keys

hadoop编码配置 hadoop slaves配置_vim

hadoop编码配置 hadoop slaves配置_IP_02

  1. 安装Java 环境,采用jdk-8u162-linux-x64.tar.gz,在Documents/目录下。
cd  /usr/lib
	sudo mkdir jvm
	cd  ~/Documents/
	sudo tar -zxvf   ./jdk-8u162-linux-x64.tar.gz  -C  /usr/lib/jvm

hadoop编码配置 hadoop slaves配置_hadoop编码配置_03

  1. 配置环境变量,在配置文件开头位置添加如下内容。
    打开配置文件:
cd  ~
	vim ~/.bashrc
添加内容:
	export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
	export JRE_HOME=${JAVA_HOME}/jre
	export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
	export PATH=${JAVA_HOME}/bin:$PATH
  1. 查看jdk是否安装成功。
Java -version

hadoop编码配置 hadoop slaves配置_hadoop编码配置_04

1.3 安装Hadoop
在Master 节点安装hadoop ,并把/usr/local/中的hadoop 文件夹复制到其他Slave节点的/usr/local目录下。

  1. hadoop-3.1.3.tar.gz 在目录~/Documents/下,安装到/usr/local目录下。
cd  ~/Documents/
	sudo tar zxf  hadoop3.1.3.tar.gz  -C  /usr/local
  1. 修改文件夹名,并修改文件的权限。
cd  /usr/local/
	sudo mv ./hadoop-3.1.3/ ./hadoop
	sudo chown  -R hadoop  ./hadoop

hadoop编码配置 hadoop slaves配置_IP_05

  1. 查看是否安装成功。
cd  /usr/local/hadoop
	./bin/hadoop version

hadoop编码配置 hadoop slaves配置_hadoop编码配置_06

1.4 Hadoop集群配置

  1. 网络配置,配置每个节点的网络,采用桥接来实现节点之间的互联,通过NAT模式连接网络。
    1)通过Edit->Virtual Netwrok Editor,点击Add Network添加一个网络,设置连接方式为桥接。
    2)设置vmnet8中的子网号为192.168.138.0,子网掩码255.255.255.0和网关192.168.138.133,点击NAT Setting即可设置网关。

hadoop编码配置 hadoop slaves配置_hadoop_07


hadoop编码配置 hadoop slaves配置_hadoop编码配置_08

  1. 配置需要每个节点主机的IP 地址,在子网192.168.138.0下,设置IP地址,Master 节点的IP为:192.168.138.128, Slave节点的IP 为:192.168.138.131。
    1)通过ifconfig来查看网卡的IP地址,如下图所示,ens33即为桥接网卡。

hadoop编码配置 hadoop slaves配置_hadoop_09

2)节点计算机静态IP 配置,执行如下命令打开配置文件。
Master节点:

sudo vim  /etc/network/interfaces
添加内容:
auto ens33 
iface ens33 inet  static
address 192.168.138.128

通过如下命令使设置生效,出现OK字样则成功:

sudo  /etc/init.d/networking restart

Slave节点:
用同样的方法设置,添加的内容为:

auto ens33 
iface ens33 inet  static
address 192.168.138.131
  1. 修改主机名,将Master节点的主机名为Master,将Slave节点的主机名改为Slave,分别在两个节点中执行如下命令。
    sudo vim /etc/hostname
  2. 在Master节点和Slave节点修改自己节点的IP 映射,添加如下相同内容。
    执行如下命令,注释掉文件中除127.0.0.1 localhost 的其他的IP 地址映射。
sudo  vim /etc/hosts
	添加IP映射:
	192.168.138.128     Master
	192.168.138.131	    Slave
  1. 重启每个节点,完成主机名更新。
  2. 测试每个节点是否能Ping 通,通过如下命令测试。
ping   Master  -c   3
	ping   Slave    -c  3

hadoop编码配置 hadoop slaves配置_hadoop编码配置_10


hadoop编码配置 hadoop slaves配置_IP_11

  1. SSH无密吗登录节点,配置Master 节点可以远程登录其他Slave节点。由于修改过主机名,所以需要删除原来的SSH 公钥。在Master节点执行如下命令生成公钥。
cd     ~/.ssh
	rm   ./id_rsa*
	ssh-keygen   -t   rsa
  1. 让Master 节点能无密登录SSH 本机,在Master节点执行如下命令.
cat   ./id_rsa.pub   >>   ./authorized_keys
  1. 通过远程拷贝文件,将主机Master ssh公钥传输到Slave 节点。
scp    ~/.ssh/id_rsa.pub   hadoop@Slave:/home/hadoop/

hadoop编码配置 hadoop slaves配置_hadoop编码配置_12

  1. 在Slave 节点将 ssh 公钥加入授权,执行如下命令,需要删除原先SSH公钥。
mkdir    ~/.ssh
	cat     ~/id_rsa.pub   >>   ~/.ssh/authorized_keys
	rm   ~/id_rsa.pub

hadoop编码配置 hadoop slaves配置_hadoop编码配置_13


11. 在Master 节点上测试远程登录Slave 节点,可以看到主机名改变为Slave。

ssh   Slave

hadoop编码配置 hadoop slaves配置_hadoop_14


12. 在Master节点配置hadoop 的PATH 变量,则可以直接使用hadoop,hdfs 相关命令而不需要转到相关目录。

打开配置文件:

vim  ~/.bashrc
	添加内容:
	export   PATH=$PATH:/usr/local/hadoop/bin:/usr/loacl/hadoop/sbin
	使配置生效:
	source  ~/.bashrc
  1. 在Master节点修改配置目录/usr/local/hadoop/etc/hadoop目录下的5个配置文件。
  2. workers 文件
    Master作为NameNode,Slave作为 DataNode。将DataNode的主机名写入workers 文件,删除localhost。添加如下内容。
Slave
  1. core-site.xml
    修改标签中的内容如下。
<configuration>
        		<property>
                		<name>fs.defaultFS</name>
                		<value>hdfs://Master:9000</value>
        		</property>
        		<property>
                		<name>hadoop.tmp.dir</name>
                		<value>file:/usr/local/hadoop/tmp</value>
                		<description>Abase for other temporary directories.</description>
        		</property>
	</configuration>
  1. hdfs-site.xml
    修改标签中的内容如下。
<configuration>
        		<property>
                		<name>dfs.namenode.secondary.http-address</name>
                		<value>Master:50090</value>
        		</property>
        		<property>
               		 <name>dfs.replication</name>
                		<value>1</value>
        		</property>
        		<property>
                		<name>dfs.namenode.name.dir</name>
                		<value>file:/usr/local/hadoop/tmp/dfs/name</value>
        		</property>
        		<property>
                		<name>dfs.datanode.data.dir</name>
                		<value>file:/usr/local/hadoop/tmp/dfs/data</value>
        		</property>
	</configuration>
  1. mapred-site.xml
    修改标签中的内容如下。
<configuration>
        		<property>
                		<name>mapreduce.framework.name</name>
               		 <value>yarn</value>
        		</property>
        		<property>
                		<name>mapreduce.jobhistory.address</name>
                		<value>Master:10020</value>
        		</property>
        		<property>
                		<name>mapreduce.jobhistory.webapp.address</name>
               		 <value>Master:19888</value>
        		</property>
	</configuration>
  1. yarn-site.xml
    修改标签中的内容如下。
<configuration>
        		<property>
                		<name>yarn.resourcemanager.hostname</name>
                		<value>Master</value>
        		</property>
        		<property>
               		 <name>yarn.nodemanager.aux-services</name>
               		 <value>mapreduce_shuffle</value>
       		 </property>
	</configuration>
  1. 在Master节点通过远程拷贝Master 节点的/usr/loacl/hadoop目录到其他Slave 节点。首先先删除之前的临时文件和日志。
cd    /usr/local
	sudo  rm  -r  ./hadoop/tmp
	sudo  rm  -r   ./hadoop/logs/*
	tar   -zcf   ~/hadoop.master.tar.gz    ./hadoop
	cd  ~
	scp   ./hadoop.master.tar.gz    Slave:/home/hadoop
  1. 在Slave 节点解压文件。
sudo    rm   -r    /usr/local/hadoop
	sudo tar  -zxf   ~/hadoop.master.tar.gz   -C    /usr/local
	sudo  chown  -R   hadoop   /usr/local/hadoop
  1. 在Master 节点执行 NameNode 的格式化。
hdfs   namenode    -format

hadoop编码配置 hadoop slaves配置_IP_15


17. 在Master 节点上启动hadoop 集群,执行如下命令。

start-dfs.sh
	start-yarn.sh
	mr-jobhistory-daemon.sh  start historyserver

hadoop编码配置 hadoop slaves配置_hadoop编码配置_16


18. 通过jps 查看集群的节点启动的进程信息,分别在Master 和 Slave 节点执行jps。

Master 节点:

hadoop编码配置 hadoop slaves配置_hadoop_17


Slave 节点:

hadoop编码配置 hadoop slaves配置_vim_18

  1. 在Master节点查看集群的DataNode 是否正常启动。
hdfs  dfsadmin    -report

hadoop编码配置 hadoop slaves配置_IP_19


通过网页查看Slave 节点的相关信息:

hadoop编码配置 hadoop slaves配置_IP_20

  1. 关闭hadoop集群。
stop-yarn.sh
	stop-dfs.sh
	mr-jobhistory-daemon.sh stop historyserver
	或者通过如下命令关闭集群。
	stop-all.sh

1.5 总结

问题1:

  • Master 节点NameNode 没有启 动,DataNode节点却启动了;
  • 执行hdfs dfsadmin -report命令出现如下信息:
    report:Call From Master/192.168.138.128 to Master:9000 failed on connection exception: java.net.ConnectException:拒绝连接;For more details see :http://wiki.apache.org/hadoop/ConnectionRefused

解决:分析发现,我没有配置slaves文件,在hadoop3.1.3版本中,不存在slaves文件,通过网络查询资料以及和同学交流,我发现slaves文件更改成了workes文件,因此配置workes文件;由于前后操作不当,因此导致了此问题。通过如下方式解决:
关闭集群,删除临时文件和日志,重新执行hdfs namenode -format.

问题2:

  • 当关机重启后,集群无法启动,无法ping 通 ;

解决:分析发现各节点的IP发生了变化,导致 集群无法启动,是由于采用了NAT 进行网络连接,NAT模式在每次重启计算机会动态分配IP 地址;采用桥接来实现各节点的连通,配置静态IP.

参考文献

1.厦门大学数据库实验室,http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/