从0开始手把手搭建集群hadoop环境

0. 前言

逐步完成对三台主机的分布式集群进行大数据清洗,不出现错误的话配置大概需要3h左右。

1. 前置准备

1.1 VMware准备Linux虚拟机

1.首先,我们需要下载操作系统的安装文件,本次使用CentOS7.6版本进行学习:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)

image-20250510142111563

2.在在VMware中安装CentOS操作系统,自行百度,同样的操作克隆出:node2和node3

对虚拟机的内存进行配置:

· node1配置为4G内存node2

· node3配置为2G内存

1.2 配置固定IP地址

开启node1,修改主机名为node1,并修改固定ip为:192.168.88.131

1
2
3
4
5
6
7
8
9
10
# 修改主机名
hostnamectl set-hostname node1
#修改IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#在其中添加以下字段
IPADDR="192.168.88.131"
# 重启网卡
systemctl stop networksystemctl start network
或者直接#
systemctl restart network

同样的操作启动node2和node3

修改node2主机名为node2 设置ip为192.168.88.132

修改node2主机名为node3,设置ip为192.168.88.133

1.3 配置主机名映射

在Windows系统中修改hosts文件,填入如下内容

image-20250510142430871

在3台Linux的/etc/hosts文件中,填入如下内容(3台都要添加)

1
vim /etc/hosts

image-20250510142438477

1.4 配置SSH免密登录

  1. 在每一台机器都执行:ssh-keygen -t rsa -b 4096,一路回车到底即可
  2. 在每一台机器都执行:

image-20250510142547495

  1. 3.执行完毕后,node1、node2、node3之间将完成root用户之间的免密互通

1.5 创建hadoop用户并配置免密登录

我们为大数据的软件创建一个单独的用户hadoop,并为三台服务器同样配置hadoop用户的免密互通

  1. 在每一台机器执行:useradd hadoop,创建hadoop用户
  2. 在每一台机器执行:passwd hadoop,设置hadoop用户密码为123456
  3. 在每一台机器均切换到hadoop用户:su - hadoop,并执行 ssh-keygen -t rsa -b 4096,创建ssh密钥
  4. 在每一台机器均执行

image-20250510142659463

1.6 添加JDK

下载jdk-8u361-linux-x64.tar.gz

https://www.oracle.com/java/technologies/downloads

  1. 创建文件夹,用来部署JDK,将JDK和Tomcat都安装部署到:/export/server 内

image-20250510142744267

  1. 解压缩JDK安装文件

image-20250510142803746

  1. 配置JDK的软链接

image-20250510142818992

  1. 配置JAVA_HOME环境变量,以及将$JAVA_HOME/bin文件夹加入PATH环境变量中

image-20250510142827633

  1. 生效环境变量image-20250510142845460
  2. 配置java执行程序的软链接

image-20250510142857693

  1. 执行验证

image-20250510142906869

image-20250510142940429

1.7 根据自己的需要添加好快照备份

自行添加

2. 安装hadoop

请确认已经完成前置准备中的服务器创建、固定IP、防火墙关闭、Hadoop用户创建、SSH免密、JDK部署等操作。

2.1 hadoop安装

以下操作都是root身份操作

  1. 上传Hadoop安装包到node1节点中
  2. 解压缩安装包到/export/server/中
1
tar -zxvf hadoop-3.3.4.tar.gz -C /export/server
  1. 构建软链接

    1
    2
    cd /export/server
    ln -s /export/server/hadoop-3.3.4 hadoop
  2. 进入hadoop安装包内

1
cd hadoop
  1. 配置workers文件
1
2
3
4
5
6
7
8
# 进入配置文件目录
cd etc/hadoop
# 编辑workers文件
vim workers
# 填入如下内容
node1
node2
node3
  1. 配置hadoop-env.sh文件
1
2
3
4
5
# 填入如下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
  1. 配置core-site.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
在文件内部填入如下内容
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>

<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
</configuration>
  1. 配置hdfs-site.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 在文件内部填入如下内容
<configuration>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/nn</value>
</property>
<property>
<name>dfs.namenode.hosts</name>
<value>node1,node2,node3</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/dn</value>
</property>
</configuration>

在node1节点:

1
2
mkdir -p /data/nn
mkdir /data/dn

在node2和node3节点:

1
mkdir -p /data/dn

2.2 hadoop分发

目前,已经基本完成Hadoop的配置操作,可以从node1将hadoop安装文件夹远程复制到node2、node3

在node2,node3同样创建/export/server

1
mkdir /export/server

在node1的/export/server将hadoop分发给其他节点

1
2
3
4
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.3.4 node2:`pwd`/
scp -r hadoop-3.3.4 node3:`pwd`/

