完全分布式是指在多台计算机上运行分布式系统的配置方式.
在完全分布式环境中,Hadoop的各个组件(如HDFS、YARN和MapReduce)分别运行在不同的节点上,彼此之间通过网络进行通信和协作.
因此本次进行完全分布式部署, 选择三台虚拟机来示范.
NameNode | DataNode | SecondaryNameNode | |
master | √ | √ | |
slave01 | √ | √ | |
slave02 | √ |
|
选择之前的伪分布式部署的虚拟机为 master 节点, 而另外 slave01 节点, slave02 节点可以选择克隆自 master 节点.
下面开始进行部署:
为了区分各个节点, 需要在 /etc/hostname 中修改主机的名称.
使用 sudo vim /etc/hostname 命令修改原虚拟机的名称为: master.
对另外的两个节点也进行修改,分别为: slave01, slave02.
接着进行网络互通的配置.
使用 ifconfig 命令分别查看三台节点的 ip 地址.
在 master 节点上执行 sudo vim /etc/hosts 命令,将三台节点的 IP 地址和主机名进行映射.
在另外的两个节点也进行同样的操作.
执行以下指令测试主机(或节点)之间的网络连通性.
ping master -c 2
ping slave01 -c 2
ping slave02 -c 2
ping指令是一个网络工具,用于测试主机之间的连接和网络延迟. 它通过发送ICMP(Internet Control Message Protocol)数据包到目标主机,并等待目标主机返回响应,来测试网络连接的质量和稳定性.
ping指令通常用于以下几个方面:
1. 测试主机之间的连接:通过向目标主机发送ICMP数据包,可以确定主机之间是否能够正常通信.
2. 测试网络延迟:ping指令可以测量从发送数据包到接收响应所需的时间,从而评估网络的延迟情况.
3. 检测丢包率:通过检查发送的数据包和接收的响应之间的差异,可以确定网络中是否存在丢包的情况.ping指令在Windows、Linux和macOS等操作系统中都有相应的实现,其基本语法为:
ping [选项] 目标主机
常用的选项包括:
-c:指定发送数据包的次数
-i:设置发送数据包的时间间隔
-s:指定发送数据包的大小
-t:持续发送数据包直到手动停止通过ping指令,可以快速了解网络连接的状况,及时发现网络故障,并进行相应的排查和修复.
输出内容如下:
为了实现节点之间的远程访问和管理,需要使用 SSH(Secure Shell)协议进行安全的远程连接.
SSH(Secure Shell)是一种网络协议,用于在不安全的网络中安全地传输数据. SSH协议提供了加密和身份验证功能,使得用户可以在不安全的网络环境下安全地远程登录到远程主机进行管理或操作.
SSH使用公钥加密技术进行身份验证. 在使用SSH进行远程登录时,传统的身份验证方式是需要用户输入用户名和密码. 但是,这种方式存在一些安全隐患,因为密码可能会被窃取或猜测. 为了解决这个问题,SSH使用公钥加密技术进行身份验证,即用户在本地生成一对密钥,一把是公钥,一把是私钥. 用户将公钥复制到远程主机上,然后在登录时,远程主机会向用户发送一段随机字符串,用户使用自己的私钥对这个字符串进行加密,然后将加密后的字符串发送回远程主机,远程主机使用用户的公钥对加密后的字符串进行解密,如果解密成功,则认为用户身份验证通过.
在使用SSH进行身份验证时,需要将用户的公钥复制到远程主机上. 这个过程可以使用ssh-keygen -t rsa 命令生成密钥对,其中-t参数指定生成密钥的类型为RSA. 生成密钥对之后,可以使用 ssh-copy-id 命令将公钥文件 id_rsa.pub 的内容复制到远程主机的 authorized_keys 文件中. 这个 authorized_keys 文件通常存储在用户的家目录下的.ssh目录中,用于存储允许访问该用户账户的公钥,以实现无密码登录. 这样,在使用SSH进行远程登录时,就可以使用密钥进行身份验证,而不需要输入密码.
SSH提供了一种更安全、更方便的远程登录方式,可以有效防止密码被窃取或猜测.
SSH远程登录需要通过SSH客户端与远程主机上的SSH服务器来进行通信.
1. SSH客户端:SSH客户端是安装在本地计算机上的软件,它用于发起与SSH服务器的连接,并在连接建立后,允许用户输入用户名和密码(或使用SSH密钥)进行身份验证,然后执行远程命令或登录到远程主机。
2. SSH服务器:SSH服务器是安装在远程主机上的软件,它负责监听SSH连接请求,并在用户身份验证通过后,提供远程登录和命令执行的功能。
因此需要用到OpenSSH软件套件中的 openssh-server 和 openssh-client.
但在Ubuntu系统中默认带有openssh-client.
我们只需在终端中使用 sudo apt install openssh-server 安装SSH服务端.
然后在执行以下指令:
ssh-keygen -t rsa
ssh-copy-id master
ssh-copy-id slave01
ssh-copy-id slave02
对 slave01 节点, slave02 节点也进行同样操作.
由此一来三个节点之间可以相互免密登入了.
接下来需要对 Hadoop 的配置文件进行配置.
需要进行配置的文件如下:
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9820</value>
<!--指定Hadoop集群中HDFS的名称节点的地址和端口号-->
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-3.3.6/tmp</value>
<!--指定Hadoop的临时目录(Temporary Directory)的基本路径-->
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
<!--指定文件在HDFS中的副本数-->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop-3.3.6/tmp/dfs/name</value>
<!--指定HDFS名称节点的存储目录-->
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop-3.3.6/tmp/dfs/data</value>
<!--指定HDFS数据节点的存储目录-->
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave01:9868</value>
<!--指定HDFS名称节点的辅助HTTP地址-->
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>master:9870</value>
<!--指定HDFS名称节点的HTTP地址-->
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<!-- 设置MapReduce框架的名称为YARN -->
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.6</value>
<!-- 设置MapReduce应用程序的ApplicationMaster环境变量 -->
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.6</value>
<!-- 设置Map任务的环境变量 -->
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.6</value>
<!-- 设置Reduce任务的环境变量 -->
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
<!-- 设置YARN资源管理器的主机名为master -->
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<!-- 设置YARN节点管理器的辅助服务为mapreduce_shuffle -->
</property>
</configuration>
在 master 节点将上述的文件配置完成后,还需在 hadoop-env.sh 文件中显性指定 JAVA_HOME 环境变量的路径.
在当前目录下执行: sudo vim workers 指令后先将原文件中的 localhost 删除.
然后再写入以下内容:
master
slave01
slave02
workers文件用于指定作为 datanode 的节点名称
这样在 master 节点上的 Hadoop 工作就部署完成.
对于 slave01, slave02 节点上的 Hadoop 工作部署也如此.
但只需在 master 节点上使用 scp 进行远程拷贝给这两个节点.
在这之前还需删掉 ${HADOOP_HOME} 目录下的 tmp/ 和 logs/ 目录.
因为 master 节点此前已经进行过伪分布式部署,所以删掉这两个目录避免后续操作出现错误.
由于 slave01, slave02 是由 master 克隆而来, 已经存在 hadoop 目录, 所以要将其删掉.
在 master 节点上执行以下指令,将 /usr/local/hadoop-3.3.6/ 目录远程拷贝到 slave01 的 /home/hadoop/ 目录下:
scp -r /usr/local/hadoop-3.3.6/ slave01:/home/hadoop/
SCP(Secure Copy Protocol)是一种用于在计算机之间安全地传输文件的协议,同时也是一个基于SSH(Secure Shell)协议的命令行工具. SCP命令的基本语法为:
scp [选项] [源文件] [目标文件]
其中,常用选项包括:
-r:递归复制整个目录
-P:指定远程主机的端口号
-p:保持文件的原始属性
-q:安静模式,不显示进度信息
-v:显示详细的调试信息源文件和目标文件可以是本地文件路径或者远程主机上的文件路径. 远程主机上的文件路径格式为 [user@]host:[path],其中user是远程主机的用户名,如果未指定用户名,则使用当前登录用户的用户名. host是远程主机的地址或主机名,path是文件在远程主机上的路径.
因为 scp 远程传输的 slave01 节点的用户是 hadoop 无法将 hadoop-3.3.6 目录直接拷贝在 slave01 的 /usr/local/ 下, 只能先拷贝在 slave01 节点的 hadoop 用户目录下.
然后进行以下操作:
对于 master02 节点也是同样的操作.
在 master 节点上执行 hdfs dfs namenode -format 进行 NameNode 格式化.
然后再执行以下指令 :
start-dfs.sh
start-yarn.sh
mapred --daemon start historyserver
start-dfs.sh
用于启动Hadoop分布式文件系统(HDFS)的各个组件,包括NameNode、DataNode和SecondaryNameNode等.
start-yarn.sh
用于启动YARN资源管理器(ResourceManager)和节点管理器(NodeManager),以便在Hadoop集群中管理资源和执行作业.
mapred --daemon start historyserver
用于启动MapReduce历史服务器(JobHistoryServer),它用于存储和提供MapReduce作业的历史信息和日志.
使用 jps 查看三个节点的进程如下:
以下是我遇到的一些错误以及解决方法的建议:
在使用 start-dfs.sh 启动后,可以使用 jps 命令来查看进程信息. 如果发现有进程缺失,可以尝试重新格式化。具体的解决方法和伪分布式环境中相同,但需要注意的是,需要删除所有节点上的 tmp/ 和 logs/ 目录.
在使用 start-yarn.sh 启动后,如果使用 jps 命令没有看到相应的进程输出,首先应该检查配置文件. 如果配置文件没有问题,那么可能是由于 JDK 版本的问题导致的.
在使用 mapred --daemon start historyserver 启动历史服务器时,相对来说不会受到 JDK 版本的影响. 只需确保配置文件中的内容是正确的即可.
在重新执行以上指令之前,需要先使用 pkill java -f 命令结束之前的进程. 如果之前的进程没有关闭,可能会导致端口占用或其他冲突,从而导致新的进程无法正常启动.
接下来, 进行完全分布式测试.
本次测试的内容如下:
hdfs dfs -mkdir -p /user/hadoop
#在HDFS中创建名为 hadoop 的用户目录,-p选项表示如果父目录不存在则创建父目录
hdfs dfs -mkdir input
#在用户目录下创建 input 目录
hdfs -put ${HADOOP_HOME}/etc/hadoop/*.xml input
#将Hadoop安装目录下的 etc/hadoop 目录中的所有xml文件上传到HDFS的 input 目录中
hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
#运行hadoop自带的grep示例程序,从input目录中查找匹配正则表达式'dfs[a-z.]+'的内容,并将结果输出到output目录中
执行以上指令之后, 在Web界面中查看执行的最终结果.