Hadoop3.5.0 集群搭建

概述

Apache Hadoop 是一个面向大规模数据存储与分布式计算的开源框架,它专为处理大规模数据而设计,能够让用户利用由普通服务器组成的集群,对海量数据进行分布式存储和计算。

Hadoop 核心组件

Hadoop 本身并不是单一服务,而是由多个相互配合的核心组件组成,主要包括:

  • Hadoop Common
  • HDFS
  • YARN
  • MapReduce

其中,HDFS 解决“数据存在哪里”的问题,YARN 解决“资源怎么分配”的问题,MapReduce 解决“任务怎么计算”的问题,而 Hadoop Common 不是一个独立的服务运行,主要包含了 Hadoop 其他组件共同依赖的 Java 库、配置文件、RPC、序列化、文件系统接口、Shell 工具等,提供其他组件运行所需要的公共库和基础能力。

Hadoop 本身还有大量常见的大数据组件与 Hadoop 配合使用,包括 Hive、HBase、Spark、Flink、Flume 等。这些组件并不属于 Hadoop Core,但经常和 Hadoop 一起组成完整的大数据平台。

下面主要介绍 HDFS、YARN、MapReduce。

HDFS

Hadoop Distributed File System(HDFS)是一个专为在通用硬件上运行而设计的分布式文件系统。

HDFS 采用主从架构。一个 HDFS 集群由一个 NameNode 和若干个 DataNode 组成。

NameNode 是 HDFS 的元数据中心,作为主服务器管理文件系统命名空间并控制客户端对文件的访问。

DataNode 负责真正存储数据 Block,通常集群中的每个节点都配备一个 DataNode,它们管理运行所在节点上的存储。

HDFS 公开一个文件系统命名空间,允许用户将数据存储在文件中。在内部,一个文件会被分割成一个或多个数据块,这些数据块存储在一组 DataNode 中。NameNode 执行文件系统命名空间操作,例如打开、关闭和重命名文件和目录。它还负责确定数据块到 DataNode 的映射关系。DataNode 负责处理来自文件系统客户端的读写请求。此外,DataNode 还根据 NameNode 的指令执行数据块的创建、删除和复制操作。

YARN

Yet Another Resource Negotiator(YARN)是 Hadoop 的资源管理和任务调度系统,本身并不负责具体计算,而是负责决定:哪个任务在哪台服务器上运行,以及可以使用多少 CPU 和内存,YARN 主要管理的是:CPU、Memory、Container、Application。基本理念是将资源管理和作业调度/监控的功能拆分到独立的守护进程中。

ResourceManager 是最终的资源管理权威,负责在系统中所有应用程序之间分配资源。ResourceManager 有两个主要组件:Scheduler 和 ApplicationsManager。Schedule 负责分配资源但不监控任务状态,ApplicationsManager 负责管理作业,如接收作业提交、为作业启动。

NodeManager 是每个机器上的框架代理,负责管理 Container ,监控 Container 的资源使用情况(CPU、内存、磁盘、网络),并将监控结果报告给 ResourceManager/Scheduler。ResourceManager 和 NodeManager 构成了数据计算框架。

ApplicationMaster 主要是从 ResourceManager 协商资源,并与 NodeManager 一起执行和监控任务。

Container 是 YARN 分配资源的基本单位,例如 2C4G。MapReduce、Spark 等计算任务最终都会运行在 YARN 分配出来的 Container 中。

MapReduce

MapReduce 是 Hadoop 自带的分布式计算模型。主要解决如何把一个大型计算任务拆成多个小任务,以可靠、容错的方式分散到多台服务器并行处理大量数据(数 TB 的数据集)。

MapReduce 核心分为两个阶段:

Map 负责将输入数据拆分并并行处理。

Reduce 对相同 Key 的数据进行聚合。

在 Map 和 Reduce 之间,还有一个关键的 Shuffle 阶段,负责将 Map 的输出按 Key 分组、排序后,传输给对应的 Reduce 任务。

因此,Hadoop 并不是一个单独的“大数据计算工具”,而是一套以 HDFS 分布式存储 + YARN 资源管理 为核心的大数据基础平台,MapReduce 则是 Hadoop 原生提供的一种分布式计算框架。

工作原理

一个典型的 Hadoop 作业执行流程如下:

  1. 数据存储:数据被写入HDFS,自动切块并多副本存储。
  2. 作业提交:用户提交 MapReduce 作业。
  3. 资源申请:YARN的 ResourceManager 为作业分配第一个容器,启动 ApplicationMaster
  4. 任务调度ApplicationMasterResourceManager 申请后续任务所需资源。
  5. 任务执行NodeManager 在获得资源的节点上启动容器,执行 Map 或 Reduce 任务。
  6. 数据本地化:调度器会尽量将计算任务调度到数据所在的节点上,减少网络传输。
  7. 结果输出:Reduce 任务完成后,结果最终输出到 HDFS。

