说明:此模式是在伪分布模式的基础上搭建,hadoop的主目录为/opt/software/hadoop-2.6.5(),所有的操作都是在root用户执行的。也没有做ssh安装、Java JDK、Hadoop的解压安装的步骤,详情请查看前面的博客。
开源大数据Hadoop伪分布式搭建及虚拟机的创建
一、分布式集群的网络和节点规划
⑴网络规划
主机名 | IP地址 | 节点类型 |
hadoop100 | 192.168.36.128 | master |
hadoop101 | 192.168.36.129 | slave1 |
hadoop102 | 192.168.36.130 | slave2 |
⑵ 节点规划
服务 | hadoop100 | hadoop101 | hadoop102 |
NameNode | ✔ | ||
Secondary NameNode | |||
DataNode | ✔ | ✔ | ✔ |
ResourceManager | ✔ | ||
NodeManager | ✔ | ✔ | ✔ |
二 、分布式集群的环境准备
⑴克隆虚拟机
在进行克隆前我们需要先关闭hadoop的全部进程,然后删除之前实验中产生的文件。
stop-all.sh
rm -rf hdfs/ logs/ tmp/ input/ output/
在伪分布模式的基础上,前面已经将创建好用户、安装ssh服务、安装配置Java环境等,所以把hadoop100作为Master节点,克隆两台虚拟机作为slave节点(分别是hadoop101、hadoop102)。
关闭hadoop100虚拟机进行虚拟机完整克隆,克隆出hadoop101与hadoop102.(右键hadoop100虚拟机——管理——克隆——当前状态——创建完整克隆——给定对应虚拟机名称与存储位置)
操作过程如下:
需要在关闭虚拟机的情况下去克隆。
完整克隆和链接克隆的区别在于,链接克隆,如果母机宕机,克隆后的虚拟机也不可用。
⑵网络配置、修改主机名、配置网络映射
①配置IP
根据集群网络IP规划,分别将IP,主机名,网络映射配置好。
IP地址 | 主机名 |
192.168.36.128 | master |
192.168.36.129 | slave1 |
192.168.36.130 | slave2 |
然后根据你规划好的IP地址去修改克隆虚拟机的IP
输入命令:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
将hadoop101和hadoop102分别修改为192.168.36.129和192.168.36.130
然后分别重启网络后查看
service network restart #重启网络
ifconfig
②配置主机名
(三台虚拟机都需要执行)分别修改虚拟机的主机名称为hadoop100、hadoop101与hadoop102
有两种方法修改:
方法一
hostnamectl set-hostname 当前主机名称
例如:hostnamectl set-hostname hadoop101
hostnamectl set-hostname hadoop102
方法二
vi /etc/hostname
将名字修改即可
③配置网络映射
配置网络映射 /etc/hosts
vim /etc/hosts
在文件最后添加 ip地址 主机名(每一台虚拟机上都要配置,如下三行都要添加)
192.168.36.128 hadoop100
192.168.36.129 hadoop101
192.168.36.130 hadoop102
最后需要我们重启网络
service network restart
然后三台虚拟机可以测试一下网络是否正常
输入命令:ping www.baidu.com 然后Ctrl+c可以停止测试
⑶关闭防火墙
(克隆前已经关闭,则克隆后也已经关闭,所以不需要重复)
查看防火墙状态:systemctl status firewalld.service
原因:下面需要把宿主机上Linux的安装包(jdk和hadoop)传到虚拟机,不关防火墙无法传入
关闭防火墙(stop)
systemctl stop firewalld.service(关闭防火墙)
systemctl disable firewalld.service(禁用防火墙)
systemctl status firewalld.service(查看防火墙)
⑷进行集群间的免密登录
目的:通过ssh 免密码登录到hadoop101和hadoop102机器
如果原来已经设置过免密登录的,那么克隆后也不需要重复操作,此步骤可跳过▲到▲间的操作
可以查看是否设置:
ssh hadoop101
ssh localhost
不需要输入密码,即已设置完成
▲如果原需要输入密码,则进行免密设置:
首先创建密钥对,产生公钥与私钥对
ssh-keygen -t rsa
注意:执行这个命令以后,需要连续按 3次回车键回到 linux 命令行才表示这个操作执行 结束, 在按回车的时候不需要输入任何内容,出现下列代码,表示成功
执行以后会在~/.ssh目录下生产对应的公钥和秘钥文件
然后将本机的公钥复制到localhost中
ssh-copy-id localhost
运行
然后检验是否需要输入密码,ssh +自己的主机名称
ssh hadoop101
ssh localhost
运行
▲可以看到我们不需要再输入密码,则表示我们的免密登录设置成功
三台虚拟机都需要执行免密设置
(三台虚拟机都执行)将公钥追加到到authorized_keys文件中并赋予authorized_keys 文件600权限
//这行命令的作用是将当前用户的公钥 (id_rsa.pub) 添加到 SSH 的 authorized_keys 文件中,以便这个公钥可以被用于无密码登录该服务器。
at ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
//这行命令是将 authorized_keys 文件的权限设置为只有文件的所有者能够读写,其他人没有任何权限。这是为了确保文件的安全性,防止未经授权的用户访问或修改这个文件。
chmod 600 ~/.ssh/authorized_keys
解释:
第一行命令是将当前用户的公钥追加到 SSH 的 authorized_keys 文件中,允许通过该公钥登录。 第二行命令是设置 authorized_keys 文件的权限,确保文件只能被文件拥有者读取和修改,提升安全性。
(只在hadoop100下进行)将authoized_keys传输到其他节点的~/.ssh/目录下
为了在多台服务器之间实现无密码登录。
在 hadoop101
服务器上设置相同的公钥认证:
将本地服务器 /root/.ssh/authorized_keys 文件复制到远程服务器 hadoop101 的 /root/.ssh/ 目录中。
scp /root/.ssh/authorized_keys root@hadoop101:/root/.ssh/
在 hadoop102
服务器上设置相同的公钥认证:
将本地服务器的 /root/.ssh/authorized_keys
文件复制到远程服务器 hadoop102
的 /root/.ssh/
目录中
scp /root/.ssh/authorized_keys root@hadoop102:/root/.ssh
运行结果:
查看权限:
ls -l ~/.ssh/authorized_keys
然后就可以通过ssh 免密码登录到hadoop101和hadoop102机器了
⑸启动Hadoop集群
①在hadoop100(namenode所在节点)中进行格式化操作
注意:如果已经格式化过的话,千万千万不需要再次格式化,不然后面会报错,因为重复格式化会导致DataNode的ID发生了变化,从而与NameNode的ID不同。
(如果后面报错了,也有解决办法,不慌)
前提:在已经安装配置Hadoop集群情况下
已经做过hadoop伪分布式的就已经安装过了
安装教程在上一期博客:
Hadoop启动集群子节点后缺失DataNode节点解决方法
hdfs namenode -format
y
如果在后面的日志信息中能看到这一行,则说明namenode格式化成功
②启动集群
格式化后即可启动集群的节点,可以分别启动HDFS和YARN
start-dfs.sh
start-yarn.sh
也可以一起启动:
start-all.sh
我这里演示分别启动:
③查看各个节点的进程情况
⒈在hadoop100进行:jps
成功代码如下:
错误代码如下:
缺失DataNode文件
解决办法我单独另写一篇博客:
Hadoop启动集群子节点后缺失DataNode节点解决方法
⒉登录hadoop101查看虚拟机hadoop101:
ssh hadoop101 //登录hadoop101
jps //查看
exit //退出hadoop101
⒊登录hadoop102查看虚拟机hadoop102:
ssh hadoop102 //登录hadoop101
jps //查看
exit //退出
如上述结果即为成功。
此次配置应出现如下情况,hadoop100节点包含全部进程,hadoop101与hadoop102节点中只有DataNode与NodeManager。
⑹登录集群web页面查看集群信息
注意:根据自己配置的IP地址查看
①访问HDFS:50070
打开浏览器访问 http://此处替换为hadoop100的IP地址:50070
例如:http://192.168.92.100:50070
(我的:http://192.168.36.128:50070)
②访问YARN:8088
打开浏览器访问 http://此处替换为hadoop100的IP地址:8088
例如:http://192.168.92.100:8088
(我的:http://192.168.36.128:8088)
③关闭集群
这样我们就已经完成了完全分布式的搭建,在实验结束后我们需要关闭集群。
关闭集群命令为:stop-all.sh
三、实验练习
实验任务:在伪分布模式上进行WordCount官方案例
(WordCount官方案例是指在WordCount项目中,提供的实际应用示例或案例研究。WordCount是一个常见的数据处理任务,尤其在编程和数据分析领域。它通常涉及统计一个文本文件或字符串中每个单词出现的频率。)
(1)在本机/opt/software/hadoop-2.6.5上创建input文件,并写入任意内容。
如果没有进入路径/opt/software/hadoop-2.6.5
所以先进入hadoop-2.6.5文件夹,再创建写入任意内容的input文件
cd
cd /opt/software/hadoop-2.6.5
echo 'aaa bbb ccc aaa bbb aaa'>input
(2)将input文件上传至集群,并放置在集群的根目录/下。
首先需要先开启hadoop集群服务:start-all.sh
然后将input文件上传至集群,并放置在集群的根目录/下:hdfs dfs -put input /
这条命令是用来将本地文件系统中的文件上传到HDFS(Hadoop Distributed File System)中。
hdfs dfs:这是Hadoop提供的命令行工具,用于操作HDFS。
-put:这个选项用于将本地文件或目录上传到HDFS。
input:这是本地文件系统中要上传的文件或目录的路径。
/:这是HDFS中的目标路径,即文件上传到HDFS根目录下。
start-all.sh
hdfs dfs -put input /
(3)执行share目录下的MapReduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /input output
代码解释:
hadoop jar:这是用来运行一个JAR文件的Hadoop命令。JAR文件通常包含了要执行的程序和它的依赖。
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar:这是JAR文件的路径。这个JAR文件包含了Hadoop MapReduce的示例程序。在这个路径中,hadoop-mapreduce-examples-2.6.5.jar 是示例程序的JAR文件,2.6.5 是版本号。
wordcount:这是JAR文件中的一个示例程序的名称。在这里,它指的是一个WordCount程序,它计算文本文件中每个单词的出现次数。
input:这是输入数据在HDFS中的路径。
wordcount 程序会从这个路径读取数据。
output:这是程序运行的输出路径。在HDFS中,程序的结果会被写入到这个路径下。
这条命令的意思是:使用 Hadoop 的 MapReduce 示例 JAR 文件中的 WordCount 程序,对 HDFS 中 input
路径下的文件进行处理,并将结果写入到 HDFS 的 output
路径下。
如果没有进入路径/opt/software/hadoop-2.6.5,就会报如下错误:
如果进入了路径 /opt/software/hadoop-2.6.5就不会报错:
成功执行share目录下的MapReduce程序
⑷查看集群上的输出结果
hdfs dfs -cat /user/root/output/*
代码解释:
hdfs dfs:这是Hadoop提供的命令行工具,用于操作HDFS。
-cat:这个选项用于显示指定文件或目录的内容到标准输出(通常是终端或命令行窗口)。 /user/root/output/*:这是要显示的文件路径,其中 * 是一个通配符,表示这个路径下的所有文件。 所以,hdfs dfs -cat /user/root/output/* 这条命令的意思是:显示HDFS路径 /user/root/output/ 下所有文件的内容
这个时候会出现一个错误代码,表示没有这样的文件或目录:
说明 HDFS 中没有创建该目录,那么我们就创建一个目录,如下操作
①创建 /user/root 目录
首先需要在 HDFS 中创建 /user/root 目录:
hdfs dfs -mkdir -p /user/root
②上传输入文件到 HDFS
将本地的 input 文件上传到 HDFS:
hdfs dfs -put input /user/root/input
③验证上传的文件
检查文件是否成功上传:
hdfs dfs -ls /user/root/input
④重新运行 WordCount 任务
确认文件存在后,重新运行你的 Hadoop WordCount 任务:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /user/root/input /user/root/output
⑤查看集群上的输出结果
hdfs dfs -cat /user/root/output/*
当代运行结束后,出现上述代码,则表示成功完成WordCount官方案例,正确输出每个单词出现的频率
⑥关闭hadoop进程
别忘了关闭hadoop进程:stop-all.sh