3.3 集群的配置
在3.2节中我们初步安装了一个Linux集群。为什么说是初步安装呢?因为要想将上述集群投入实际运行,还需要完成一系列配置。本节就来完成这些配置,从而搭建一个可用的Linux集群。
3.3.1 设置主机名
安装CentOS 7后系统会自动将主机名确定为localhost,用户一般都希望将这个localhost修改成个性化的主机名,如Master、Slave0或HadoopMaster等。下面我们就来修改前面安装的虚拟机的主机名,包括Master和Slave,也就是说,修改主机名的操作要在集群中所有虚拟机上进行。
启动所有虚拟机。
我们在Master主机上进行操作。在其桌面开一个终端,方法是单击左上角的“Applications→Utilities→Terminal”,或者在桌面任意位置单击鼠标右键,在弹出的菜单中选择“Open in Terminal”,打开的终端如图3-37所示。
图3-37 在桌面打开一个终端
要特别注意的是,设置主机名需要Root用户权限,请输入“su root”命令,如图3-38所示。
图3-38 切换成Root用户的命令
回车后输入密码(这里是csucsu),切换到Root用户。注意,这时候的提示符是“#”,这是Linux表示Root用户的命令行提示符,而普通用户的提示符是“$”。
接下来使用gedit编辑器编辑主机名。如果不使用或者由于某种故障不能使用gedit编辑器,也可以使用vi编辑器(后面用到gedit编辑器的地方都可以用vi编辑器代替)。Vi在编辑器有很多命令,编辑中主要使用以下几个:
(1)在启动vi编辑器后,按I键可以进入INSERT状态,用户可插入文本。
(2)按Esc键退出编辑状态。
(3)要放弃编辑退出vi,在按了Esc键后,接着同时按住Shift和:键(即先按住Shift键,再按下:键),然后按Q键并按下Enter键,即可退出vi编辑器。
(4)要退出vi并保存文件,在按了Esc键后,接着同时按住Shift和:键,然后依次按W键和Q键,最后按下Enter键,即可保存文件并退出vi编辑器。
下面使用gedit编辑器编辑network文件。输入“gedit /etc/sysconfig/network”命令,如图3-39所示。
图3-39 编辑network文件的命令
按下Enter键后,在打开的gedit编辑器中输入如下代码:
NETWORKING=yes HOSTNAME=master
在上述代码中,master是用户自己取的主机名,可以根据需要任意命名。编辑完毕后保存并退出gedit编辑器,回到终端。
输入“hostname master”命令,确认修改生效,如图3-40所示。
图3-40 输入“hostname master”命令确认修改生效
按下Enter键后可关闭当前终端,重新打开一个终端(要立即查看修改结果,必须重新打开一个终端),并输入“hostname”命令,以检测主机名是否修改成功,如图3-41所示。
图3-41 输入“hostname”命令检测修改是否成功
这时可以看到,不仅命令的返回值正是用户所取的主机名,而且提示符内的主机名称也由“localhost”改成“master”了。
但是,如果只修改network文件,则在下次重启虚拟机时,会发现修改后的名字又变成“localhost”。原来上面只修改了瞬态(Transient)主机名,并没有修改静态(Static)主机名。
因此,仍然要使用Root用户进行修改,但这一次输入“gedit /etc/hostname”命令,如图3-42所示。
图3-42 输入“gedit /etc/hostname”命令修改hostname文件
在gedit编辑器中输入:
master
master是输入的新主机名。其实,原来文件里有一个localhost.localdomain的主机名,应当将其删除掉,保存后退出。这样,重启虚拟机后,主机名就永久修改了。
请读者重复上述操作方法,将其他虚拟机的主机名也从默认的“localhost”修改为对应的“Slave0”和“Slave1”(如果安装了)。
3.3.2 网络设置
通常,在虚拟机上安装CentOS 7后,系统会自动完成网络设置。用户可以在虚拟机桌面上,将鼠标移动到右上角的网络图标处,如图3-43所示,单击鼠标可查看网络连接状态,如果“Wired”的标识是“ON”,表明网络已经打开。
图3-43 虚拟机桌面右上角的网络图标
在终端中输入“ifconfig”命令,如图3-44所示,以查看Master的IP地址。
图3-44 输入“ifconfig”命令查看Master的IP地址
按下Enter键后,将会在终端中显示Master的IP地址配置信息,如图3-45所示。
图3-45 Master的IP地址配置信息
可以看到,在安装过程中,系统将Master的IP地址自动配置为192.168.163.138(会因用户计算机的配置不同而可能不一样),此外还配置了广播地址、子网掩码等。如果情况是这样,说明网络配置已经就绪,可以开始使用网络功能了,如启动浏览器访问内部或外部网站。
如果输入“ifconfig”命令后看到的信息如图3-46所示,表明网络连接没有打开或配置没有完成,则需要打开网络连接或进行网络配置。
图3-46 网络没有打开或配置没有完成
要打开网络,请单击虚拟机桌面右上角的网络图标(见图3-43),用鼠标将灰色的OFF状态改为彩色的ON状态即可。
注意,上述设置也必须在Slave0和Slave1进行,并确保集群的每一台虚拟机都在同一个网段内,例如Slave0的IP地址可以是192.168.163.135,Slave1的IP地址可以是192.168.163.137。
这样,我们就可以在终端中输入“ping”命令来测试集群是否能够连通。图3-47是在Master上输入“ping”命令测试Slave0的结果,如果看到有返回值,说明两台虚拟机是连通的。注意,要终止“ping”命令,请同时按下Ctrl键和C键(即Ctrl+C组合键)。
图3-47 在Master上输入“ping”命令来测试Slave0
如果看到的是如图3-48所示的情况,说明网络连接失败,需要打开网络或重新配置。
图3-48 Master不能ping通Slave0
上面我们只是简单地采用了系统安装时配置的网络IP地址。实际上,上述地址一般都是DHCP类型的。但是,大数据平台通常是一个稳定的系统,因此,需要将动态类型的主机IP地址修改为静态类型的,具体操作如下。
单击虚拟机桌面右上角的网络图标,再单击“Network Settings”,弹出如图3-49所示的界面。
图3-49 Network Settings界面
选择“Wired”,并将状态“ON”改为“OFF”。
注意,修改网络地址需要事先断开网络连接,然后单击图3-49右下角的设置图标(齿轮状),弹出如图3-50所示的界面。
图3-50 网络设置选择项(一)
选择“IPv4”,在弹出的对话框中“Address”右边的下拉式列表里,选择“Manual”,然后在编辑框中输入静态地址信息,如图3-51所示。这里设置的地址是192.168.1.100,子网掩码是255.255.255.0,网关地址是192.168.1.1,读者可以根据自己需要设置。设置完成后单击“Apply”按钮退出即可。
图3-51 网络设置选择项(二)
按照上述方法,将Slave0和Slave1的IP地址也改过来。例如,Slave0是192.168.1.101,Slave1是192.168.1.102,网关地址都一样。这样,我们就完成了整个集群的网络配置。读者可以输入“ping”命令来测试计算机之间的连通性。
然而,为了用计算机名进行网络访问,我们还需要修改hosts文件中的主机名与IP地址对照列表。注意,仍然需要在Root用户下进行操作。输入“gedit /etc/hosts”,如图3-52所示。
图3-52 修改hosts文件
输入如下代码(注意,保留文件中已有代码,在后面添加新代码):
192.168.1.100 master 192.168.1.101 slave0 192.168.1.102 slave1
上述代码是一个主机地址与主机名的对照列表,用于主机名称与IP地址之间的解析。读者可以根据自己的具体设置情况编写。保存退出后,我们就可以使用主机名代替其IP地址了,例如,在任意主机终端中,输入“ping master”命令即可测试连通性,如图3-53所示。
图3-53 利用主机名测试网络连通性
注意,上述修改需要在集群的所有主机上进行。
3.3.3 关闭防火墙
防火墙是一种位于计算机和它所连接的网络之间的安全功能软件,一般分为网络层防火墙(Network Level Firewall)和应用层防火墙(Application Level Firewall)两种。
网络层防火墙本质上就是IP包过滤软件,它依据一定的安全规则对IP包进行检测,允许授权数据包通过,拒绝非授权数据包通过。网络层防火墙还可以关闭不使用的端口,或者禁止特定端口的流量,以阻止来自特殊站点的访问。网络层防火墙处于操作系统的网络层,是内核的一部分,具有较高的效率和准确性。
应用层防火墙工作在TCP/IP协议堆栈的应用层上。Web访问、电子邮件和FTP文件传输所产生的数据流都属于应用层。应用层防火墙基于应用层协议对数据进行扫描和安全处理,通常会直接丢弃不安全的数据包。
Linux防火墙主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。大数据应用系统通常部署在Linux集群上,一般属于内部网络平台,且计算机之间关系十分密切,通信频繁,因此不需要启用防火墙。
下面我们来关闭集群的防火墙(请读者注意,CentOS 7关闭防火墙的操作命令已经不同于早期版本),以下的操作在Root用户下进行,而且需要在所有计算机上实施。
1. 检查系统防火墙状态
要查看系统防火墙的当前运行状态,可使用如下命令:
systemctl status firewalld.service
图3-54给出了命令的输入和执行输出。
图3-54 查看系统的防火墙状态
在图3-54中,我们可以看到计算机上的防火墙服务处于活动状态(即start firewalld),可见初次安装Linux后系统会默认启用防火墙。下面我们将防火墙关闭掉。
2. 关闭防火墙
关闭防火墙的命令是:
systemctl stop firewalld.service
该命令输入和执行后,终端不会有输出。要检查执行是否成功,可以再次使用状态检查命令,如图3-55所示。
图3-55 防火墙被关闭后的状态信息
一般在关闭防火墙之后,还可以执行下面的命令:
systemctl disable firewalld.service
该命令可在下次启动计算机时取消防火墙服务。
请读者注意,上述各项操作需要在所有虚拟机上进行,这样就可关闭集群的防火墙,从而为后面安装Hadoop并运行MapReduce程序创造条件。
3.3.4 安装JDK
由于Hadoop平台是基于Java环境的,因此我们必须安装JDK,本书选用Java SE Development Kit,即标准版JDK。
在安装JDK前我们首先讨论一下选用什么JDK版本适配的问题。本书第1版选用了JDK7,具体的压缩包是jdk-7u71-linux-x64.gz,能够与Hadoop 2.6.0很好地适配。但是,我们在写作本书第2版时,曾试图采用JDK10(压缩包是jdk-10.0.1_linux-x64_bin.tar.gz),并试图与Hadoop 3.1.0配合,但在实践中出现缺jar包的问题,导致Hadoop 3.1.0不能正常运行,如ResourceManager组件不能启动。
因此,我们改用JDK8(压缩包是jdk-8u171-linux-x64.tar.gz),它与Hadoop 3.1.0能够较好地适配,没有缺jar包的问题了。由此可见,在升级Hadoop时,并不能简单地升级JDK,而是需要找到合适的搭配关系。实际上,JDK升级是一个独立的工作,它并不会特别考虑Hadoop的需要,出现不适配问题也是很自然的。从这个示例也可以看到软件工程需要面对的挑战。
读者可以从“https://www.oracle.com/technetwork/java/javase/downloads”下载需要的JDK,也可以在本书提供的实验资源包中找到“\第03章实验资源\JDK”下的jdk-8u171-linux-x64.tar.gz压缩包。请将其复制到虚拟机的Home目录下(建议首先创建一个新文件夹,命名为Resources,以后我们需要用到的资源都可以先保存在这里),如图3-56所示。
图3-56 在home目录下创建Resources文件夹并将JDK压缩包复制进去
1. 在Root用户下安装JDK
打开终端,切换成Root用户(注意,安装JDK必须使用Root用户权限)。在usr目录下创建java子目录,即输入“mkdir /usr/java”命令,如图3-57所示。
图3-57 在usr目录下创建java子目录
然后执行“mv /home/csu/resources/jdk-8u171-linux-x64.tar.gz/usr/java”命令,将JDK压缩包移动到新建的“/usr/java”目录下,如图3-58所示。
图3-58 将JDK压缩包移动到“/usr/java”目录下
接着执行“cd/usr/java”命令进入java目录下。解压缩JDK文件,即执行“tar-zxvf jdk-8u171-linux-x64.tar.gz”命令,如图3-59所示。
图3-59 解压缩JDK文件
按下Enter键后系统开始执行解压缩命令,读者可以看到屏幕上不断滚动显示的信息。执行成功后,我们还需要配置Java环境变量。
2. 配置环境变量
退出Root用户回到csu用户,然后执行“gedit /home/csu/.bash_profile”命令,如图3-60所示。
图3-60 编辑Java环境变量
在打开的文件中,在已有代码的尾部添加如下代码(已有代码可以不动):
# User specific environment and startup programs PATH=$PATH:$HOME/.local/bin:$HOME/bin export PATH # 以下是新添加入代码: export JAVA_HOME=/usr/java/jdk1.8.0_171/ export PATH=$JAVA_HOME/bin:$PATH
在上述代码中,“/usr/java/jdk1.8.0_171/”就是刚才解压缩JDK文件时自动创建的java安装文件夹,读者可以到该文件夹中核实一下名称,要注意数字、点以及下画线不要输入错误;此外,Linux对大小写是敏感的,这一点与Windows不同。
接着,执行“source /home/csu/.bash_profile”命令,使修改生效,如图3-61所示。
图3-61 执行命令使修改生效
如果没有编辑错误,系统执行上述命令成功后没有任何返回信息,最后执行“java - version”命令来测试配置是否成功,如图3-62所示。
图3-62 测试配置是否成功
如果出现图3-62所显示的版本信息、运行时环境,说明JDK配置成功。
注意,上述安装和配置还需要在集群的其他计算机上进行。这里读者会提出一个问题,如果集群有成千上万台计算机,难道也要这样一台一台地去安装和配置吗?当然不需要这样重复安装。只要先安装好一台计算机,其他的计算机可以复制。
3.3.5 免密钥登录配置
大数据集群中的计算机之间需要频繁通信,但是Linux系统在相互通信中需要进行用户身份认证,也就是输入登录密码。在集群规模不大的情况下,在每次登录时输入密码认证,所需要的操作时间尚且不多。但是,如果集群有几十台、上百台甚至上千台计算机,频繁的认证操作会大大降低工作效率,这也是不切实际的,因此,实际中的集群都需要进行免密钥登录配置。
免密钥登录是指两台计算机之间使用SSH连接时不需要用户名和密码。SSH(Secure Shell Protocol,安全外壳协议)是一种在不安全网络上提供安全远程登录及其他安全网络服务的协议。在默认状态下,SSH连接是需要密码认证的,但是可以通过修改系统认证,使系统通信免除密码输入和SSH认证。
下面的配置分为在Master节点的操作和在所有Slave节点上的操作,同时要注意,这里使用的是普通账户(本书是csu),所以如果目前处于Root用户,则需要切换回普通用户状态(输入exit命令可退出Root用户)。
1. Master节点的配置
(1)在终端生成密钥,命令是“ssh-keygen -tr sa”,如图3-63所示。
图3-63 在终端生成密钥的命令
按下Enter键后系统会出现一系列提示,这时候只要按Enter键即可。
“ssh-keygen”是用来生成private和public密钥对的命令,将public密钥复制到远程计算机后,就可以使SSH到另外一台计算机的登录(不用密码登录)。“ssh-keygen”通过参数-t指定加密算法,这里的参数rsa表示采用RSA加密算法。RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解这种数学难题,是应用最广泛的非对称加密算法之一。
生成的密钥在.ssh目录下,切换到该目录后可以通过“ls -l”命令查看,如图3-64所示。
图3-64 查看生成的密钥文件
(2)需要将公钥文件改名后复制到“/.ssh/”目录下,如图3-65所示。
图3-65 复制公钥文件
复制的目的是为了便于修改该文件的权限,请使用“chmod 600 ~/.ssh/authorized_keys”命令进行修改,如图3-66所示。
图3-66 修改公钥文件的权限
修改权限后的文件列表如图3-67所示。
图3-67 修改权限后的文件列表
(3)将authorized_keys复制到所有的Slave,这里需要分别复制到Slave0和Slave1,命令是“scp ~/.ssh/authorized_keys csu@slave0:~/”和命令“scp ~/.ssh/authorized_keys csu@slave1:~/”,如图3-68所示。
图3-68 将authorized_keys文件复制到Slave1
如果出现如图3-68所示的提示,输入“yes”后回车,然后输入密码(这里是csucsu)。至此,就完成了在Master上的配置。
2. Slave的配置
完成Master的配置后,需要转到Slave上进行配置。
(1)使用“ssh-keygen”命令生成密钥,如图3-69所示,一路按Enter键即可。
图3-69 在Slave0节点生成密钥
(2)将authorized_keys(注意,这个文件是从Master复制过来的)文件移动到“/.ssh/”目录下,采用的命令是“mv authorized_keys ~/.ssh”如图3-70所示。
图3-70 移动authorized_keys文件到“/.ssh/”目录下
(3)修改authorized_keys文件的权限。先使用“cd”命令切换到“/.ssh/”目录,再输入命令“chmod 600 authorized_keys”修改authorized_keys文件的权限,如图3-71所示。
图3-71 修改authorized_keys文件的权限
上述配置也需要在Slave1(如果安装了)上做一遍。
至此,免登录密钥的配置就完成了。
下面来验证一下配置是否有效。在Master上执行“ssh slave0”命令来登录Slave0,如果登录成功,并且无须输入登录密码,证明配置完成,如图3-72所示。
图3-72 验证免密钥登录的配置
从图3-72可以看出,Master可通过“ssh”命令登录到Slave0,因此可以在Master上的终端操作Slave0,这样就不用到Slave0进行操作,可节省工作时间。
要退出远程计算机回到本地计算机,只要输入“exit”命令即可。