Ubuntu16.04 安装配置 Hadoop3.0.0 —— 集群模式

这篇博客是上一篇:Ubuntu16.04 安装配置 Hadoop3.0.0 —— 单机模式和伪集群模式 的第二部分,即配置 Hadoop 的集群模式。那么接下来的步骤就接着第一部分,假设集群中所有节点都已经按照第一部分配置过了。所以有需要的伙伴们还请先看一下上一篇。 :(小红脸)

其实本来我是打算一下子写完的,谁知到内容太多,编辑器后台占用了太多的 CPU ,导致我网站所在的虚拟主机被服务商给关停了 :(惊哭) 虽然我严重怀疑它的 CPU 是虚标的,但那也没办法,谁让那是免费的虚拟主机呢 :(犀利) 我连夜把网站迁到一位大佬的服务器上才完成了第一部分的教程,虽然延迟高了一点,不过资源不受限了。好了,不发牢骚了,开始第二部分:集群模式的教程。

一、集群模式前的准备工作

在配置集群模式之前同样还有一些准备工作:修改 hostname、设置静态 IP、修改 hosts、配置集群间的相互免密登陆。下面我们一个个的来说。

1.修改 hostname

什么是 hostname 呢?hostname 就是主机名,即这台计算机的名字,也就是我们在用 bash 时用户名@后面的名字:

hadoop@ubuntu:~$

例如上面这条,主机名是 ubuntu,用户名是 hadoop。为什么要修改主机名呢?其实主要是一个辨识度,Ubuntu 刚装的时候默认都是Ubuntu,这样无论是日常使用还是开发环境都不好辨识,尤其是在弄集群模式的时候,我们肯定要知道这台主机在集群中担任的是一个什么角色。对于 Ubuntu ,修改主机名实际上就是修改 /etc/hostname 文件中的内容(需要 root 权限),删除之前存在的 ubuntu,改成你要的主机名,保存退出,重启生效

hadoop@ubuntu:~$ sudo vim /etc/hostname
ubuntu

将原来的 ubuntu 改为自己想要的主机名,我这里改为“Hadoop-Server-3”

Hadoop-Server-3

保存退出后重启

hadoop@ubuntu:~$ sudo reboot

重启之后可以看到命令的前缀已经变了

hadoop@Hadoop-Server-3:~$

在集群的其他节点中也修改一下各自的主机名

在这里我先列出我的集群中每个节点的主机名:

主节点 NameNode 的主机名:Hadoop-NameNode
从节点1 DataNode-1 的主机名:Hadoop-DataNode-1
从节点2 DataNode-2 的主机名:Hadoop-DataNode-2

2.设置静态 IP

我们装完虚拟机后默认使用的是 NAT 网络模式并启用 DHCP 的,IP 地址在以后可能会发生变化,这样可是很麻烦的(IP地址改变后 NameNode 老板会找不到它的工人们),因此最好我们配置为静态 IP 地址。具体设置的方法,命令行的话可以看看我写的另一篇博客:Ubuntu用命令行添加并配置新的网络适配器,图形界面的话可以在系统的网络设置中更改。这里简单讲一下在终端中如何设置静态 IP。

首先用 ifconfig 命令查看当前的网络配置信息:

hadoop@ubuntu:~$ ifconfig
ens33     Link encap:Ethernet  HWaddr 00:0c:29:de:6d:f7
          inet addr:192.168.184.143  Bcast:192.168.184.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fede:6df7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:547 errors:0 dropped:0 overruns:0 frame:0
          TX packets:131 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:291888 (291.8 KB)  TX bytes:15012 (15.0 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:166 errors:0 dropped:0 overruns:0 frame:0
          TX packets:166 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:12178 (12.1 KB)  TX bytes:12178 (12.1 KB)

hadoop@ubuntu:~$

可以看到我们的网卡名称为 ens33, 在我的 VMWare 网络配置中虚拟机的网关都是 192.168.184.2(找不到自己网卡地址的可以看我上面说的那篇添加网络适配器的文章),子网掩码是 255.255.255.0,IP 地址为 192.168.184.143。接下来我们以编辑 Ubuntu 的网卡信息来配置静态 IP。

sudo vim /etc/network/interfaces

这个文件大致内容是这样的:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens33
iface ens33 inet dhcp

将 ens33,即我们的网卡名称,下面的 Inet dhcp 改为 static,然后在后面加上网络配置,最终的内容应该和下面的差不多

iface ens33 inet static
address 192.168.184.143
netmask 255.255.255.0
gateway 192.168.184.1
dns-nameservers 192.168.184.1

address 是静态的 IP 地址, netmask 是子网掩码,gateway 是网关,dns-nameservers 是DNS服务器地址(如果是虚拟机就改成网关地址,建议)。改完之后重启网卡或者网络或者系统。

sudo ifdown ens33 && ifup ens33
# 或者
sudo service networking restart
# 或者
sudo reboot

之后记着 ping 以下看网络是否连接上

hadoop@Hadoop-Server-3:~$ ping -c 4 mi.com
PING mi.com (58.83.160.156) 56(84) bytes of data.
64 bytes from 58.83.160.156: icmp_seq=1 ttl=128 time=29.4 ms
64 bytes from 58.83.160.156: icmp_seq=2 ttl=128 time=29.6 ms
64 bytes from 58.83.160.156: icmp_seq=3 ttl=128 time=29.6 ms
64 bytes from 58.83.160.156: icmp_seq=4 ttl=128 time=29.5 ms

--- mi.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4215ms
rtt min/avg/max/mdev = 29.469/29.572/29.643/0.070 ms

这样就算是能够访问互联网,接着我们将集群中的每个节点都配置一下静态 IP。

3.修改 hosts

hosts 是什么呢?它其实是一个本地的域名解析文件,将主机名或者域名和 IP 地址对应起来,优先于 DNS 服务器。因此很多人用它来越过 Great Fire Wall 访问谷歌,也有用来屏蔽广告的。那么这里呢,我们用来让集群中的节点能够相互通过主机名找到对方,毕竟主机名相比 IP 地址要更容易辨识。Linux 下的 hosts 文件就是 /etc/hosts ,同样需要 root 权限。先来看一下原始的 hosts 文件的内容

hadoop@Hadoop-Server-3:~$ sudo vim /etc/hosts
127.0.0.1       localhost
127.0.1.1       ubuntu

可以看到默认的有一个 localhost 到本地循环 127.0.0.1 的映射和原来的主机名 ubuntu 到 127.0.0.1 的映射。由于我们已经修改了主机名,因此也要做相应的更改。

127.0.0.1       localhost
127.0.1.1       ubuntu
127.0.0.1 Hadoop-Server-3

这里 IP 地址和主机名或者域名之间可以用空格或者制表键分隔。退出保存立即生效,如果没有生效就切换到root后用 source /etc/hosts 来使配置生效。

我们还要将集群中的节点主机名映射到相应的 IP 地址。

这里我先列出我的集群 IP 和主机名的映射:

192.168.184.131 Hadoop-NameNode
192.168.184.132 Hadoop-DataNode-1
192.168.184.134 Hadoop-DataNode-2

在 hosts 文件中一行一行添加进去就可以了。接着我们 ping 一下这些主机名看是否生效:

hadoop@Hadoop-NameNode:~$ ping -c 1 Hadoop-NameNode
PING Hadoop-NameNode (192.168.184.131) 56(84) bytes of data.
64 bytes from Hadoop-NameNode (192.168.184.131): icmp_seq=1 ttl=64 time=0.042 ms

--- Hadoop-NameNode ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.042/0.042/0.042/0.000 ms
hadoop@Hadoop-NameNode:~$ ping -c 1 Hadoop-DataNode-1
PING Hadoop-DataNode-1 (192.168.184.132) 56(84) bytes of data.
64 bytes from Hadoop-DataNode-1 (192.168.184.132): icmp_seq=1 ttl=64 time=1.23 ms

--- Hadoop-DataNode-1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.237/1.237/1.237/0.000 ms
hadoop@Hadoop-NameNode:~$ ping -c 1 Hadoop-DataNode-2
PING Hadoop-DataNode-2 (192.168.184.134) 56(84) bytes of data.
64 bytes from Hadoop-DataNode-2 (192.168.184.134): icmp_seq=1 ttl=64 time=0.497 ms

--- Hadoop-DataNode-2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.497/0.497/0.497/0.000 ms

看来在主机名为 Hadoop-NameNode 的节点上 hosts 文件是修改成功的,接下来就把其他节点的 hosts 文件也这样配置一遍,要确保每一个节点都能和其他节点通信。

4.集群内节点免密登陆

集群内的节点之间能相互 ping 通后还要让它们能够相互 SSH 免密登陆,这样可以让老板(NameNode)管理起员工(DataNode)来方便快捷。

在第一部分配置伪分布式模式的时候我们也配置了一次免密登陆,只不过那只是让本机和本机 SSH 时能够免密登陆。这里我们要先为每一个节点生成密钥:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat /home/hadoop/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

在 .ssh 目录下生成了一个私钥 id_rsa 和公钥 id_rsa.pub 。我们就以用指纹免密解锁手机做个比喻吧。一个私钥就像一个指纹,是 SSH 客户端(也就是想要解锁手机的人,就假设是你吧)持有的,系统(SSH 服务端)生成用户密钥的过程就相当于录入一个指纹:系统(SSH 服务端)为一个指纹(私钥)生成了一个特有的数字证书(公钥),存在系统(SSH 服务端)里,因此公钥(数字证书)和私钥(指纹)是一一对应的。而在系统(SSH 服务端)中有一个信任证书列表(authorized_keys),这个文件存储着被手机系统(SSH 服务端)信任的指纹(私钥)的数字证书(公钥)。但是这个信任证书列表需要我们手动添加受信任的数字证书(公钥),当然可以添加多个数字证书(公钥)进去,代表着多个指纹(用户)可以免密解锁(登陆)。因此当用户想要免密解锁(登陆)手机(SSH服务端)时,你会用指纹(私钥)去按手机(向 SSH 服务端请求免密认证),一旦在手机(SSH服务端)的信任证书列表中找到和该指纹(私钥)相匹配的数字证书(公钥),就表明该指纹(私钥)在系统(SSH 服务端)的信任列表中,可以让你(SSH 客户端)免密解锁(登陆)。由此可知免密登陆时验证的是 SSH 客户端携带的私钥 is_rsa 和 SSH 服务端的 authorized_keys 中的公钥 id_rsa.pub 是否匹配。因此我们要想实现一个节点的 hadoop 用户私钥能够免密登陆其他节点的 hadoop 用户,就必须要将该节点 hadoop 用户私钥对应的公钥复制到其他节点的 authorized_keys 列表中。

复制的方法有两种,一种是将本机的公钥拷贝到其他节点上,然后在其他节点上将复制过去的公钥添加到这个节点的 authorized_keys 中:

hadoop@Hadoop-NameNode:~$ scp /home/hadoop/.ssh/id_rsa.pub hadoop@Hadoop-DataNode-1:/home/hadoop/id_
rsa.pub
id_rsa.pub                                                        100%  404     0.4KB/s   00:00
hadoop@Hadoop-NameNode:~$ ssh hadoop@Hadoop-DataNode-1
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-116-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Sun Mar 25 20:35:13 2018
hadoop@Hadoop-DataNode-1:~$ ls
id_rsa.pub
hadoop@Hadoop-DataNode-1:~$ cat id_rsa.pub >> /home/hadoop/.ssh/authorized_keys

远程复制的命令:SCP,就和 CP 命令差不多,无非是其中一个路径变为远程路径,这里的远程路径是利用 SSH ,例如

hadoop@192.168.184.132:/home/hadoop/a.txt

就是一个标准的远程路径,远程主机的用户名@远程主机的域名或者主机名或者 IP 地址:远程主机上的本地路径。

SCP 如果加了一个 -r 选项的话也是可以复制目录。例如

hadoop@Hadoop-NameNode:~$ scp -r .ssh hadoop@Hadoop-DataNode-1:/home/hadoop/ssh
id_rsa                                                            100% 1675     1.6KB/s   00:00
id_rsa.pub                                                        100%  404     0.4KB/s   00:00
known_hosts                                                       100% 2664     2.6KB/s   00:00
authorized_keys                                                   100% 1216     1.2KB/s   00:00
hadoop@Hadoop-NameNode:~$ ssh hadoop@Hadoop-DataNode-1 ls -l /home/hadoop
total 8
-rw-r--r-- 1 hadoop hadoop  404 Mar 26 18:29 id_rsa.pub
drwx------ 2 hadoop hadoop 4096 Mar 26 22:08 ssh

本例中将本机的 .ssh 目录复制到远程主机的 /hadoop/ssh 目录。

这样子复制公钥还是比较麻烦的,那么有没有什么更简单的命令呢?当然有,就是:

 ssh-copy-id hadoop@Hadoop-DataNode-1

这条命令将本机的公钥 id_rsa.pub 复制添加到远程主机的 authorized_keys 中。期间会让你输入远程主机用户的密码,就像这样:

ydy@SUNRISEYDY-MI:~$ ssh-copy-id hadoop@Ubuntu-Server-3
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ydy/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hadoop@ubuntu-server-3's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'hadoop@Ubuntu-Server-3'"
and check to make sure that only the key(s) you wanted were added.

ydy@SUNRISEYDY-MI:~$ ssh hadoop@Ubuntu-Server-3
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-116-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Tue Mar 20 23:49:30 2018
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

hadoop@ubuntu:~$ logout
Connection to ubuntu-server-3 closed.

可以看到示例中再使用 ssh 登陆远程主机时就不再需要密码了。

因此我们可以用 ssh-copy-id 来配置所有节点之间的免密登陆。

二、集群模式的配置

见下一页


版权说明:
作品 sunriseydy 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
文章内容如未说明均为原创,欢迎转载,但请注明原作者(sunriseydy)和原文链接(https://blog.sunriseydy.top/technology/server-blog/server/ubuntu16-04-install-hadoop3-0-0-with-cluster-setup/)
部分来自互联网的文章,如有侵权,请联系我,24小时内删除,谢谢

手机打开扫一扫即可访问本页面

感谢您的支持,SunriseYDY 会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

日出一点一 | 在探索的路上永不止步

分享到微博 分享到QQ 微信赞赏 在手机上阅读 点赞 2

页面: 1 2 3

评论一下呗亲

电子邮件地址不会被公开。 必填项已用*标注