为什么要用SSH免密登录呢?这个是为了提供方便,一个集群肯定会有很多节点,作为一个开发者,虽然可以一个一个的去开启每个节点,但是这样费时费力的事情,尽量还是少做吧,所以出现了这篇博客。用ssh免密登录来群起节点。

下面来看下如何进行配置的。

1. 生成公钥和私钥

首先切换到.ssh目录下

[zohar@hadoop102 ~]$ pwd
/home/zohar
[zohar@hadoop102 ~]$ cd .ssh/

然后生成私钥和公钥:

[zohar@hadoop102 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zohar/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/zohar/.ssh/id_rsa.
Your public key has been saved in /home/zohar/.ssh/id_rsa.pub.
The key fingerprint is:
6d:38:65:6f:24:5e:b1:5e:03:6a:3e:27:17:6c:e2:4a zohar@hadoop102
The key's randomart image is:
+--[ RSA 2048]----+
|            o    |
|           o +   |
|          B B o  |
|         X O o . |
|        E O *    |
|       . + *     |
|        .        |
|                 |
|                 |
+-----------------+

可以进去文档进行查看:.pub就是公钥,id_rsa就是私钥。

[zohar@hadoop102 .ssh]$ ll
总用量 12
-rw-------. 1 zohar zohar 1675 12月 12 10:14 id_rsa
-rw-r--r--. 1 zohar zohar  397 12月 12 10:14 id_rsa.pub
-rw-r--r--. 1 zohar zohar 1215 12月 11 08:51 known_hosts

2. 将公钥拷贝到需要免密登录的机器上

hadoop102上运行的有namenode节点,需要与所有的datanode节点进行通信,也就是与hadoop102、hadoop103和hadoop104机器进行通信,所以下面操作就是将hadoop102公钥拷贝到3台虚拟机上。

将hadoop102的公钥拷贝自己:

[zohar@hadoop102 ~]$ ssh-copy-id hadoop102

将hadoop102的公钥拷贝到hadoop103:

[zohar@hadoop102 .ssh]$ ssh-copy-id hadoop103
zohar@hadoop103's password: 
Now try logging into the machine, with "ssh 'hadoop103'", and check in:

  .ssh/authorized_keys

将hadoop104的公钥拷贝到hadoop104:

[zohar@hadoop102 .ssh]$ ssh-copy-id hadoop104
zohar@hadoop104's password: 
Now try logging into the machine, with "ssh 'hadoop104'", and check in:

  .ssh/authorized_keys

接下来,由于hadoop103上运行着ResourceManager,所以接下来要在hadoop103上生成ssh公钥和私钥,并将公钥发送给3台虚拟机。

hadoop103机器上生成公钥和私钥:

[zohar@hadoop103 .ssh]$ ssh-keygen -t rsa

将hadoop103公钥发送到三台机器上:

[zohar@hadoop103 .ssh]$ ssh-copy-id hadoop102
[zohar@hadoop103 .ssh]$ ssh-copy-id hadoop103
[zohar@hadoop103 .ssh]$ ssh-copy-id hadoop104

下面看一下.ssh/目录下生成了哪些内容: 名称|说明 |:-:|:-:| known_hosts|记录ssh访问过计算机的公钥(public key) id_rsa|生成的私钥 id_rsa.pub|生成的公钥 authorized_keys|存放授权过得无密登录服务器公钥

当前用户都是zohar下进行操作的,ssh也是针对zohar用户来进行的,但是有时候用到root用户的时候,就不能免密使用ssh了,所以这里还需要对root用户进行免密ssh配置,也就是将hadoop102切换到root用户,然后生成root用户的ssh的公钥和私钥,然后分发到hadoop102、hadoop103和hadoop104三台机器上。具体操作如下:

[root@hadoop102 ~]# su - root
[root@hadoop102 ~]# pwd
/root
[root@hadoop102 ~]# cd .ssh/
[root@hadoop102 .ssh]# ssh-keygen -t rsa
[root@hadoop102 .ssh]# ssh-copy-id hadoop102
[root@hadoop102 .ssh]# ssh-copy-id hadoop103
[root@hadoop102 .ssh]# ssh-copy-id hadoop104

在102机器上可以测试一下:

[zohar@hadoop102 ~]$ ssh hadoop103
Last login: Thu Dec 12 14:08:30 2019 from hadoop102
[zohar@hadoop103 ~]$ ssh hadoop104
Last login: Thu Dec 12 14:08:39 2019 from hadoop102
[zohar@hadoop104 ~]$ 

可以看到,不用输入密码就可以访问103,104机器了。

到此,SSH免密配置也就完成了,下面看下如何通过ssh来进行群起集群。

3. 群起集群

3.1. 配置slaves

[root@hadoop102 .ssh]# su - zohar
[zohar@hadoop102 ~]$ cd /opt/module/hadoop-2.7.2/
[zohar@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/slaves

删除slaves文件中的localhost,并把子节点填入:

hadoop102
hadoop103
hadoop104

注意:这个文件添加的内容不允许有空格、稳重不允许有空行。

3.2. 集群全部同步

[zohar@hadoop102 hadoop-2.7.2]$ xsync etc/hadoop/slaves

3.3. 停止所有启动的节点

[zohar@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh stop namenode
[zohar@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh stop datanode
[zohar@hadoop103 hadoop-2.7.2]$ hadoop-daemon.sh stop datanode
[zohar@hadoop104 hadoop-2.7.2]$ hadoop-daemon.sh stop datanode

4. 群起集群

4.1. 格式化并删除data目录和logs目录

如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)。

[zohar@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
[zohar@hadoop102 hadoop-2.7.2]$ hdfs namenode -format

注意:hadoop103和hadoop104两台机器也同样要删除data/和logs/目录。

4.2. 启动集群

[root@hadoop102 hadoop-2.10.0]# start-dfs.sh 

查看3台虚拟机运行情况: hadoop102:

[zohar@hadoop102 hadoop-2.7.2]$ jps
2497 DataNode
2371 NameNode
2735 Jps

hadoop103:

[root@hadoop103 ~]# su - zohar
[zohar@hadoop103 ~]$ jps
2365 Jps
2287 DataNode

hadoop104:

[zohar@hadoop104 ~]$ jps
2471 Jps
2311 DataNode
2382 SecondaryNameNode

通过上面运行的情况,可以看出与前面博客hadoop完全分布式配置之集群单点启动中对集群分布运行情况是一致的。hadoop102运行NameNode和DataNode,hadoop103运行DataNode,hadoop104运行DataNode和SecondaryNameNode。

4.3. 启动yarn

在103机器上启动yarn。

注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。这里ResourceManager在hadoop103机器上,所以这里在hadoop103机器上启动yarn。

[root@hadoop103 hadoop-2.10.0]# sbin/start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /opt/module/hadoop-2.10.0/logs/yarn-root-resourcemanager-hadoop103.out
hadoop103: starting nodemanager, logging to /opt/module/hadoop-2.10.0/logs/yarn-root-nodemanager-hadoop103.out
hadoop104: starting nodemanager, logging to /opt/module/hadoop-2.10.0/logs/yarn-root-nodemanager-hadoop104.out
hadoop102: starting nodemanager, logging to /opt/module/hadoop-2.10.0/logs/yarn-root-nodemanager-hadoop102.out

查看启动yarn之后的状况:

hadoop102机器上:

[zohar@hadoop102 hadoop-2.7.2]$ jps
2896 Jps
2784 NodeManager
2497 DataNode
2371 NameNode

hadoop103机器上:

[zohar@hadoop103 hadoop-2.7.2]$ jps
2417 ResourceManager
2830 Jps
2527 NodeManager
2287 DataNode

hadoop104机器上:

[zohar@hadoop104 ~]$ jps
2532 NodeManager
2311 DataNode
2649 Jps
2382 SecondaryNameNode

从上面的运行结果看出,运行也和预期安排的一致,即:

4.4. 浏览器查看secondarynamenode

http://hadoop104:50090/status.html

5. 集群测试

5.1. 上传文件到集群

上传小文件

在hdfs上创建input目录:

[zohar@hadoop102 hadoop-2.7.2]$ hdfs dfs -mkdir -p /user/zohar/input

将本地wc.input文件上传到hdfs上:

[zohar@hadoop102 hadoop-2.7.2]$ hdfs dfs -put wcinput/wc.input /user/zohar/input

打开浏览器,输入 http://hadoop102:50070 进行查看:

上传大文件

这里把/opt/software/hadoop-2.7.2.tar.gz上传到hdfs上。这里还是上传到/user/zohar/input目录下。

[zohar@hadoop102 hadoop-2.7.2]$ hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /user/zohar/input

打开浏览器,输入 http://hadoop102:50070 进行查看:

点击文件名进行详细查看:

可以看到HDFS将文件分为了两块,因为hadoop-2.7.2.tar.gz文件大小已经超过了128M,所以分了2块进行存储。

存储的位置

上传的这些文件存储到什么地方呢?

存储的位置也就是在配置是指定的data/tmp/.....下面,具体路径如下:

[zohar@hadoop102 subdir0]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-957353812-192.168.1.102-1592509248769/current/finalized/subdir0/subdir0

查看HDFS在磁盘存储文件内容:

[zohar@hadoop102 subdir0]$ cat blk_1073741825
hadoop yarn
hadoop mapreduce
zohar
zhangzhihong

可以看到该文件就是上传的小文件wc.input文件内容。

对切分了的大文件进行拼接操作,可以还原出原文件:

[zohar@hadoop102 subdir0]$ cat blk_1073741826 >> tmp.file
[zohar@hadoop102 subdir0]$ cat blk_1073741827 >> tmp.file
[zohar@hadoop102 subdir0]$ tar -xvzf tmp.file
[zohar@hadoop102 subdir0]$ ll
总用量 387584
-rw-rw-r--. 1 zohar zohar        48 6月  19 04:32 blk_1073741825
-rw-rw-r--. 1 zohar zohar        11 6月  19 04:32 blk_1073741825_1001.meta
-rw-rw-r--. 1 zohar zohar 134217728 6月  19 05:36 blk_1073741826
-rw-rw-r--. 1 zohar zohar   1048583 6月  19 05:36 blk_1073741826_1002.meta
-rw-rw-r--. 1 zohar zohar  63439959 6月  19 05:36 blk_1073741827
-rw-rw-r--. 1 zohar zohar    495635 6月  19 05:36 blk_1073741827_1003.meta
drwxr-xr-x. 9 zohar zohar      4096 5月  22 2017 hadoop-2.7.2
-rw-rw-r--. 1 zohar zohar 197657687 6月  19 05:50 tmp.file

将两块内容进行拼接,然后对拼接文件进行解压,即可还原出原文件来。