环境准备

Item Version
Ubuntu 22.04.5
Hadoop 3.5.0
Java 17
节点 IP
u68 192.168.2.68
u69 192.168.2.69
u71 192.168.2.71

配置主机名解析

三个节点都需要能够解析另外两个节点,正式环境推荐 DNS,测试环境可以修改 hosts 文件:

1
2
3
4
5
cat >> /etc/hosts <<EOF
192.168.2.68 u68
192.168.2.69 u69
192.168.2.71 u71
EOF

创建 Hadoop 用户

所有节点:

1
2
useradd -m hadoop
passwd hadoop

进入 hadoop 用户:

1
su - hadoop

创建 hadoop 数据目录

1
2
3
4
5
mkdir -p /data/hadoop/dfs/name
mkdir -p /data/hadoop/dfs/data
mkdir -p /data/hadoop/tmp

chown -R hadoop:hadoop /data/hadoop

配置免密

1
2
3
4
5
6
su - hadoop
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519

ssh-copy-id hadoop@u68
ssh-copy-id hadoop@u69
ssh-copy-id hadoop@u71

安装 Java 环境

参考此文档说明,Hadoop 3.5及以上版本,服务器端需要 JDK17,客户端支持 JDK17 和 JDK21。所以这里我们要安装 JDK 17。

如果主机上已安装其他版本的 JDK,不用担心,一台主机可以安装多个版本,直接安装即可。

其中 Ubuntu 安装如下:

1
apt install -y openjdk-17-jdk-headless

配置环境变量:

1
2
3
4
vi ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin

验证:

1
java -version

安装 Hadoop 3.5.0

官方链接:https://hadoop.apache.org/releases.html

这里下载 Hadoop 3.5.0 版本

1
2
3
4
5
6
7
8
9
mkdir /opt/package && cd /opt/package

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.5.0/hadoop-3.5.0.tar.gz

tar -zxvf hadoop-3.5.0.tar.gz

mv hadoop-3.5.0.tar.gz /opt

chown -R hadoop:hadoop /opt/hadoop

配置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
cat >> ~/.bashrc <<'EOF'

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME

export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
EOF
1
source ~/.bashrc

检查

1
2
hadoop version
java -version

配置 Hadoop

在 u68 节点上,进入配置目录,修改和配置相关参数。

1
cd $HADOOP_HOME/etc/hadoop

hadoop-env.sh

1
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>

<property>
<name>fs.defaultFS</name>
<value>hdfs://u68:9000</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>

</configuration>

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
<configuration>

<property>
<name>dfs.replication</name>
<value>3</value>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/dfs/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/dfs/data</value>
</property>

<property>
<name>dfs.namenode.secondary.http-address</name>
<value>u69:9868</value>
</property>

</configuration>

workers

1
2
3
4
5
cat > workers <<EOF
u68
u69
u71
EOF

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
<configuration>

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>

<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop</value>
</property>

<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop</value>
</property>

<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop</value>
</property>

</configuration>

yarn-site.xml

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

<property>
<name>yarn.resourcemanager.hostname</name>
<value>u68</value>
</property>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>

</configuration>

同步配置到其他节点上

1
2
3
4
5
scp -r $HADOOP_HOME/etc/hadoop/* \
u69:/opt/hadoop/etc/hadoop/

scp -r $HADOOP_HOME/etc/hadoop/* \
u71:/opt/hadoop/etc/hadoop/

格式化 HDFS

仅 u68 执行一次!不要重复格式化。

1
hdfs namenode -format

启动 HDFS

在 u68 启动即可:

1
start-dfs.sh

三台节点执行检查:

1
jps
1
hdfs dfsadmin -report

启动 YARN

1
start-yarn.sh

检查:

1
yarn node -list

Web UI 访问

HDFS:http://192.168.2.68:9870

YARN:http://192.168.2.68:8088

HDFS 测试

1
2
3
4
5
6
7
8
9
hdfs dfs -mkdir -p /test

echo "hello hadoop 3.5" > /tmp/test.txt

hdfs dfs -put /tmp/test.txt /test/

hdfs dfs -ls /test

hdfs dfs -cat /test/test.txt

MapReduce 测试

1
2
3
yarn jar \
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \
pi 10 100

参考链接: