Hadoop完全分布式的安装、使用、节点增删和hdfs通过nfs进行共享挂载

Hadoop的部署方式有三种:
  单机模式:Hadoop的单机模式安装很简单,只需配置好环境变量即可运行,这个模式一般用来学习和测试Hadoop的功能
  伪分布模式:伪分布式的安装和完全分布式类似,区别是所有角色安装在一台机器上,使用本地磁盘,一般生产环境都会使用完全分布式,伪分布式一般是用来学习和测试Hadoop的功能,伪分布式的配置和完全分布式配置类似
  完全分布式模式:在生产环境中实际使用的安装方式

软件准备:

在Hadoop官网上下载搭建集群所需软件Hadoop:

http://hadoop.apache.org

正文:

Hadoop完全分布式的安装、使用、节点增删和hdfs通过nfs进行共享挂载

步骤列表:
步骤一:主机列表
1.1 主机列表
1.2 主机列表讲解
1.2.1 为什么将NameNode、SecondaryNameNode、ResourceManager三个模块放在同一台主机上
1.2.2 为什么将datanode和nodemanager两个模块放在同一台主机上

步骤二:环境准备
2.1 系统环境住呗
2.1.1 系统环境cenos7
2.1.2 关闭所有主机的防火墙和selinux
2.1.3 配置好所有主机的yum源
2.1.4 按照主机列表修改好所有主机的主机名
2.2 软件环境准备
2.3 让所有主机可以通过主机名ping通对方
2.4 让NameNode角色的主机,在本次实验中是nn01主机能够不用输入密码和yes就登陆其他所有主机

