Bootstrap

在CentOS7部署Hadoop

 在此说明本次部署hadoop版本号为3.3.4版本,jdk为1.8。将部署三台虚拟机上,规划如下图

集群部署规划
node1node2node3
HDFS

NameNode

DataNode

DataNode

SecindaryNameNode

DataNode

YARNNodeManager

ResourceManager

NodeManager

NodeManager

且node1的IP设为192.168.53.101、node2的IP设为192.168.53.102、node3的IP设为192.168.53.103

1、虚拟机配置

1.1 检查是否通网

使用ping命令检查是否通网

ping www.baidu.com

ping通会出现

如果ping不通则需要修改配置文件ifcfg-ens33

vi /etc/sysconfig/network-scripts/ifcfg-ens33

ONBOOT=no改为ONBOOT=yes

重启网络

systemctl restart network

或者重启虚拟机命令reboot

1.2 修改主机名

切换到root用户

查询主机名

[hadoop@localhost ~]$ hostname

localhost.localdomain

修改虚拟机名称为node1

[root@localhost hadoop]# hostnamectl set-hostname node1

再次查询虚拟机

[root@localhost hadoop]# hostname

node1

重新启动虚拟机reboot

1.3 设置静态IP

修改IP
先切换到root用户
[hadoop@localhost ~]$ su root
修改ifcfg-ens33文件
[hadoop@localhost ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33

配置文件中将BOOTPROTO="dhcp"修改成BOOTPROTO="static"

为了固定IP则需要添加

IPADDR=192.168.153.101

GATEWAY=192.168.153.2

DNS1=192.168.153.2

随后重新起动虚拟机

[hadoop@localhost ~]$ reboot

1.4 添加sudo执行权限

给普通用户添加sudo执行权限,且执行sudo不需要输入密码

需要修改etc目录下的sudoers文件

先给予写权限

[root@node1 etc]# chmod -v u+w /etc/sudoers

mode of ‘/etc/sudoers’ changed from 0440 (r--r-----) to 0640 (rw-r-----)

修改sudoers文件

[root@node1 etc]# sudo vi /etc/sudoers

在## Allows people in group wheel to run all commands

%wheel ALL=(ALL) ALL     之下

添加:

hadoop ALL=(ALL) NOPASSWD:ALL

撤销写的权限

[root@node1 etc]# chmod -v u-w /etc/sudoers

mode of ‘/etc/sudoers’ changed from 0640 (rw-r-----) to 0440 (r--r-----)

如果sudo命令用不了说明最小化安装中没有sudo,则需要下载sudo命令

1.5 更换镜像源

由于centos停止维护则需要更换镜像源,不然无法使用yum命令进行安装

解决方法

进入/etc/yum.repos.d文件下

[hadoop@node1 ~]$ cd /etc/yum.repos.d

[hadoop@node1 yum.repos.d]$ ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo CentOS-x86_64-kernel.repo

编辑CentOS-Base.repo文件:

将文件中内容替换如下:

[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[centosplus]
name=CentOS-$releasever - Plus
baseurl=https://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

清理缓存

yum makecache

重新生成yum缓存

yum makecache

出现这个则说明更换成功

1.6 相关工具的安装

由于是最小化安装,所以有很多工具都没有,需要自行下载

使用下面命令安装sudo

yum install sudo

安装vim

yum install vim

1.7 克隆虚拟机

关闭配置好的node1

克隆node1机器,点击 虚拟机-->管理-->克隆

选择下一步

选择虚拟机中的当前状态

选择创建完整的克隆

填写相应的虚拟机名称及存放路径

点击完成 ,成功克隆出node2虚拟机,用如上方法克隆出node3

克隆完成使用1.2中的方法进行主机名的修改分别修改成node2、node3

于此同时修改ifcfg-ens33文件中IP 

node2修改为192.168.153.102

node2修改为192.168.153.103

修改完成后重启虚拟机,虚拟机准备工作完成

1.8 免密登录

在node1、node2和node3之间添加主机映射

相当于修改hosts文件

sudo vi /etc/hosts

在文件中添加

192.168.153.101 node1

192.168.153.102 node2

192.168.153.103 node3

在node1机器上做免密登录

[root@node1 hadoop]# ssh-keygen -t rsa

点击三次回车

拷贝公钥

ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3

执行ssh-copy-id命令后,根据提示输入yes,再输入机器登录密码

在node2、node3上用同样的方法设置免密

使用ssh命令测试是否免密成功

从node1发起ssh连接到node2,此过程不需要输入密码则免密成功。使用exit退出

[hadoop@node1 ~]$ ssh node2

Last login: Tue Jul 23 21:47:28 2024 from 192.168.153.1

[hadoop@node2 ~]$ exit

logout

Connection to node2 closed.

1.9 安装rsync分发脚本

rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

安装命令:

sudo yum install rsync -y

在主目录创建bin目录,用于存放各种脚本

[hadoop@node1 ~]$ mkdir bin

进入bin下编写xsync脚本

[hadoop@node1 bin]$ vim xsync

脚本代码如下:

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi
#2. 遍历集群所有机器
for host in node1 node2 node3
do
    echo ====================  $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:$pdir
            else
                echo $file does not exists!
        fi
    done
done

给予执行权限

[hadoop@node1 bin]$ chmod +x ~/bin/xsync

分别在node2、node3机器安装xsync命令

从node1把xsync命令发送到node2、node3

[hadoop@node1 bin]$ xsync /home/hadoop/bin

将脚本复制到/bin目录,方便root用户调用(三台机器都执行)

在node1机器执行:

[hadoop@node1 ~]$ sudo cp ~/bin/xsync /bin/

在node2机器执行:

[hadoop@node2 ~]$ sudo cp ~/bin/xsync /bin/
在node3机器执行:

[hadoop@node3 soft]$ sudo cp ~/bin/xsync /bin/

2 安装JDK

2.1 安装

在home/hadoop目录下创建soft和installfiles目录,在此说明soft主要存放安装文件,installfiles主要存放安装包,相关命令如下

[hadoop@node1 ~]$ mkdir soft

[hadoop@node1 ~]$ mkdir installfiles

官方下载 JDK 以jdk-8u212-linux-x64.tar.gz为例

将从官网下的安装包上传到installfiles目录下

使用命令切换到 ~/installfiles目录下

[hadoop@node1 ~]$ cd ~/installfiles/

解压jdk-8u212-linux-x64.tar.gz到~/soft

[hadoop@node1 installfiles]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C ~/soft

添加环境变量

sudo vim /etc/profile.d/my_env.sh

在my_env.sh中添加

#JAVA_HOME
export JAVA_HOME=/home/hadoop/soft/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

让环境变量生效

source /etc/profile

验证是否安装成功

使用java --version命令,出现下面内容则说明安装成功

[hadoop@node1 installfiles]$ java -version

java version "1.8.0_212"

Java(TM) SE Runtime Environment (build 1.8.0_212-b10)

Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

用同样的方法在node2、node3中安装jdk

2.2 集群命令批量执行脚本

在/home/hadoop/bin目录下创建脚本xcall

[hadoop@node1 bin]$ cd /home/hadoop/bin

[hadoop@node1 bin]$ vim xcall

编写脚本如下

#! /bin/bash
 
for i in node1 node2 node3
do
    echo --------- $i ----------
    ssh $i "$*"
done

添加权限

[hadoop@node1 bin]$ chmod 777 xcall

启动脚本

[hadoop@node1 bin]$ xcall jps

--------- node1 ----------

14138 Jps

--------- node2 ----------

13316 Jps

--------- node3 ----------

12754 Jps

3 安装Hadoop

在Hadoop官网下载自己所需的版本Apache Hadoop

以下安装是以Hadoop3.3.4为例

将下载好的安装包上传到~/installfiles中

解压Hadoop到~/soft当中去

[hadoop@node1 installfiles]$ tar -zxvf hadoop-3.3.4.tar.gz -C ~/soft

添加环境变量

sudo vim /etc/profile.d/my_env.sh

在my_env.sh文件中添加

#HADOOP_HOME
export HADOOP_HOME=/home/hadoop/soft/hadoop-3.3.4
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

分发环境变量文件

sudo /home/hadoop/bin/xsync /etc/profile.d/my_env.sh

并且在node1、node2和node3上让环境变量生效

source /etc/profile

验证

[hadoop@node1 soft]$ hadoop version

Hadoop 3.3.4

Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb

Compiled by stevel on 2022-07-29T12:32Z

Compiled with protoc 3.7.1

From source with checksum fb9dd8918a7b8a5b430d61af858f6ec

This command was run using /home/hadoop/soft/hadoop-3.3.4/share/hadoop/common/hadoop-common-3.3.4.jar
出现这些说明安装成功

3.1 配置Hadoop

进入Hadoop的配置文件中

[hadoop@node1 soft]$ cd $HADOOP_HOME/etc/hadoop

3.1.1 配置核心文件

配置core-site.xml文件

[hadoop@node1 hadoop]$ vim core-site.xml

在<configuration></configuration>之间添加内容如下

<!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node1:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/soft/hadoop-3.3.4/data</value>
</property>

<!-- 配置HDFS网页登录使用的静态用户为hadoop -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>hadoop</value>
</property>

<!-- 配置该hadoop(superUser)允许通过代理访问的主机节点 -->
    <property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
</property>
<!-- 配置该hadoop(superUser)允许通过代理用户所属组 -->
    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
</property>
<!-- 配置该hadoop(superUser)允许通过代理的用户-->
    <property>
        <name>hadoop.proxyuser.hadoop.users</name>
        <value>*</value>
</property>

使用wq保存退出

配置hdfs-site.xml

[hadoop@node1 hadoop]$ vim hdfs-site.xml

在<configuration></configuration>之间添加内容如下

<!-- nn web端访问地址-->
	<property>
        <name>dfs.namenode.http-address</name>
        <value>node1:9870</value>
    </property>
    
	<!-- 2nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node3:9868</value>
    </property>
    
    <!-- 测试环境指定HDFS副本的数量1 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

使用wq保存退出

配置yarn-site.xml

在<configuration></configuration>之间添加内容如下

<!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node2</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>
    
    <!--yarn单个容器允许分配的最大最小内存 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
    </property>
    
    <!-- yarn容器允许管理的物理内存大小 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
    
    <!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>

使用wq保存退出

配置mapred-site.xml

[hadoop@node1 hadoop]$ vim mapred-site.xml

在<configuration></configuration>之间添加内容如下

<!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

配置workers

[hadoop@node1 hadoop]$ vim workers

在文件中添加

node1

node2

node3

注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行

3.1.2 配置历史服务器

为了查看程序的历史运行情况,需要配置一下历史服务器。

配置mapred-site.xml

[hadoop@node1 hadoop]$ vim mapred-site.xml

添加内容如下:

<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>node1:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>node1:19888</value>
</property>

3.1.3  配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。

日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager

配置yarn-site.xml

[hadoop@node1 hadoop]$ vim yarn-site.xml

添加内容如下:

<!-- 开启日志聚集功能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>

<!-- 设置日志聚集服务器地址 -->
<property>  
    <name>yarn.log.server.url</name>  
    <value>http://node1:19888/jobhistory/logs</value>
</property>

<!-- 设置日志保留时间为7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>

3.1.4 分发Hadoop

xsync /home/hadoop/soft/hadoop-3.3.4

3.1.5 启动Hadoop

第一次启动Hadoop,需要在node1节点上格式化

[hadoop@node1 hadoop]$ cd $HADOOP_HOME/

[hadoop@node1 hadoop-3.3.4]$ bin/hdfs namenode -format

格式化成功会出现successfully formatted

在node1上启动HDFS

[hadoop@node1 hadoop-3.3.4]$ sbin/start-dfs.sh

在配置了ResourceManager的节点(node2)启动YARN

[hadoop@node2 hadoop-3.3.4]$ sbin/start-yarn.sh

3.1.6 web端查看HDFS

在Windows下有IP映射则可以使用http://node1:9870/,无映射则使用IP地址

如果打不打web页面则有可能防火墙没有关闭

关防火墙的命令如下

systemctl stop firewalld

web页面如下

3.1.7 Hadoop群起脚本

在~/bin目录下添加脚本

[hadoop@node1 hadoop-3.3.4]$ cd ~/bin/

[hadoop@node1 bin]$ vim hdp.sh

写入以下内容

#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="

        echo " --------------- 启动 hdfs ---------------"
        ssh node1 "/home/hadoop/soft/hadoop-3.3.4/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh node2 "/home/hadoop/soft/hadoop-3.3.4/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh node1 "/home/hadoop/soft/hadoop-3.3.4/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="

        echo " --------------- 关闭 historyserver ---------------"
        ssh node1 "/home/hadoop/soft/hadoop-3.3.4/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh node2 "/home/hadoop/soft/hadoop-3.3.4/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh node1 "/home/hadoop/soft/hadoop-3.3.4/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

添加权限

[hadoop@node1 bin]$ chmod 777 hdp.sh

启动集群

[hadoop@node1 bin]$ hdp.sh start

出现以下进程则说明安装成功

使用xcall查看所有节点上的进程

[hadoop@node1 bin]$ xcall jps

--------- node1 ----------

14449 DataNode

14770 NodeManager

14327 NameNode

14986 Jps

14956 JobHistoryServer

--------- node2 ----------

13573 ResourceManager

13687 NodeManager

13879 Jps

13388 DataNode

--------- node3 ----------

12928 SecondaryNameNode

13026 NodeManager

13174 Jps

12826 DataNode

出现以上进程说明部署成功

使用脚本停止集群

[hadoop@node1 bin]$ hdp.sh stop

Hadoop安装完成

;