Hadoop3.1.3完全分布式搭建(231018)

一、前置准备(模版机)

  1. 准备jdk1.8.0_202hadoop-3.1.3
  2. 准备一台CentOS模版机
  3. 模版机要求配置静态IP地址
  4. 模版机要求修改主机名

1.1、修改ip地址

修改网卡:

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

添加:

BOOTPROTO=static    #static静态IP地址,dhcp动态IP地址

···

ONBOOT=yes        #将ONBOOT="no"改为ONBOOT="yes",开启网卡自动连接

···

IPADDR=192.168.10.21        #ip地址
NETMASK=255.255.255.0        #子网掩码
GATEWAY=192.168.10.2        #网关
DNS1=8.8.8.8                        #修改DNS服务器

重启网卡

service network restart

1.2、修改主机名

修改主机名:

vim /etc/hostname

1.3、必装组件

常用命令:

yum install update vim epel-release tree wget net-tools psmisc nc rsync lrzsz ntp libzstd openssl-static iotop git -y

1.4、修改hosts

vim /etc/hosts

添加:注意要把前面两行注释掉(使用 #)

172.16.84.21    hadoop21
172.16.84.22    hadoop22
172.16.84.23    hadoop23

# 这是你们的 根据自己电脑来
192.168.10.31    hadoop31
192.168.10.32    hadoop32
192.168.10.33    hadoop33

使用scp同步到hadoop32、hadoop33

scp /etc/hosts root@172.16.84.32:/etc/hosts            # 从31同步到32
scp /etc/hosts root@172.16.84.33:/etc/hosts            # 从31同步到33

其他系统:

# Linux中的hosts路径
/etc/hosts

# Windows的hosts路径
C:\Windows\System32\drivers\etc

# MacOS的hosts路径
/etc/hosts

1.5、创建用户 & 设置密码

这一步三台机子都要创建,hadoop31、hadoop32、hadoop33

创建用户:

useradd ahdan

设置密码:

passwd ahdan

1.6、修改全局用户权限

设置权限:

vim /etc/sudoers        # 大概100行,100gg

root    ALL=(ALL)       ALL
ahdan   ALL=(ALL)       NOPASSWD:ALL #先添加行 设置面免密操作

1.7、禁用防火墙

禁用防火墙:

systemctl stop firewalld
systemctl disable firewalld

二、安装JDK & Hadoop

克隆三台主机hadoop31、hadoop32、hadoop33后,在hadoop31里面操作

==以下所有步骤使用root用户操作==

2.1、在hadoop31上传/解压

创建:

# 在/opt下创建software module
mkdir /opt/software /opt/module

# 验证
ls /opt

上传:

cd /opt/software        # 上传到该目录

[root@hadoop31 software]# pwd
/opt/software
[root@hadoop31 software]# ls
hadoop-3.1.3.tar.gz  jdk-8u121-linux-arm64.tar.gz

解压:

cd /opt/software

# 解压Java 到/opt/module/
tar -zxvf jdk-8u121-linux-arm64.tar.gz -C /opt/module/

# 解压Hadoop 到/opt/module/
tar -zxvf hadoop-3.1.3.tar.gz -C ../module/

验证:
ls /opt/module/

[root@hadoop31 software]# ls /opt/module/
hadoop-3.1.3  jdk1.8.0_121

2.2、配置环境变量:

编辑文件

vim /etc/profile.d/my_env.sh

添加:注意修改路径

# 配置JDK环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_121       # 修改Java安装目录
export PATH=$PATH:$JAVA_HOME/bin

# 配置hadoop环境变量
export HADOOP_HOME=/opt/module/hadoop-3.1.3    # 修改Hadoop安装目录
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 设置HDFS&YARN用户
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

生效:

source /etc/profile

验证版本号:

java -version
hadoop version

验证命令:

java
javac
hadoop

2.3、修改目录用户 & 用户组权限

==以下步骤全部使用所创建的用户(addan)操作==

su ahdan

/opt/module/hadoop-3.1.3权限

sudo chown -R ahxin:ahxin /opt/module/hadoop-3.1.3

2.4、删除官方文档400多MB

切换:

cd $HADOOP_HOME/share

查看:

du -h --max-depth=1

[ahdan@hadoop31 share]$ du -h --max-depth=1
357M    ./hadoop
479M    ./doc        # 删的就删它
835M    .

删除:

rm -rf $HADOOP_HOME/share/doc/

三、把hadoop21的包发送给hadoop22 hadoop23

==克隆三台机:hadoop31、hadoop32、hadoop33==

==修改对应的ip地址和主机名字==

主机名ip地址
Hadoop31172.16.84.31
Hadoop32172.16.84.32
Hadoop33172.16.84.33

3.1、修改ip地址

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

3.2、修改主机名字

sudo vim /etc/hostname

3.3、拷贝hadoop文件

将hadoop31中的/opt下的所有文件,拷贝到hadoop32、hadoop33

切换root

su root

拷贝到hadoop32

scp -r /opt/* root@hadoop22:/opt/

拷贝到hadoop33

scp -r/opt/* root@hadoop23:/opt/

3.4、免密登录

root用户和ahdan用户都要用

生成密钥:

ssh-keygen -t rsa

发送密钥:

# hadoop31
ssh-copy-id hadoop31
ssh-copy-id hadoop32
ssh-copy-id hadoop33

# hadoop32
ssh-copy-id hadoop31
ssh-copy-id hadoop32
ssh-copy-id hadoop33

# hadoop33
ssh-copy-id hadoop31
ssh-copy-id hadoop32
ssh-copy-id hadoop33

四、Hadoop集群配置

规划:

192.168.10.31        hadoop31        NN    DN    NM
192.168.10.32        hadoop32        DN    RM    NM
192.168.10.33        hadoop33        DN    SN    RM

172.16.84.31    hadoop31    
172.16.84.32    hadoop32
172.16.84.33    hadoop33
  1. NN (NameNode) - 名称节点:HDFS文件系统文件和目录的命位置信息
  2. DN (DataNode) - 数据节点:存储HDFS数据块的具体位置
  3. NM (NodeManager) - 节点管理器:管理该节点上的资源
  4. RM (ResourceManager) - 资源管理器:集群的资源管理
  5. SN (Secondary NameNode) - 次要名称节点:定时备份

实现网址:

namenode的web地址为:http://hadoop31:9870

yarn的web地址为:http://hadoop32:8088

3.1、core-site.xml

切换Hadoop目录:

cd /$HADOOP_HOME/etc/hadoop
vim core-site.xml
<configuration>
    <!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop21:9820</value>
    </property>
    <!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
    </property>
    <!-- 配置HDFS网页登录使用的静态用户为ahdan -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>ahxin</value>
    </property>
</configuration>


<!-- 以下是代理的使用,主要在hive时使用,可以暂时不用配置 -->
<!-- 配置该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.groups</name>
    <value>*</value>
</property>

3.2、hdfs-site.xml

vim hdfs-site.xml

添加:

<configuration>
    <!-- nn web端访问地址-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop21:9870</value>
    </property>
    <!-- 2nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop23:9868</value>
    </property>
    <!-- 页面操作权限-->
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

3.3、yarn-site.xml

vim yarn-site.xml

添加:

<configuration>
    <!-- 指定MR走shuffle 数据的重新整合方式 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop22</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>

    <!-- 以下为可选配置 -->
    <!-- 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>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>

3.3、mapred-site.xml

vim mapred-site.xml

添加:

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

3.4、创建data文件

cd $HADOOP_HOME

mkdir data

# 授权
sudo chown -R ahdan:ahdan /opt/module/hadoop-3.1.3/data

3.5、workers(后面其群启动要用到)

works 配置的为 DataNode节点的主机名

sudo vim workers

# 添加:
hadoop21
hadoop22
hadoop23

五、集群分发脚本xsync

6.1、编写集群分发脚本rsync

rsync用法:

-a        # 归档拷贝
-v        # 显示复制过程

rsync -av /opt/software/* root@hadoop32:/opt/software

# 将hadoop21的hadoop配置文件 同步到hadoop22
rsync -av /opt/module/hadoop-3.1.3/etc/hadoop/* root@hadoop22:/opt/module/hadoop-3.1.3/etc/hadoop

注意:

  • rsync 只对差异文件做更新, rsync 源和目标不能都是远程的
  • rsync 是 分块校验+传输, scp 是整个文件传输。. rsync 比 scp 有优势的地方在于单个大文件的一小部分存在改动时,只需传输 改动部分 ,无需重新传输整个文件。

实现一条命令同步把任意hadoop同步到hadoop31、hadoop32、hadoop33

实现语法:

my_rsync 同步目录

# 把当前主机/opt下所有文件同步到hadoop31、hadoop32、hadoop33中
my_rsync /opt/*            

6.2、创建脚本xsync

创建目录

mkdir ~/bin
cd ~/bin
sudo vim my_rsync.sh

创建软连接
sudo ln -s ~/bin/my_rsync.sh /bin/my_rsync.sh

添加

#!/bin/bash
#参数预处理,判断参数个数,
if [ $# -lt 1 ];then
    echo 参数不能为空
    exit
fi
#遍历集群所有机器
for host in hadoop21 hadoop22 hadoop23;do
    echo "==========$host================"
    # 遍历所有目录,按个发送
    for file in $@;do
    # 判断文件是否存在
        if [ -e $file ];then
            # 1. 获取当前文件的目录结构,使用cd防止是软连接 cd -P
            pdir=$(cd -P $(dirname $file); pwd)
            # 2.获取当前文件名
            fname=$(basename $file)
            # 3. 登陆目标地址,创建同一目标结构
            ssh $host "mkdir -p $pdir"
            # 4.依次分发文件或目录
            rsync -av $pdir/$fname $host:$pdir
        else
            echo "$host $file 不存在"
        fi
    done
done

6.3、添加权限

chmod +x my_rsync.sh 

6.4、测试

my_rsync ~/bin/my_rsync.sh 

去hadoop32、hadoop33看看

ll ~/bin

六、单点启动/停止

6.1、格式化namenode

hdfs namenode -format

6.2、hadoop31启动项

hdfs --daemon start namenode         # 1
hdfs --daemon start datanode        # 2
yarn --daemon start nodemanager    # 5

6.3、hadoop32启动项

hdfs --daemon start datanode                # 2
yarn --daemon start resourcemanager    # 4
yarn --daemon start nodemanager            # 5

6.4、hadoop33启动项

hdfs --daemon start datanode                    # 2
hdfs --daemon start secondarynamenode    # 3
yarn --daemon start nodemanager                # 5

6.5、Web地址

# nomenoded的Web
http://hadoop31:9870

# yarn的web地址为:
http://hadoop32:8088

image-20231018173744854

==单点停止就是把上面的start换成stop==

格式化 HDFS 集群的 NameNode的注意事项
集群只有首次搭建后需要对NameNode进行格式化操作
如果集群在后期使用过程需要重新格式化,一定切记删除
所有机器hadoop安装目录下的 data logs 目录。

七、集群启动/停止

切换root用户执行以下步骤

7.1、设置Hadoop用户为root

编辑:

vim /etc/profile.d/my_env.sh

添加:

# 设置HDFS&YARN用户
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

7.2、hadoop31启动HDFS

start-dfs.sh 

7.3、hadoop32启动YARN

start-yarn.sh 

jps:

7.4、Web地址

HDFS:http://hadoop31:9870

YARN:http://hadoop32:8088

利用hadoop提供的 群启/群停 脚本完成集群操作
            群启: start-dfs.sh   start-yarn.sh
            群停: stop-dfs.sh    stop-yarn.sh
            `注意事项`:启动hdfs的时候要在NameNode所在的机器执行脚本
                                 启动yarn的时候要在resourcemanager所在的机器执行脚本

7.5、用Web界面上传文件到集群

Utilities-->Browse the file system:

image-20231020111357360

image-20231020111441797

若报错无法创建,则给HDFS添加777权限:

[root@hadoop21 /]# hdfs dfs -chmod 777 /

image-20231020114144955

进入目录:

image-20231020114247477

上传:

image-20231020114405846

image-20231020114424863

7.6、从linux上传文件到集群

命令:

hadoop fs -put Linux上的目录为止 上传到HDFS的什么位置

hadoop fs -put /root/demo1.txt /wc_input

在/opt下创建一个mode2 内容如下:

vim /opt/demo2.txt


hadoop hadoop
ss ss
cls cls
jiao
banzhang
xue
hadoop
sgg sgg sgg
nihao nihao
bigdata0111
laiba

上传HDFS,/wc_input

hdfs dfs -put /opt/demo2.txt /wc_input

查看HDFS/目录:

hdfs dfs -ls /
hdfs dfs -ls /wc_input

拓展:

# Hadoop命令
hadoop fs -ls <path>:列出指定路径下的文件和目录。
hadoop fs -mkdir <path>:在指定路径下创建新目录。
hadoop fs -rm <path>:删除指定路径下的文件或目录。
hadoop fs -mv <source> <destination>:将文件或目录从源路径移动到目标路径。
hadoop fs -cp <source> <destination>:将文件或目录从源路径复制到目标路径。

# HDFS命令
hdfs dfs -du <path>:显示指定路径下文件或目录的大小。
hdfs dfs -chown <user>:<group> <path>:更改文件或目录的所有者和所属组。
hdfs dfs -chmod <permissions> <path>:更改文件或目录的权限。
hdfs dfs -tail <path>:显示文件末尾的内容。

7.7、执行wordcount程序

执行前查看:

image-20231020115741293

执行wordcount程序:

# 切换到
cd $HADOOP_HOME/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount /wc_input /wc_output

执行后查看:

image-20231020133050110

image-20231020133106224

八、历史服务器

切换目录:

cd $HADOOP_HOME/etc/hadoop/

编辑:

vim mapred-site.xml

添加:

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

分发一下:

my_rsync /opt/module/hadoop-3.1.3/etc/hadoop/

重启HDFS(需要先重启,否则无法正常打开历史):

stop-dfs.sh         # 在hadoop21启动
start-dfs.sh        # 在hadoop21启动
mapred --daemon start historyserver        # 在hadoop21启动

[ahxin@hadoop11 hadoop-3.1.3]$ jps
12593 NameNode
12709 DataNode
12999 JobHistoryServer
11479 NodeManager
13018 Jps

九、日志的聚集

切换目录:

cd $HADOOP_HOME/etc/hadoop/

编辑:

vim yarn-site.xml

添加:

<configuration>
    <!-- 开启日志聚集功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 设置日志聚集服务器地址 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://hadoop21:19888/jobhistory/logs</value>
    </property>
    <!-- 设置日志保留时间为7天 秒为单位-->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
</configuration>

先停止先前的:

stop-dfs.sh        # hadoop21
mapred --daemon stop historyserver    # hadoop21
stop-yarn.sh    # hadoop21

启动:

# hadoop21
start-dfs.sh
mapred --daemon start historyserver

# hadoop22
start-yarn.sh

Web日志服务器:hadoop21:19888/jobhistory/

image-20231020134211621

image-20231020134220410

image-20231020134227403

image-20231020134241884

执行wordcount程序:

# 切换到
cd $HADOOP_HOME/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount /wc_input /wc_output

image-20231020134311570

image-20231020134320200

image-20231020134326231

image-20231020134331851

十、hadoop集群启停脚本

10.1、创建my_hadoop.sh

vim ~/bin/my_hadoop.sh

添加:

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

        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop21 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop22 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="

        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop22 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop21 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

授权:

chmod +x ~/bin/my_hadoop.sh 

创建软链接:

ln -s ~/bin/my_hadoop.sh /bin/my_hadoop

命令用法:

my_hadoop stop        # 停止
my_hadoop start        # 启动

完(常见问题)

最后修改:2024 年 01 月 24 日
咱们谁跟谁,用不着~