1. 安装并配置虚拟机
这里基于VmWare来去构建三台虚拟机
我已经有了一台模板虚拟机,所以基于该模板虚拟机进行完整克隆得到三台机器,分别是hadoop1、hadoop2、hadoop3
-
修改主机名称
# hadoop1的主机名称修改为hadoop1,以此类推 vim /etc/hostname
-
修改静态IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no # 从DHCP动态分配IP修改为static静态IP BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=92e7a2e8-e78a-4f67-a5ed-7763b6e3d56a DEVICE=ens33 # 开启 ONBOOT=yes # 设置要修改的IP地址,三台机器的IP地址要互不相同 # 我这里配置的是hadoop1:192.168.75.111、hadoop2:192.168.75.112、hadoop3:192.168.75.113 IPADDR=192.168.75.112 # 参考VmWare的vm-net8的虚拟网络配置 NETMASK=255.255.255.0 # 参考VmWare的vm-net8的虚拟网络配置 GATEWAY=192.168.75.2 # 公网的域名解析地址,默认写成这样就行 DNS1=8.8.8.8
# 修改之后重启网络 systemctl restart network
验证是否修改成功:
# 查看IP地址 ip addr
-
修改hosts文件
vim /etc/hosts
将三台主机的IP地址添加到文件末尾
192.168.75.111 hadoop1 192.168.75.112 hadoop2 192.168.75.113 hadoop3
-
创建用户,并授予root权限
# 新增用户 useradd hadoop # 设置密码 passwd hadoop # 授予root权限 vim /etc/sudoers # 在文件末尾添加如下内容 hadoop ALL=(ALL) NOPASSWD:ALL
注意:后续的步骤都使用hadoop用户进行操作
2. 安装JDK
安装JDK8,具体的步骤这里就不赘述了,我这里已经提前安装好了JDK8
可以参考我的这篇文章,里面有讲述如何安装JDK:https://blog.csdn.net/weixin_66400215/article/details/145066470
3. Hadoop集群搭建
3.1 设置三台机器SSH免密登录
下面以hadoop1
机器为例子,其余两台机器也要执行类似的操作
-
生成公钥和私钥
ssh-keygen -t rsa
-
将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop1 ssh-copy-id hadoop2 ssh-copy-id hadoop3
3.2 配置文件同步脚本
由于后续的搭建过程中往往涉及到很多文件的拷贝,并且要求三台集群的文件保持一致,这里使用文件同步脚本可以极大提高我们的开发效率。
首先,需要明白一点的是我们的PATH环境变量,默认是包含我们的用户家目录下的bin目录的,如下图所示
所以,我们可以将文件同步脚本放置到/home/hadoop/bin
目录下
# 默认bin目录是不存在的,需要创建一下
mkdir -p /home/hadoop/bin
# 创建xsync脚本
vim /home/hadoop/bin/xsync
# 创建可执行权限
chmod +x /home/hadoop/bin/xsync
脚本的使用方式就是:xync 文件或者目录
脚本的内容如下:
#!/bin/bash#1. 判断参数个数
if [ $# -lt 1 ]
thenecho Not Enough Arguement!exit;
fi#2. 遍历集群所有机器,如果你的机器host不是这样命名的,可以进行修改
for host in hadoop1 hadoop2 hadoop3
doecho ==================== $host ====================#3. 遍历所有目录,挨个发送for file in $@do#4. 判断文件是否存在if [ -e $file ]then#5. 获取父目录pdir=$(cd -P $(dirname $file); pwd)#6. 获取当前文件的名称fname=$(basename $file)ssh $host "mkdir -p $pdir"rsync -av $pdir/$fname $host:$pdirelseecho $file does not exists!fidone
done
接着,我们可以将xsync脚本从hadoop1节点分发到hadoop2和hadoop3,如图所示:
如果在执行过程中报错:rsync: command not found,可以执行如下命令,进行安装:
sudo yum install -y rsync
3.3 安装Hadoop
本次集群的搭建目标:
hadoop1 | hadoop2 | hadoop3 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
这里安装的Hadoop的3.1.3版本,下载链接:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
我这里是下载到了/home/hadoop/hadoop-3.1.3.tar.gz
目录下
-
解压缩
tar -zxvf hadoop-3.1.3.tar.gz
-
修改
etc/hadoop/hadoop-env.sh
,配置环境变量# 在文件开头部分新增如下配置 # JDK安装路径 export JAVA_HOME=/usr/local/jdk1.8.0_431 # Hadoop安装路径 export HADOOP_HOME=/home/hadoop/hadoop-3.1.3 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HADOOP_LOG_DIR=$HADOOP_HOME/logs
-
修改
/etc/hadoop/core-site.xml
配置文件<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- 指定NameNode的地址 --><property><name>fs.defaultFS</name><value>hdfs://hadoop1:8020</value></property><!-- 指定hadoop数据的存储目录 --><property><name>hadoop.tmp.dir</name><value>/home/hadoop/hadoop-3.1.3/data</value></property><!-- 配置HDFS网页登录使用的静态用户为hadoop --><property><name>hadoop.http.staticuser.user</name><value>hadoop</value></property> </configuration>
-
修改
/etc/hadoop/hdfs-site.xml
配置文件<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- nn web端访问地址--><property><name>dfs.namenode.http-address</name><value>hadoop1:9870</value></property><!-- 2nn web端访问地址--><property><name>dfs.namenode.secondary.http-address</name><value>hadoop3:9868</value></property> </configuration>
-
修改
/etc/hadoop/yarn-site.xml
配置文件<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- 指定MR走shuffle --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 指定ResourceManager的地址--><property><name>yarn.resourcemanager.hostname</name><value>hadoop2</value></property><!-- 环境变量的继承 --><property><name>yarn.nodemanager.env-whitelist</name><value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value></property> </configuration>
-
修改
/etc/hadoop/mapred-site.xml
配置文件<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- 指定MapReduce程序运行在Yarn上 --><property><name>mapreduce.framework.name</name><value>yarn</value></property> </configuration>
-
配置workers
vim /home/hadoop/hadoop-3.1.3/etc/hadoop/workers # 添加如下内容 hadoop1 hadoop2 hadoop3
-
将Hadoop从hadoop1分发到hadoop2、hadoop3
xsync hadoop-3.1.3/
3.4 启动集群
-
初始化集群:如果集群是第一次启动,需要在hadoop1节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)
# 在hadoop1上执行 hdfs namenode -format
-
启动HDFS
# 在hadoop1上执行 sbin/start-dfs.sh
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2a71d8ea606c48de9a1163a30c6a5ac1.png)
-
启动YARN
# 在hadoop2上执行 sbin/start-yarn.sh
-
Web端查看HDFS的NameNode(注意:防火墙记得关闭)
浏览器中输入:http://192.168.75.111:9870,查看HDFS上存储的数据信息
-
Web端查看YARN的ResourceManager(注意:防火墙记得关闭)
浏览器中输入:http://192.168.75.112:8088,查看YARN上运行的Job信息
至此,就完成了集群的搭建
3.5 启动和停止集群脚本
为了方便停止和启动集群,这里编写了/home/hadoop/my_hadoop.sh脚本,便于一键启动/停止hadoop集群:
#!/bin/bashif [ $# -lt 1 ]
thenecho "No Args Input..."exit ;
ficase $1 in
"start")echo " =================== 启动 hadoop集群 ==================="echo " --------------- 启动 hdfs ---------------"ssh hadoop1 "/home/hadoop/hadoop-3.1.3/sbin/start-dfs.sh"echo " --------------- 启动 yarn ---------------"ssh hadoop2 "/home/hadoop/hadoop-3.1.3/sbin/start-yarn.sh"
;;
"stop")echo " =================== 关闭 hadoop集群 ==================="echo " --------------- 关闭 yarn ---------------"ssh hadoop2 "/home/hadoop/hadoop-3.1.3/sbin/stop-yarn.sh"echo " --------------- 关闭 hdfs ---------------"ssh hadoop1 "/home/hadoop/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)echo "Input Args Error..."
;;
esac
使用方式:
# 启动集群
bash my_hadoop.sh start
# 停止集群
bash my_hadoop.sh stop