在node2执行,为hadoop配置软链接:

1
2
# 在node2执行如下命令
ln -s /export/server/hadoop-3.3.4 /export/server/hadoop

在node3执行,为hadoop配置软链接

1
2
# 在node3执行如下命令
ln -s /export/server/hadoop-3.3.4 /export/server/hadoop

为了方便我们操作Hadoop,可以将Hadoop的一些脚本、程序配置到PATH中,方便后续使用,在Hadoop文件夹中的bin、sbin两个文件夹内有许多的脚本和程序,现在来配置一下环境变量.

1
2
3
4
vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

image-20250510144036183

在node2和node3配置同样的环境变量

2.3 创建hadoop用户

为了确保安全,hadoop系统不以root用户启动,我们以普通用户hadoop来启动整个Hadoop服务

以root身份,在node1、node2、node3三台服务器上均执行如下命令

1
2
3
# 以root身份,在三台服务器上均执行
chown -R hadoop:hadoop /data
chown -R hadoop:hadoop /export

2.4 格式化启动hadoop

前期准备全部完成,现在对整个文件系统执行初始化。

  • 格式化namenode
1
2
3
4
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format
  • 启动(配置了hadoop环境变量)
1
2
3
4
5
6
7
8
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh

# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh

启动完成后,可以在浏览器打开:http://192.168.88.131:9870,即可查看到hdfs文件系统的管理网页。

image-20250510144519868

2.5 常见错误

Permission denied

image-20250510144602814

解决:hadoop安装文件夹或/data文件夹,未被授权给hadoop用户,所以无权限操作,更具需要修改后面的路径

1
chown -R hadoop:hadoop /export

command not found

image-20250510144731937

没有配置好环境变量,导致。

1
2
3
4
vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

启动后仅node1有进程出现

image-20250510144857905

image-20250510144900315

image-20250510144901772

检查,是否workers文件内没有正确配置,start-dfs.sh脚本会:在当前机器启动SecondaryNameNode,并根据core-site.xml的记录启动NameNode。

检查core-site.xml

node1无NameNode,仅有DataNode和SecondaryNameNode

image-20250510144959991

查看NameNode日志(/export/server/hadoop/logs/hadoop-hadoop-namenode-node1.log)提示NameNode未格式化

image-20250510145013593

格式化后启动。

1
hadoop namenode -format

部署Hadoop的关键点

  1. 上传、解压到/export/server,配置软链接

  2. 修改4份配置文件

    • worker

    • shadoop-env.sh

    • core-site.xml

    • hdfs-site.xml

  3. 分发到node2、node3,并设置环境变量

  4. 创建数据目录,并修改文件权限归属hadoop账户

  5. 启动,并查看WEB UI

3. MapReduce & YARN 的部署

3.1 环境配置

在 $HADOOP_HOME/etc/hadoop 文件夹内,修改:mapred-env.sh文件,添加如下环境变量

1
2
3
4
5
export JAVA_HOME=/export/server/jdk

export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000

export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA

mapred-site.xml文件,添加如下配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
</property>

<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>

<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>

<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
</property>

<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>

<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

</configuration>

yarn-env.sh文件,添加如下4行环境变量内容:

1
2
3
4
5
6
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
# export YARN_LOG_DIR=$HADOOP_HOME/logs/yarn
export HADOOP_LOG_DIR=$HADOOP_HOME/logs

yarn-site.xml文件,配置如图属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
<description></description>
</property>

<property>
<name>yarn.web-proxy.address</name>
<value>node1:8089</value>
<description>proxy server hostname and port</description>
</property>


<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>Configuration to enable or disable log aggregation</description>
</property>

<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<description>Configuration to enable or disable log aggregation</description>
</property>


<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
<description></description>
</property>

<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description></description>
</property>

<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/nm-local</value>
<description>Comma-separated list of paths on the local filesystem where intermediate data is written.</description>
</property>


<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/nm-log</value>
<description>Comma-separated list of paths on the local filesystem where logs are written.</description>
</property>


<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>10800</value>
<description>Default time (in seconds) to retain log files on the NodeManager Only applicable if log-aggregation is disabled.</description>
</property>



<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>Shuffle service that needs to be set for Map Reduce applications.</description>
</property>
</configuration>


MapReduce和YARN的配置文件修改好后,需要分发到其它的服务器节点中。

image-20250510145659148

分发

3.2 启动

一键启动YARN集群:

