全分布式环境搭建

前言

本案例基于三台阿里云CentOS7,仅作hadoop全分布式搭建的过程命令及技巧总结

这里是 伪分布式集群搭建 没有基础 时间又不着急的小伙伴可以看看

环境

  • jdk1.8 (我用的华为镜像 8u202)
  • hadoop3.1.3

修改主机名

我们看到网上或者课本上什么slave1 slave2这种是它定义的主机名
我们可以改成自己的

1
2
3
4
5
6
7
8
9
修改
[root@hadoop102 ~]# vim /etc/hostname
查看
[root@hadoop102 ~]# cat /etc/hostname
hadoop102

然后重启
[root@hadoop102 ~]# reboot

hostname

我们可以按照【Hadoop】完全分布式集群搭建 这篇文章里写的 设置hadoop102、hadoop103、hadoop104 三个主机名

hostname

修改hosts文件

这一步是配置主机名对应的ip地址 然后就可以使用主机名来访问IP地址 省去了每次敲IP的繁琐

教程都这么做 你也可以不写 用对应的主机的IP替代

笔者建议 不熟悉的话跟着教程走

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

[root@hadoop102 ~]# cat /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

172.16.87.240 iZf8zby4vnqmfpg38dusaqZ iZf8zby4vnqmfpg38dusaqZ


47.115.203.103 hadoop101

172.16.87.240 hadoop102

47.115.231.192 hadoop103

47.113.180.24 hadoop104



hosts

以上两步 需要在每台机器上执行

然后 先进行一个验证 来确保截至目前步骤正确

我们使用ping 命令 来给每台主机 互相ping一下

ping

当你看到 每条ping命令都有目标主机IP的响应 那么就证明你前面两个步骤没问题

配置免密登录

这步免密操作 【Hadoop】完全分布式集群搭建 这篇教程写的不详细 我详细演示下
首先我们需要在每台机器上创建一个新的用户: 分别在hadoop101 hadoop102 hadoop103 主机下创建myhadoop01 myhadoop02 myhadoop03 用户

1
2
3
4
5
6
// 创建用户
useradd -m myhadoop01

// 设置密码
passwd myhadoop01

user home

如图所示 在创建用户后 会在/home目录新增出一个以该用户名 的文件夹

就跟你的windows电脑在创建新用户 在C盘的用户里 多出一个那个名字的文件夹 注意 这个叫家目录 在linux里 可以用~表示路径

然后切换到该用户下 su <用户名>

输入ssh-keygen -t rsa 直接三次回车生成ssh密钥

ssh-keygen

密钥文件 在家目录的.ssh目录下

这里演示的部分 就是我的/home/test/.ssh 目录

ssh-keygen

这一步我们需要将每台机器上都如此操作 生成ssh密钥

然后 将myhadoop01的密钥文件id_rsa.pub 分发到每台主机的目标用户的authorized_keys文件里

1
2
3
4
5
6
进入密钥文件目录
cd /home/myhadoop03/.ssh

分发密钥文件
ssh-copy-id -i id_rsa <用户名>@<主机名>

ssh-keygen

当看到目标主机的那个用户目录出现authorized_keys文件时 就说明分发成功了

ssh-keygen

这里演示的是其他主机分发密钥到我现在操作的这台主机的test用户家目录

同样的 这步操作 需要每台主机 互相之间都要分发密钥 这样才能实现每台主机之间免密登录

同时 我们还需要在.ssh目录下创建 config文件 配置 免密登录的账户 主机 IP信息

就按照下面的格式 自己写吧 分别是主机名 用户名 还有 目标机器的端口号和密钥文件路径

这一步 一定一定不要照抄的一股脑复制昂 至少 每个机器的ssh密钥目录都是不一样的 所以 理解着来复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Host hadoop101
HostName hadoop101
User myhadoop01
Port 22
IdentityFile /home/myhadoop03/.ssh/id_rsa

Host hadoop102
HostName hadoop102
User myhadoop02
Port 22
IdentityFile /home/myhadoop03/.ssh/id_rsa

Host hadoop103
HostName hadoop103
User myhadoop03
Port 22
IdentityFile /home/myhadoop03/.ssh/id_rsa

Host hadoop104
HostName hadoop104
User myhadoop04
Port 22
IdentityFile /home/myhadoop03/.ssh/id_rsa

ssh-keygen

tips:【Hadoop】完全分布式集群搭建 这篇教程使用了分发的脚本 我菜 所以就手动操作了 有能力的可以去具体看看

最后 我们来验证下这步是否成功

让我们直接在终端里 直接 ssh <主机名>

如果是这样
ssh-keygen

那么 你反复对照这一节的步骤 解决一下问题

如果是直接就登上了 那就恭喜你 免密登录成功了
ssh-keygen


