在真实的企业环境中,服务器集群会使用到多台机器,共同配合,来构建一个完整的分布式文件系统。而在这样的分布式文件系统中,HDFS相关的守护进程也会分布在不同的机器上,例如:
- NameNode守护进程,尽可能的单独部署在一台硬件性能较好的机器中。
- 其他的每台机器上都会部署一个DataNode守护进程,一般的硬件环境即可。
- SecondaryNameNode守护进程最好不要和NameNode在同一台机器上。
平台软件说明
平台&软件 | 说明 |
---|---|
宿主机操作系统 | Windows / MacOS |
虚拟机操作系统 | CentOS 7 |
虚拟机软件 | Windows: VMWare MacOS: Parallels Desktop |
虚拟机 | 主机名: qianfeng01, IP地址: 192.168.10.101 主机名: qianfeng02, IP地址: 192.168.10.102 主机名: qianfeng03, IP地址: 192.168.10.103 |
SSH工具 | Windows: MobaXterm / FinalShell MacOS: FinalShell / iTerm2 |
软件包上传路径 | /root/softwares |
软件安装路径 | /usr/local |
JDK | X64: jdk-8u321-linux-x64.tar.gz ARM: jdk-8u321-linux-aarch64.tar.gz |
Hadoop | X64: hadoop-3.3.1.tar.gz ARM: hadoop-3.3.1-aarch64.tar.gz |
用户 | root |
守护进程布局
NameNode | DataNode | SecondaryNameNode | |
---|---|---|---|
qianfeng01 | √ | √ | |
qianfeng02 | √ | √ | |
qianfeng03 | √ |
集群搭建准备
-
总纲
1. 三台机器的防火墙必须是关闭的. 2. 确保三台机器的网络配置畅通(NAT模式,静态IP,主机名的配置) 3. 确保/etc/hosts文件配置了ip和hostname的映射关系 4. 确保配置了三台机器的免密登陆认证(克隆会更加方便) 5. 确保所有机器时间同步 6. jdk和hadoop的环境变量配置
复制代码 -
防火墙关闭
[root@qianfeng01 ~]# systemctl stop firewalld [root@qianfeng01 ~]# systemctl disable firewalld [root@qianfeng01 ~]# systemctl stop NetworkManager [root@qianfeng01 ~]# systemctl disable NetworkManager #最好也把selinux关闭掉,这是linux系统的一个安全机制,进入文件中将SELINUX设置为disabled [root@qianfeng01 ~]# vi /etc/selinux/config ......... SELINUX=disabled .........
复制代码 -
主机映射
[root@qianfeng01 ~]# vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.101 qianfeng01 #添加本机的静态IP和本机的主机名之间的映射关系 192.168.10.102 qianfeng02 192.168.10.103 qianfeng03
复制代码 -
免密登录
# 1. 使用rsa加密技术,生成公钥和私钥。一路回车即可 [root@qianfeng01 ~]# ssh-keygen -t rsa # 2. 使用ssh-copy-id命令 [root@qianfeng01 .ssh]# ssh-copy-id root@qianfeng01 [root@qianfeng01 .ssh]# ssh-copy-id root@qianfeng02 [root@qianfeng01 .ssh]# ssh-copy-id root@qianfeng03 # 3. 进行验证 [hadoop@qianfeng01 .ssh]# ssh qianfeng01 [hadoop@qianfeng01 .ssh]# ssh qianfeng02 [hadoop@qianfeng01 .ssh]# ssh qianfeng03 # 4. 继续在qianfeng02和qianfeng03生成公钥和私钥,给三台节点拷贝。
复制代码 -
时间同步
# 三台节点都要执行的命令 ntpdate ntp.aliyun.com
复制代码 -
安装JDK和配置环境变量
图文管理系统
配置文件
-
core-site.xml
<configuration> <!-- 设置namenode节点 --> <!-- 注意: hadoop1.x时代默认端口9000 hadoop2.x时代默认端口8020 hadoop3.x时代默认端口 9820 --> <property> <name>fs.defaultFS</name> <value>hdfs://qianfeng01:9820</value> </property> <!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop-3.3.1/tmp</value> </property> </configuration>
复制代码 -
hdfs-site.xml
<configuration> <!-- 块的副本数量 --> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- secondarynamenode守护进程的http地址:主机名和端口号。参考守护进程布局 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>qianfeng02:9868</value> </property> <!-- namenode守护进程的http地址:主机名和端口号。参考守护进程布局 --> <property> <name>dfs.namenode.http-address</name> <value>qianfeng01:9870</value> </property> </configuration>
复制代码 -
hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_321 # Hadoop3中,需要添加如下配置,设置启动集群角色的用户是谁 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
复制代码 -
works
qianfeng01 qianfeng02 qianfeng03
复制代码 -
分发
# 我们已经完成了一个节点的环境配置,其他的节点也需要保持完全相同的配置。我们只需要将qianfeng01节点的配置拷贝到其他的节点即可。 # 分发之前,先检查自己的节点数据文件是否存在 # 如果之间格式化过集群,那么会在core-site.xml中配置的hadoop.tmp.dir路径下生成文件,先将其删除 [root@qianfeng01 ~]# stop-dfs.sh [root@qianfeng01 ~]# rm -rf $HADOOP_HOME/tmp
复制代码[root@qianfeng01 ~]# cd /usr/local [root@qianfeng01 local]# scp -r jdk1.8.0_321/ qianfeng02:$PWD [root@qianfeng01 local]# scp -r jdk1.8.0_321/ qianfeng03:$PWD [root@qianfeng01 local]# scp -r hadoop-3.3.1/ qianfeng02:$PWD [root@qianfeng01 local]# scp -r hadoop-3.3.1/ qianfeng03:$PWD [root@qianfeng01 local]# scp file/profile qianfeng02:/etc/ [root@qianfeng01 local]# scp file/profile qianfeng02:/etc/
复制代码
文章底部扫码,免费领取大数据资料大礼包!
格式化集群
hdfs namenode -format
复制代码
启动集群
start-dfs.sh # 启动HDFS所有进程(NameNode、SecondaryNameNode、DataNode)
stop-dfs.sh # 停止HDFS所有进程(NameNode、SecondaryNameNode、DataNode)
hadoop-daemon.sh start namenode # 只开启NameNode
hadoop-daemon.sh start secondarynamenode # 只开启SecondaryNameNode
hadoop-daemon.sh start datanode # 只开启DataNode
hadoop-daemon.sh stop namenode # 只关闭NameNode
hadoop-daemon.sh stop secondarynamenode # 只关闭SecondaryNameNode
hadoop-daemon.sh stop datanode # 只关闭DataNode
复制代码
进程查看
# qianfeng01节点
[root@qianfeng01 hadoop]# jps
13442 NameNode
13618 DataNode
13868 Jps
# qianfeng02节点
[root@qianfeng02 ~]# jps
10514 SecondaryNameNode
10548 Jps
10405 DataNode
# qianfeng03节点
[root@qianfeng03 ~]# jps
10931 DataNode
11001 Jps
复制代码
文章底部扫码,免费领取大数据资料大礼包!
启动日志查看
HDFS的角色有三个: NameNode、SecondaryNameNode、DataNode,启动的时候也会有对应的日志文件生成。如果在启动脚本执行之后,发现对应的角色没有启动起来,那就可以去查看日志文件,检查错误的详情,解决问题。
-
日志的位置: $HADOOP_HOME/logs
-
日志的命名: hadoop-username-daemon-host.log
例如:
- hadoop-root-namenode-qianfeng01.log => qianfeng01节点上的namenode的日志
- hadoop-root-datanode-qianfeng02.log => qianfeng02节点上的datanode的日志
集群常见问题
-
格式化集群时,报错原因
- 当前用户使用不当
- /etc/hosts里的映射关系填写错误
- 免密登录认证异常
- jdk环境变量配置错误
- 防火墙没有关闭
-
namenode进程没有启动的原因:
- 当前用户使用不当
- 重新格式化时,忘记删除${hadoop.tmp.dir}目录下的内容
- 网络震荡,造成edit日志文件的事务ID序号不连续
-
datanode出现问题的原因
- /etc/hosts里的映射关系填写错误
- 免密登录异常
- 重新格式化时,忘记删除${hadoop.tmp.dir}目录下的内容,造成datanode的唯一标识符不在新集群中。
-
上述问题暴力解决: 重新格式化
如果想重新格式化,那么需要先删除每台机器上的${hadoop.tmp.dir}指定路径下的所有内容,然后再格式化:最好也把logs目录下的内容也清空,因为日志内容已经是前一个废弃集群的日志信息了,留着也无用。
案例演示
-
数据准备
[root@qianfeng01 ~]# mkdir input && cd input [root@qianfeng01 input]# echo "hello world hadoop linux hadoop" >> file1 [root@qianfeng01 input]# echo "hadoop linux hadoop linux hello" >> file1 [root@qianfeng01 input]# echo "hadoop linux mysql linux hadop" >> file1 [root@qianfeng01 input]# echo "hadoop linux hadoop linux hello" >> file1 [root@qianfeng01 input]# echo "linux hadoop good programmer" >> file2 [root@qianfeng01 input]# echo "good programmer qianfeng good" >> file2
复制代码 -
上传到集群
# 将数据上传到HDFS [root@qianfeng01 input]# hdfs dfs -put ~/input/ / # 检查是否已经上传成功 [root@qianfeng01 input]# hdfs dfs -ls -R / drwxr-xr-x - root supergroup 0 2022-01-28 13:11 /input -rw-r--r-- 1 root supergroup 31 2022-01-28 13:11 /input/file -rw-r--r-- 1 root supergroup 127 2022-01-28 13:11 /input/file1 -rw-r--r-- 1 root supergroup 59 2022-01-28 13:11 /input/file2
复制代码 -
执行任务
[root@qianfeng01 input]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output
复制代码 -
查看结果
[root@qianfeng01 input]# hdfs dfs -cat /output/* good 3 hadoop 9 hadop 2 hello 3 linux 10 mysql 2 programmer 2 qianfeng 1 world 1
也可以看视频:
千锋教育大数据全套视频教程800集完整版(学完可就业/入门到精通)