1
$HADOOP_HOME/sbin/start-yarn.sh
  • ResourceManager
  • NodeManager
  • ProxyServer(代理服务器

image-20250510145932460

其次执行:

1
$HADOOP_HOME/bin/mapred --daemon start historyserver 

image-20250510145925115

3.3 查看YARN的WEB UI页面

打开 http://192.168.88.131:8088 即可看到YARN集群的监控页面(ResourceManager的WEB UI)

image-20250510150015283

3.4 根据需要添加快照信息

4. Hive的部署

4.1 环境配置

我们在node1节点使用yum在线安装MySQL5.7版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 更新密钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# 安装Mysql yum库
rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm

# yum安装Mysql
yum -y install mysql-community-server

# 启动Mysql设置开机启动
systemctl start mysqld
systemctl enable mysqld

# 检查Mysql服务状态
systemctl status mysqld

# 第一次启动mysql,会在日志文件中生成root用户的一个随机密码,使用下面命令查看该密码
grep 'temporary password' /var/log/mysqld.log

# 修改root用户密码
mysql -u root -p -h localhost
Enter password:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root!@#$';

# 如果你想设置简单密码,需要降低Mysql的密码安全级别,sql语句以;结尾
set global validate_password_policy=LOW; # 密码安全级别低
set global validate_password_length=4; # 密码长度最低4位即可

# 然后就可以用简单密码了(课程中使用简单密码,为了方便,生产中不要这样)
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456;
/usr/bin/mysqladmin -u root password '123456'

grant all privileges on *.* to root@"%" identified by 'root' with grant option;
flush privileges;
# 允许所有用户通过root用户进行链接操作,在主机使用navicat链接时需要配置
grant all on *.* to 'root'@'%' identified by '你的密码';

设置hadoop用户允许代理(模拟)其它用户

在Hadoop的core-site.xml配置中添加允许模拟

1
2
3
4
5
6
7
8
9
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>

image-20250510150535603

4.2 hive安装

  1. 切换到hadoop用户
  2. 下载hive安装包

http://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz

  1. 解压到node1服务器的:/export/server/内

tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /export/server/

  1. 设置软连接

ln -s /export/server/apache-hive-3.1.3-bin /export/server/hive

  1. 下载MySQL驱动包:

https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.34/mysql-connector-java-5.1.34.jar

  1. 将下载好的驱动jar包,放入:Hive安装文件夹的lib目录内

mv mysql-connector-java-5.1.34.jar /export/server/hive/lib/

  1. 在Hive的conf目录内,新建hive-env.sh文件,填入以下环境变量内容:
1
2
3
export HADOOP_HOME=/export/server/hadoop
export HIVE_CONF_DIR=/export/server/hive/conf
export HIVE_AUX_JARS_PATH=/export/server/hive/lib
  1. 在Hive的conf目录内,新建hive-site.xml文件,填入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
</property>

<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>

<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>

<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
</property>

<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>

<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

</configuration>

4.3 初始化元数据库

  • 在MySQL中新建数据库:hive

CREATE DATABASE hive CHARSET UTF8;

  • 执行元数据库初始化命令:

cd /export/server/hive

bin/schematool -initSchema -dbType mysql -verbos

初始化成功后,会在MySQL的hive库中新建74张元数据管理的表。使用本机链接查看

image-20250510151034900

4.4 启动Hive(hadoop用户)

  • 创建一个hive的日志文件夹: mkdir /export/server/hive/logs

  • 启动元数据管理服务(必须启动,否则无法工作)

1
2
3
前台启动:bin/hive --service metastore 
后台启动:nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &

  • 启动客户端,二选一(当前先选择Hive Shell方式)
1
2
3
Hive Shell方式(可以直接写SQL): bin/hive
Hive ThriftServer方式(不可直接写SQL,需要外部客户端链接使用): bin/hive --service hiveserver2

4.5 主要流程

  • 部署MySQL数据库,并配置root账户密码
  • 下载Hive上传并解压和设置软链接
  • 下载MySQL 驱动jar包放入Hive的lib目录内
  • 修改配置文件(hive-env.sh和hive-site.xml)初始化元数据库(bin/schematool -initSchema -dbType mysql -verbos)
  • 启动hive的metastore服务:
    • 前台启动bin/hive --service metastore
    • 后台启动:nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
  • 启动hive命令行:bin/hive

错误

core-site.xml分发错误,需要在pwd中指定分发的路径

1
scp core-site.xml node2:/export/server/hadoop/etc/hadoop/core-site.xml

5. 尾

至此所有的配置都已经完整,如何检验呢?

将三台主机全部重新启动,在node1中分别运行:

start-dfs.sh

start-yarn.sh

cd /export/server/hive

nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &

nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

在node1中没有出现错误,并且在jps中出现两个RunJar,一共9个进程项目。

image-20250510152532108

node2和node3中:

image-20250510152751535

image-20250510152757550

则表示成功搭建了。