ps: 因为我搭建的环境是服务器 不是虚拟机 所以我遇到了一个教程没写明的坑 这里点一下 在/etc/hosts文件里 本机的地址 需要换成内网IP 不然 在启动namenode进程的时候 会显示端口被占用 我在这里卡了半天..
ssh-keygen

安装jdk1.8和hadoop3.1.3

这里直接使用压缩包 手动配置环境了

资源链接我会一起打包附在底部

按照【Hadoop】完全分布式集群搭建 的步骤 这两个解压出来的文件是放在/opt/module目录下

那么 解压命令是 tar -zxvf <压缩包名> -C /opt/module

如果报什么什么 /opt/module open 什么什么不存在的 那么就在/opt下创建一个module目录就好了

同理 解压jdk和hadoop都解压到/opt/module目录 然后在/etc/profile文件的文件底部添加环境变量

1
2
3
4
5
6
export JAVA_HOME=/opt/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/sbin

export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

注意 JAVA_HOME和HADOOP_HOME要换成你实际的安装路径

然后 source /etc/profile 更新环境变量

验证一下

1
2
3
4
5
6
7
8
9
10
11
12
[root@hadoop101 opt]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
[root@hadoop101 opt]# hadoop version
Hadoop 3.1.3
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r ba631c436b806728f8ec2f54ab1e289526c90579
Compiled by ztang on 2019-09-12T02:47Z
Compiled with protoc 2.5.0
From source with checksum ec785077c385118ac91aadde5ec9799
This command was run using /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-common-3.1.3.jar

能看到对应的java和hadoop的响应版本号 就OK了 如此操作每台机器 (同样的 这步也可以用【Hadoop】完全分布式集群搭建 提到的脚本去一键分发配置文件)

配置全分布式集群

hadoop配置文件在hadoop的安装目录的/etc/hadoop目录下

config

我们主要需要修改四个文件 core-site.xml 、 mapred-site.xml 、 hdfs-site.xml 、 yarn-site.xml

  1. core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<!--指定NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
<description>version of this configuration file</description>
</property>
<!-- 指定Hadoop数据的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
<description>A base for other temporary directories.</description>
</property>
</configuration>
  1. mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
</configuration>
  1. hdfs-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <configuration>
    <!-- nn Web端访问地址-->
    <property>
    <name>dfs.namenode.http-address</name>
    <value>hadoop102:9870</value>
    <description>
    The address and the base port where the dfs namenode web ui will listen on.
    </description>
    </property>
    <!-- 2nn Web端访问地址 -->
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop104:9868</value>
    </property>
    </configuration>
  2. yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configuration>
<!-- Site specific YARN configuration properties -->
<!--指定MR走shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</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>

然后 这四个文件配置完后 我们还需要在hadoop-env.sh添加java的安装目录

大概在38行 JAVA_HOME=/usr/lib/jvm/jdk-17-oracle-x64

config

config

还有workers文件 这里是配置yarn的节点

config

然后 配置完以上文件后 我们就可以格式化hadoop的文件系统了

格式化 hdfs namenode -format

只需要在一台服务器上格式化就行了

config

这个是集群的各个进程服务的规划

文件格式化之后 可能需要手动创建下/opt/module/hadoop-3.1.3/data目录 这个目录用来存储hadoop的数据 同时 我们需要给它分配对应的权限 方便起见 直接将这个文件的所有权分配给我们最开始创建的hadoop用户

1
2
3
chown -R myhadoop02:myhadoop02 /opt/module/HA/zookeeper/zkData

chown -R <用户名>:<用户组> <文件路径>

以上文件的配置在另外两台机器上配置过后

按下面这张教程的截图的命令 进行启动

注意 只需要在第一台服务器启动hdfs服务 第二台启动yarn服务

cd /opt/module/hadoop-3.1.3/

sbin/start-dfs.sh

sbin/start-yarn.sh

config

当按这个步骤启动后 使用jps命令能查到以下进程 那么恭喜你 已经搭建好了hadoop全分布式集群

config

config

config

问题排错

我这个教程呢 也不是包对的 遇到问题还得自己解决 总之呢 教程里写的配置文件的内容呢是包没问题的 但是犯各种小细节的错误 所以 如果你遇到问题 不知道怎么解决 那么 去查看日志 根据日志的内容信息 去网上搜 都有前人踩过的坑 贴出来的

日志在 hadoop安装目录的logs下 即/opt/module/hadoop-3.1.3/logs/目录下 去查看你对应的进程的日志就好了

tips:日志太长看不懂?现在不是有AI么 把最新的一次启动的日志 复制出来 贴给AI问它怎么回事 我们只需要知道是什么问题 对应的去解决就好了

资源及笔记