步骤三: 搭建Hadoop完全分布式前必须要确保的内容
3.1 所有主机都能够ping通namenode的主机名,namenode能ping通所有节点(在/etc/hosts里配置)
3.2 所有主机都要好安装java-1.8.0-openjdk-devel(可以使用# java -version命令验证java-1.8.0-openjdk-devel是否安装)
3.3 验证java角色,这个角色是hadoop里的角色(可以用# jps命令验证) 
3.4 保证NameNode主机能够不会出现要求输入yes的情况下,成功远程登陆所有主机,包括本机!!!

步骤四:安装并配置Hadoop
4.1 安装hadoop
4.1.1 下载hadoop安装包
4.1.2 安装hadoop安装包
4.2 总结HDFS系统需要修改的配置文件
4.2.1 环境配置文件:hadoop-env.sh
4.2.2 核心配置文件:core-site.xml
4.2.3 HDFS配置文件:hdfs-site.xml
4.2.4 节点配置文件:slaves
4.2.5 mapred-site.xml
4.2.6 yarn-site.xml
4.3 修改hadoop-env.sh文件
4.4 修改hadoop的核心配置文件core-site.xml
4.5 修改hdfs-site.xml文件
4.6 修改Slaves文件
4.7 将nn01上配置好的hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves文件以及整个hadoop包同步到node1、node2、node3
4.8 查看上一步的同步是否成功
4.9 格式化hadoop 
4.10 配置mapred-site
4.11 配置yarn-site
4.12 同步mapred-site和yarn-site

步骤五:验证hadoop的配置
5.1 在nn01上启动hadoop
5.2 在nn01上用yarn验证node节点
5.3 在各个主机上验证他的java角色

步骤六:使用完全分布式Hadoop对词频进行统计
6.1 在hadoop集群里创建文件夹
6.2 hadoop集群文件的操作方法,向hadoop上传需要进行大数据的文件
6.3 使用hadoop集群对上传的文件进行大计算运算并查看

步骤七:对hadoop进行节点管理之在hadoop集群上再创建一个新的节点
7.1 添加新节点前的必须要确保的内容
7.1.1 所有主机(包括新节点主机)都能够ping通namenode的主机名,namenode能ping通所有节点(在/etc/hosts里配置)
7.1.2 所有主机(包括新节点主机)都要好安装java-1.8.0-openjdk-devel(可以使用# java -version命令验证java-1.8.0-openjdk-devel是否安装)
7.1.3 验证java角色,这个角色是hadoop里的角色(可以用# jps命令验证) 
7.1.4 保证NameNode主机能够不会出现要求输入yes的情况下,能够登陆成功每台主机,包括本机和新节点主机!!!
7.2 修改hadoop配置文件,将新节点加入到hadoopo集群之中
7.3 查看新新添加节点的状态
7.4 设置宽带同步(因为添加新节点之后,hadoop要将过去的数据转移过去,而hadoop往往存储的是海量数据转移需要大量网络带宽,如果不限速的话可能会导致网络瘫痪)
7.5 开始把其他hadoop节点上的数据分摊到新的节点上

步骤八:对hadoop进行节点管理之在hadoop集群上删除一个节点(删除节点是一个非常危险的操作,在生产环境中一定要尽量避免,本次删除的节点是node4)
8.1 在nn01 NameNode1上配置删除节点的hadoop配置文件
8.2 导出要删除节点的数据(本次删除的节点是node4)
8.3 查看要数据的导出状态
8.4 down掉datanode主机

步骤九:设置hadoop的nfs实现其他主机通过nfs访问hadoop的分布式云存储(hdfs)
9.1 在namenode主机(nn01)和nfs主机(nfsgw)上同时添加使用nfs的账户(注意:两边账户的所属组、所属主、uid、gid必须都一致)
9.2 在core-site.xml上进行相应的配置
9.2.1 停止hadoop的所有服务
9.2.2 将exlcude文档清空并对core-site.xml进行配置
9.2.3 将配置好的文件同步到node1、node2、node3
9.2.4 启动hadoop集群
9.2.5 查看hadoop集群的启动状态

9.3 配置nfsgw上的nfs
9.3.1 在nfsgw上安装java-1.8.0-openjdk-devel和rsync
9.3.2 将nn01上的hadoop配置文件拷贝在nfsgw上
9.3.3 在nfsgw主机上创建数据根目录 /var/hadoop
9.3.4 在nfsgw主机上创建转储目录,并将他的所属组和所属主都改为nfs
9.3.5 在nfsgw主机上让nfs用户对/usr/local/hadoop/logs拥有setfacl的rwx权限
9.3.6 注意确保在nfsgw上,nfs用户可以在/var/nfstmp/和/usr/local/hadoop/logs/目录下可以进行增删改成
9.3.6.1 确认nfs用户在/var/nfstmp/下的权限
9.3.6.2 确认nfs用户在/usr/local/hadoop/logs/下的权限
9.4 在nfsgw上启动hdfs服务,注意一定要以root的身份启动,否则hadoop的nfsgw功能将无法使用
9.5 在nfsgw上启动nfs3服务,注意一定要以nfs的身份启动,否则hadoop的nfsgw功能将无法使用
9.6 客户端挂载挂载访问hadoop的分布式云存储(hdfs)的nfs(客户端可以用node4这台主机)
9.7 客户端实现实现开机自动挂载hadoop的分布式云存储(hdfs)的nfs

具体的操作步骤:
步骤一:主机列表
1.1 主机列表
主机               角色                          软件            备注
192.168.1.50     NameNode1       HDFS
nn01        SecondaryNameNode  YARN
        ResourceManager

192.168.1.51    DataNode       HDFS
node1     NodeManager      YARN

192.1681.52     DataNode       HDFS
node2      NodeManager      YARN

192.168.1.53    DataNode       HDFS
node3     NodeManager      YARN

192.168.1.54    DataNode       HDFS            新增的节点
node4               NodeManager      YARN

192.168.1.55      nfsgw                          NFS             以nfs的方式访问hadoop的文件系统
nfsgw

192.168.1.56     NameNode2       HDFS    
nn02       SecondaryNameNode  YARN
        ResourceManager                  

1.2 主机列表讲解
1.2.1 为什么将NameNode、SecondaryNameNode、ResourceManager三个模块放在同一台主机上
namenode管理datanode消耗少量的磁盘和io和cpu与内存
secondarynamenode整合日志的,消耗少量的磁盘io和cpu与内存
resourcemanager切分数据,消耗网络io

1.2.2 为什么将datanode和nodemanager两个模块放在同一台主机上
datanode是消耗磁盘io的
nodemanager是消耗cpu和内存的
这两个放在一起不会相互冲突,所以可以进行资源利用

步骤二:环境准备
2.1 系统环境住呗
2.1.1 系统环境cenos7
2.1.2 关闭所有主机的防火墙和selinux
2.1.3 配置好所有主机的yum源
2.1.4 按照主机列表修改好所有主机的主机名

2.2 软件环境准备
安装java-1.8.0-openjdk-devel
(只在nn01主机上执行以下命令)
[root@nn01 ~]# for i in {1..5}; do ssh 192.168.1.5$i "yum -y install java-1.8.0-openjdk-devel"; done

2.3 让所有主机可以通过主机名ping通对方
(只在nn01主机上执行以下命令)
[root@nn01 ~]# vim /etc/hosts
# vim /etc/hosts
::1           localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.50 nn01
192.168.1.51 node1
192.168.1.52 node2
192.168.1.53 node3
192.168.1.54 node4
192.168.1.55 nfsgw

[root@nn01 ~]# for i in {1..6}; do scp /etc/hosts 192.168.1.5$i:/etc/hosts; done

2.4 让NameNode角色的主机,在本次实验中是nn01主机能够不用输入密码和yes就登陆其他所有主机
(只在nn01主机上执行以下命令)
[root@nn01 ~]# vim /etc/ssh/ssh_config    #让nn01第一次登陆远程主机时不再需要输入yes
Host *
        GSSAPIAuthentication yes
        StrictHostKeyChecking no

[root@nn01 ~]# ssh-keygen -b 2048 -t rsa -N '' -f key
[root@nn01 ~]# for i in {1..3}; do ssh-copy-id -i ./key.pub 192.168.1.5$i ; done

步骤三: 搭建Hadoop完全分布式前必须要确保的内容
3.1 所有主机都能够ping通namenode的主机名,namenode能ping通所有节点(在/etc/hosts里配置)
3.2 所有主机都要好安装java-1.8.0-openjdk-devel(可以使用# java -version命令验证java-1.8.0-openjdk-devel是否安装)
3.3 验证java角色,这个角色是hadoop里的角色(可以用# jps命令验证) 
3.4 保证NameNode主机能够不会出现要求输入yes的情况下,成功远程登陆所有主机,包括本机!!!
(方法如下:
(1)修改ssh_config配置文件
vim /etc/ssh_config
(在里面修改以下两行)
Host *
        GSSAPIAuthentication yes
        StrictHostKeyChecking no

(2)生成ssh秘钥并将其远程到其他主机
# ssh-keygen -b 2048 -t rsa -N '' -f key
# for i in {51..56} ; do  ssh-copy-id  192.168.1.$i; done   #部署公钥给51到56的主机
)

步骤四:安装并配置Hadoop
4.1 安装hadoop
4.1.1 下载hadoop安装包
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# tar zxf hadoop-2.7.6.tar.gz #解压安装包
(hadoop安装包可以在本文开头的下载链接上下载)

4.1.2 安装hadoop安装包
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# mv hadoop-2.7.6/* /usr/local/hadoop #安装hadoop
(注意:在执行这一步之前,要先保证/usr/local/hadoop目录不存在,这样才会移动并改名,否则的话,就成了将hadoop-2.7.6复制在/usr/local/hadoop下面)

4.2 总结HDFS系统需要修改的配置文件
4.2.1 环境配置文件:hadoop-env.sh
4.2.2 核心配置文件:core-site.xml
4.2.3 HDFS配置文件:hdfs-site.xml
4.2.4 节点配置文件:slaves
4.2.5 mapred-site.xml
4.2.6 yarn-site.xml

4.3 修改hadoop-env.sh文件
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# vim hadoop-env.sh
25 export \ 
JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre"
33 export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"

4.4 修改hadoop的核心配置文件core-site.xml
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# vim core-site.xml
<configuration>
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://nn01:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop</value>
    </property>
</configuration>
[root@nn01 hadoop]# mkdir /var/hadoop        //hadoop的数据根目录
[root@nn01 hadoop]# ssh node1 mkdir /var/hadoop
[root@nn01 hadoop]# ssh node2 mkdir /var/hadoop
[root@nn01 hadoop]# ssh node3 mkdir /var/hadoop

4.5 修改hdfs-site.xml文件
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# vim hdfs-site.xml
<configuration>
 <property>
        <name>dfs.namenode.http-address</name>
        <value>nn01:50070</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>nn01:50090</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

4.6 修改Slaves文件
(只在nn01主机上执行以下命令)
[root@nn01 ~]# cd  /usr/local/hadoop/etc/hadoop
[root@nn01 hadoop]# vim slaves
node1
node2
node3

4.7 将nn01上配置好的hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves文件以及整个hadoop包同步到node1、node2、node3
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# yum –y install rsync  #同步的主机都要安装rsync
[root@nn01 hadoop]# for i in 51 52 53 ; do rsync -aSH --delete /usr/local/hadoop/ 
\   192.168.1.$i:/usr/local/hadoop/  -e 'ssh' & done
[1] 23260
[2] 23261
[3] 23262

4.8 查看上一步的同步是否成功
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ssh node1 ls /usr/local/hadoop/
bin
etc
include
lib
libexec
LICENSE.txt
NOTICE.txt
bb
README.txt
sbin
share
aa

[root@nn01 hadoop]# ssh node2 ls /usr/local/hadoop/
bin
etc
include
lib
libexec
LICENSE.txt
NOTICE.txt
bb
README.txt
sbin
share
aa

[root@nn01 hadoop]# ssh node3 ls /usr/local/hadoop/
bin
etc
include
lib
libexec
LICENSE.txt
NOTICE.txt
bb
README.txt
sbin
share
aa

4.9 格式化hadoop 
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# cd /usr/local/hadoop/
[root@nn01 hadoop]# ./bin/hdfs namenode -format         #格式化 namenode
[root@nn01 hadoop]# ./sbin/start-dfs.sh        #启动
[root@nn01 hadoop]# jps        #验证角色
23408 NameNode
23700 Jps
23591 SecondaryNameNode
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -report        #查看集群是否组建成功
Live datanodes (3):        #有三个角色成功

4.10 配置mapred-site
(只在nn01主机上执行以下命令)
[root@nn01 ~]# cd /usr/local/hadoop/etc/hadoop/
[root@nn01 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@nn01 hadoop]# vim mapred-site.xml
<configuration>
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

4.11 配置yarn-site
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# vim yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>nn01</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

4.12 同步mapred-site和yarn-site
[root@nn01 hadoop]# for i in {51..53}; do rsync -aSH --delete /usr/local/hadoop/ 192.168.1.$i:/usr/local/hadoop/  -e 'ssh' & done
[1] 712
[2] 713
[3] 714

步骤五:验证hadoop的配置
5.1 在nn01上启动hadoop
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# cd /usr/local/hadoop
[root@nn01 hadoop]# ./sbin/start-dfs.sh
Starting namenodes on [nn01]
nn01: namenode running as process 23408. Stop it first.
node1: datanode running as process 22409. Stop it first.
node2: datanode running as process 22367. Stop it first.
node3: datanode running as process 22356. Stop it first.
Starting secondary namenodes [nn01]
nn01: secondarynamenode running as process 23591. Stop it first.

5.2 在nn01上用yarn验证node节点
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ./sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-root-resourcemanager-nn01.out
node2: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node2.out
node3: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node3.out
node1: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node1.out

5.3 在各个主机上验证他的java角色
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# jps    #nn01查看有ResourceManager
23408 NameNode
1043 ResourceManager
1302 Jps
23591 SecondaryNameNode

[root@nn01 hadoop]# ssh node1 jps        #node1查看有NodeManager
25777 Jps
22409 DataNode
25673 NodeManager

[root@nn01 hadoop]# ssh node2 jps        #node1查看有NodeManager
25729 Jps
25625 NodeManager
22367 DataNode

[root@nn01 hadoop]# ssh node3 jps        #node1查看有NodeManager
22356 DataNode
25620 NodeManager
25724 Jps

步骤六:使用完全分布式Hadoop对词频进行统计
6.1 在hadoop集群里创建文件夹
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ./bin/hadoop fs -ls /        #查看集群文件系统的根,没有内容
[root@nn01 hadoop]# ./bin/hadoop fs -mkdir /zmy  #在集群文件系统下创建zmy目录
[root@nn01 hadoop]# ./bin/hadoop fs -ls /        #再次查看,有刚创建的zmy目录
Found 1 items
drwxr-xr-x   - root supergroup          0 2018-09-10 09:56 /zmy

6.2 hadoop集群文件的操作方法,向hadoop上传需要进行大数据的文件
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ./bin/hadoop fs -touchz /in #在集群文件系统下创建in文件
[root@nn01 hadoop]# ./bin/hadoop fs -put *.txt /zmy #上传*.txt到集群文件系统下的zmy目录
[root@nn01 hadoop]# ./bin/hadoop fs -ls /zmy #查看刚刚上传的文件
Found 3 items
-rw-r--r--   2 root supergroup      86424 2018-09-10 09:58 /zmy/LICENSE.txt
-rw-r--r--   2 root supergroup      14978 2018-09-10 09:58 /zmy/NOTICE.txt
-rw-r--r--   2 root supergroup       1366 2018-09-10 09:58 /zmy/README.txt
[root@nn01 hadoop]# ./bin/hadoop fs -get /zmy #下载集群文件系统的zmy目录

6.3 使用hadoop集群对上传的文件进行大计算运算并查看
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ./bin/hadoop jar \
 share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /zmy /out #使用hadoop集群分析大数据,并将hadoop集群/zmy里的分析结果存到hadoop集群/out下
[root@nn01 hadoop]# ./bin/hadoop fs -cat /out/* #查看集群里的数据

步骤七:对hadoop进行节点管理之在hadoop集群上再创建一个新的节点
7.1 添加新节点前的必须要确保的内容
7.1.1 所有主机(包括新节点主机)都能够ping通namenode的主机名,namenode能ping通所有节点(在/etc/hosts里配置)
7.1.2 所有主机(包括新节点主机)都要好安装java-1.8.0-openjdk-devel(可以使用# java -version命令验证java-1.8.0-openjdk-devel是否安装)
7.1.3 验证java角色,这个角色是hadoop里的角色(可以用# jps命令验证) 
7.1.4 保证NameNode主机能够不会出现要求输入yes的情况下,能够登陆成功每台主机,包括本机和新节点主机!!!
方法如下:
vim /etc/ssh_config
(方法如下:
(1)修改ssh_config配置文件
vim /etc/ssh_config
(在里面修改以下两行)
Host *
        GSSAPIAuthentication yes
        StrictHostKeyChecking no

(2)生成ssh秘钥并将其远程到其他主机
# ssh-keygen -b 2048 -t rsa -N '' -f key
# for i in {51..56} ; do  ssh-copy-id  192.168.1.$i; done   #部署公钥给51到56的主机
)

7.2 修改hadoop配置文件,将新节点加入到hadoopo集群之中
(只在nn01上面操作)
[root@nn01 hadoop]# vim ./etc/hadoop/slaves
node1
node2
node3
node4
[root@nn01 hadoop]# for i in {51..54}; do rsync -aSH --delete /usr/local/hadoop/
\ 192.168.1.$i:/usr/local/hadoop/  -e 'ssh' & done #同步配置
[1] 1841
[2] 1842
[3] 1843
[4] 1844
[root@node4 hadoop]# ./sbin/hadoop-daemon.sh start datanode  #启动

7.3 查看新新添加节点的状态
(只在node4主机上执行以下命令)
[root@node4 hadoop]# jps
24439 Jps
24351 DataNode

7.4 设置宽带同步(因为添加新节点之后,hadoop要将过去的数据转移过去,而hadoop往往存储的是海量数据转移需要大量网络带宽,如果不限速的话可能会导致网络瘫痪)
(只在node4主机上执行以下命令)
[root@node4 hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 60000000
Balancer bandwidth is set to 60000000

7.5 开始把其他hadoop节点上的数据分摊到新的节点上
[root@node4 hadoop]# ./sbin/start-balancer.sh
(hadoop里面有着海量的数据,一旦开始同步这些数据,则会花费大量的时间,往往需要好几天)

步骤八:对hadoop进行节点管理之在hadoop集群上删除一个节点(删除节点是一个非常危险的操作,在生产环境中一定要尽量避免,本次删除的节点是node4)
8.1 在nn01 NameNode1上配置删除节点的hadoop配置文件
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# vim /usr/local/hadoop/etc/hadoop/slaves       #去掉之前添加的node4
node1
node2
node3
[root@nn01 hadoop]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml     #在此配置文件里面加入下面四行
<property>                                      
    <name>dfs.hosts.exclude</name>
    <value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>
[root@nn01 hadoop]# vim /usr/local/hadoop/etc/hadoop/exclude
node4

8.2 导出要删除节点的数据(本次删除的节点是node4)
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -refreshNodes
Refresh nodes successful

8.3 查看要数据的导出状态
(只在node1主机上执行以下命令)
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -report  #查看node4显示Decommissioned
Dead datanodes (1):
Name: 192.168.1.25:50010 (node4)
Hostname: node4
Decommission Status : Decommissioned
Configured Capacity: 17168314368 (15.99 GB)
DFS Used: 12288 (12 KB)
Non DFS Used: 1656664064 (1.54 GB)
DFS Remaining: 15511638016 (14.45 GB)
DFS Used%: 0.00%
DFS Remaining%: 90.35%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Mon Sep 10 10:59:58 CST 2018
(注意:仅当状态变成Decommissioned时,才能down掉此节点,否则就会造成数据丢失)

8.4 down掉datanode主机
(只在node4主机上执行以下命令)
[root@node4 hadoop]# ./sbin/hadoop-daemon.sh stop datanode   #停止datanode
stopping datanode
[root@node4 hadoop]# ./sbin/yarn-daemon.sh start nodemanager  #yarn 增加 nodemanager
[root@node4 hadoop]# ./sbin/yarn-daemon.sh stop  nodemanager  #停止nodemanager
stopping nodemanager
[root@node4 hadoop]# ./bin/yarn node -list   #yarn 查看节点状态
18/09/10 11:04:50 INFO client.RMProxy: Connecting to ResourceManager at nn01/192.168.1.21:8032
Total Nodes:4
         Node-Id         Node-State    Node-Http-Address    Number-of-Running-Containers
     node3:34628            RUNNING           node3:8042                               0
     node2:36300            RUNNING           node2:8042                               0
     node4:42459            RUNNING           node4:8042                               0
     node1:39196            RUNNING           node1:8042                               0
(注意:此时还是有node4节点,要过一段时间才会消失,他要过一段时间才会消失)

步骤九:设置hadoop的nfs实现其他主机通过nfs访问hadoop的分布式云存储(hdfs)
9.1 在namenode主机(nn01)和nfs主机(nfsgw)上同时添加使用nfs的账户(注意:两边账户的所属组、所属主、uid、gid必须都一致)
(在nn01和nfsgw主机上都要进行以下操作)
[root@nn01 ~]# groupadd -g 200 nfs
[root@nn01 ~]# useradd -u 200 -g nfs nfs

[root@nfsgw ~]# groupadd -g 200 nfs
[root@nfsgw ~]# useradd -u 200 -g nfs nfs

9.2 在core-site.xml上进行相应的配置
9.2.1 停止hadoop的所有服务
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ./sbin/stop-all.sh   #停止所有服务
This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh
Stopping namenodes on [nn01]
nn01: stopping namenode
node2: stopping datanode
node4: no datanode to stop
node3: stopping datanode
node1: stopping datanode
Stopping secondary namenodes [nn01]
nn01: stopping secondarynamenode
stopping yarn daemons
stopping resourcemanager
node2: stopping nodemanager
node3: stopping nodemanager
node4: no nodemanager to stop
node1: stopping nodemanager
...

9.2.2 将exlcude文档清空并对core-site.xml进行配置
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# cd etc/hadoop
[root@nn01 hadoop]# > exclude
[root@nn01 hadoop]# vim core-site.xml
    <property>
        <name>hadoop.proxyuser.nfs.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nfs.hosts</name>
        <value>*</value>
    </property>

9.2.3 将配置好的文件同步到node1、node2、node3
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# for i in {51..53}; do rsync -aSH --delete /usr/local/hadoop/ 192.168.1.$i:/usr/local/hadoop/  -e 'ssh' & done
[4] 2722
[5] 2723
[6] 2724

9.2.4 启动hadoop集群
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/sbin/start-dfs.sh

9.2.5 查看hadoop集群的启动状态
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs  dfsadmin -report

9.3 配置nfsgw上的nfs
9.3.1 在nfsgw上安装java-1.8.0-openjdk-devel和rsync
[root@nfsgw ~]# yum -y install java-1.8.0-openjdk-devel
[root@nfsgw ~]# yum -y install rsync

9.3.2 将nn01上的hadoop配置文件拷贝在nfsgw上
[root@nn01 hadoop]# rsync -avSH --delete /usr/local/hadoop/ 192.168.1.55:/usr/local/hadoop/  -e 'ssh'

9.3.3 在nfsgw主机上创建数据根目录 /var/hadoop
[root@nfsgw ~]# mkdir /var/hadoop

9.3.4 在nfsgw主机上创建转储目录,并将他的所属组和所属主都改为nfs
[root@nfsgw ~]# mkdir /var/nfstmp
[root@nfsgw ~]# chown nfs:nfs /var/nfstmp

9.3.5 在nfsgw主机上让nfs用户对/usr/local/hadoop/logs拥有setfacl的rwx权限
[root@nfsgw ~]# setfacl -m u:nfs:rwx /usr/local/hadoop/logs
[root@nfsgw ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
    <property>
        <name>nfs.exports.allowed.hosts</name>
        <value>* rw</value>
    </property>
    <property>
        <name>nfs.dump.dir</name>
        <value>/var/nfstmp</value>
    </property>

9.3.6 注意确保在nfsgw上,nfs用户可以在/var/nfstmp/和/usr/local/hadoop/logs/目录下可以进行增删改成
9.3.6.1 确认nfs用户在/var/nfstmp/下的权限
[root@nfsgw ~]# su - nfs
[nfs@nfsgw ~]$ cd /var/nfstmp/
[nfs@nfsgw nfstmp]$ touch 1
[nfs@nfsgw nfstmp]$ ls
1
[nfs@nfsgw nfstmp]$ rm -rf 1
[nfs@nfsgw nfstmp]$ ls

9.3.6.2 确认nfs用户在/usr/local/hadoop/logs/下的权限
[nfs@nfsgw nfstmp]$ cd /usr/local/hadoop/logs/
[nfs@nfsgw logs]$ touch 1
[nfs@nfsgw logs]$ ls
1 hadoop-root-secondarynamenode-nn01.log    yarn-root-resourcemanager-nn01.log
hadoop-root-namenode-nn01.log hadoop-root-secondarynamenode-nn01.out    yarn-root-resourcemanager-nn01.out
hadoop-root-namenode-nn01.out    hadoop-root-secondarynamenode-nn01.out.1
hadoop-root-namenode-nn01.out.1  SecurityAuth-root.audit
[nfs@nfsgw logs]$ rm -rf 1
[nfs@nfsgw logs]$ ls

9.4 在nfsgw上启动hdfs服务,注意一定要以root的身份启动,否则hadoop的nfsgw功能将无法使用
[root@nfsgw ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap        #portmap服务只能用root用户启动
starting portmap, logging to /usr/local/hadoop/logs/hadoop-root-portmap-nfsgw.out
[root@nfsgw ~]# jps
23714 Jps
23670 Portmap

9.5 在nfsgw上启动nfs3服务,注意一定要以nfs的身份启动,否则hadoop的nfsgw功能将无法使用
[root@nfsgw ~]# su - nfs
Last login: Mon Sep 10 12:31:58 CST 2018 on pts/0
[nfs@nfsgw ~]$ cd /usr/local/hadoop/
[nfs@nfsgw hadoop]$ ./sbin/hadoop-daemon.sh  --script ./bin/hdfs start nfs3  #nfs3只能用代理用户启动
starting nfs3, logging to /usr/local/hadoop/logs/hadoop-nfs-nfs3-nfsgw.out
[nfs@nfsgw hadoop]$ jps                    
1362 Jps
1309 Nfs3 
[root@nfsgw hadoop]# jps            //root用户执行可以看到portmap和nfs3
1216 Portmap
1309 Nfs3
1374 Jps

9.6 客户端挂载挂载访问hadoop的分布式云存储(hdfs)的nfs(客户端可以用node4这台主机)
[root@node4 ~]# rm -rf /usr/local/hadoop
[root@node4 ~]# yum -y install nfs-utils
[root@node4 ~]# mount -t nfs -o vers=3,proto=tcp,nolock,noatime,sync,noacl 192.168.1.55:/  /mnt/  //挂载
[root@node4 ~]# cd /mnt/
[root@node4 mnt]# ls
zmy  out  system  tmp
[root@node4 mnt]# touch a
[root@node4 mnt]# ls
zmy  out  system  tmp
[root@node4 mnt]# rm -rf a
[root@node4 mnt]# ls
zmy  out  system  tmp

9.7 客户端实现实现开机自动挂载hadoop的分布式云存储(hdfs)的nfs
[root@node4 ~]# vim /etc/fstab
192.168.1.55:/  /mnt/ nfs  vers=3,proto=tcp,nolock,noatime,sync,noacl,_netdev 0 0 
[root@node4 ~]# mount -a
[root@node4 ~]# df -h
192.168.1.55:/   64G  6.2G   58G  10% /mnt
[root@node4 ~]# rpcinfo -p 192.168.1.26
   program vers proto   port  service
    100005    3   udp   4242  mountd
    100005    1   tcp   4242  mountd
    100000    2   udp    111  portmapper
    100000    2   tcp    111  portmapper
    100005    3   tcp   4242  mountd
    100005    2   tcp   4242  mountd
    100003    3   tcp   2049  nfs
    100005    2   udp   4242  mountd
    100005    1   udp   4242  mountd