OpenEuler系统上Hadoop 3.2.2伪分布式环境搭建与配置详解
1. 项目概述与核心价值
最近在折腾一个数据中台的原型验证项目,团队内部对底层操作系统的自主可控性有明确要求,传统的CentOS Stream虽然能用,但总想试试更“根正苗红”的国产发行版。于是,我把目光投向了OpenEuler。这个由国内顶尖社区驱动的操作系统,在云计算和基础软件领域已经积累了不错的口碑。而我的任务,就是在这片“新土地”上,成功种下大数据处理的“老黄牛”——Hadoop 3.2.2,搭建一个稳定可用的开发测试环境。
这个环境的核心价值非常明确: 为开发者、数据分析师或学生提供一个在国产化操作系统上学习和实践Hadoop生态技术的沙箱 。它不仅是简单的软件安装,更涉及到从操作系统基础配置、Java环境适配、到Hadoop核心组件调优的完整链路。你可能会问,为什么是Hadoop 3.2.2?这个版本是一个长期支持(LTS)的稳定版,修复了大量早期版本的Bug,同时引入了诸如纠删码(Erasure Coding)这样的重要特性,对于想深入理解HDFS、YARN、MapReduce核心原理的人来说,是个非常合适的起点。在OpenEuler上完成这一切,意味着你不仅能掌握Hadoop,还能熟悉一个未来可能在更多企业级场景中遇到的操作系统,一举两得。
整个过程会涉及系统初始化、依赖包管理、配置文件深度定制以及服务高可用性(尽管是单机伪分布式,但配置思维是相通的)的初步实践。无论你是想为国产化技术栈储备技能,还是单纯想在一个干净的系统上从头搭建Hadoop,这篇记录都能提供一份详尽的“避坑指南”。
2. 环境准备与系统初始化
在开始安装Hadoop之前,一个稳定、网络通畅、基础依赖完备的OpenEuler系统是基石。这一步的细致程度,直接决定了后续环节是否会频繁报错。
2.1 OpenEuler系统安装与基础配置
我使用的是OpenEuler 22.03 LTS版本,这是一个长期支持版,社区活跃,软件包更新及时。你可以从官网下载ISO镜像,通过VMware、VirtualBox或物理机进行安装。安装过程与常见的Linux发行版类似,这里强调几个关键选择:
- 安装类型 :建议选择“服务器安装”,它会提供一个最小化的系统,没有图形界面,更节省资源且稳定。对于开发环境,这完全足够。
-
磁盘分区
:如果只是学习,自动分区即可。若对性能有要求,可以考虑为
/opt或你计划安装Hadoop的目录单独挂载一个分区。 - 网络配置 : 务必在安装过程中就配置好静态IP ,或者确保安装后能通过DHCP稳定获取IP。Hadoop的许多配置依赖于主机名和IP地址,动态IP会导致后续服务无法正常通信。
系统安装完成后,第一件事不是急着装软件,而是进行一系列基础加固和配置。
# 1. 更新系统,确保所有包都是最新的
sudo dnf update -y
# 2. 设置主机名,并确保它在hosts文件中正确解析
# 假设我们设置主机名为 hadoop-master
sudo hostnamectl set-hostname hadoop-master
# 编辑 /etc/hosts,添加一行,将主机名映射到本机IP
# 例如:192.168.1.100 hadoop-master
sudo vim /etc/hosts
# 3. 关闭防火墙和SELinux(开发环境建议,生产环境需按策略开放端口)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 编辑 /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled,然后重启生效。
sudo vim /etc/selinux/config
# 4. 配置SSH免密登录(为Hadoop脚本管理准备)
# 生成密钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥拷贝到本机,实现自己登录自己免密
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 修改权限,这是SSH的严格安全要求
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
# 测试免密登录
ssh localhost
# 如果成功,会直接登录,无需密码。
注意 :关闭防火墙和SELinux仅适用于内网开发测试环境。如果是面向公网或有安全要求的环境,应配置防火墙规则,开放Hadoop相关端口(如9870, 8088, 19888等),并仔细规划SELinux策略。
2.2 安装必备的依赖软件包
OpenEuler使用DNF作为包管理器,与CentOS/RHEL系兼容性很好。我们需要安装Java、必要的编译工具和网络工具。
# 1. 安装Java Development Kit (JDK)
# Hadoop 3.2.2 官方推荐使用 Java 8 或 Java 11。这里选择安装 OpenJDK 11。
sudo dnf install -y java-11-openjdk-devel
# 验证安装
java -version
# 输出应类似:openjdk version "11.0.xx" ...
# 2. 设置 JAVA_HOME 环境变量
# 首先找到JDK的安装路径
sudo alternatives --config java
# 通常会输出类似 /usr/lib/jvm/java-11-openjdk-11.0.xx.x86_64/bin/java
# JAVA_HOME 是其上级目录的上级目录,即 /usr/lib/jvm/java-11-openjdk-11.0.xx.x86_64
# 编辑 ~/.bashrc 或 /etc/profile
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
source ~/.bashrc
# 验证 JAVA_HOME
echo $JAVA_HOME
# 3. 安装其他必要工具
sudo dnf install -y wget curl tar gzip net-tools procps which
# `which` 命令用于查找命令路径,某些Hadoop脚本会用到。
实操心得
:在OpenEuler上,
java-11-openjdk-devel
这个包名是固定的,安装非常顺利。环境变量
JAVA_HOME
的配置至关重要,Hadoop的所有脚本都依赖这个变量来定位Java。建议直接写入
~/.bashrc
,这样对当前用户永久生效,避免切换用户或终端时失效。
3. Hadoop 3.2.2 部署与配置详解
基础环境就绪后,我们进入核心环节:Hadoop本身的部署与配置。我们将采用“伪分布式模式”运行,即所有Hadoop守护进程(NameNode, DataNode, ResourceManager, NodeManager)都运行在单个节点上。这种模式模拟了一个微型集群,适合开发和测试。
3.1 软件包下载与解压
首先,从Apache官网下载Hadoop二进制发行版。建议使用国内镜像以加速下载。
# 进入一个合适的安装目录,例如 /opt
cd /opt
# 使用wget下载,注意版本号
sudo wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz
# 如果下载慢,可以尝试清华镜像:
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz
# 解压并创建软链接(方便后续版本管理)
sudo tar -xzvf hadoop-3.2.2.tar.gz
sudo ln -s hadoop-3.2.2 hadoop
# 将目录所有权赋予你的普通用户(假设用户名为 `developer`)
sudo chown -R developer:developer hadoop-3.2.2 hadoop
3.2 核心配置文件深度解析
Hadoop的配置集中在
$HADOOP_HOME/etc/hadoop/
目录下。我们需要修改以下几个关键文件。请跟随我的注释,理解每一个配置项的意义。
1. 设置Hadoop环境变量 (
hadoop-env.sh
)
这个文件定义了Hadoop运行所需的环境变量。
cd /opt/hadoop/etc/hadoop
vim hadoop-env.sh
找到
JAVA_HOME
这一行,取消注释并修改为你的实际路径。这是
最重要的一步
,如果配错,Hadoop将无法启动。
# 将原本的
# export JAVA_HOME=${JAVA_HOME}
# 修改为
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
你还可以在这里配置Hadoop的日志目录、堆内存大小等。对于开发环境,默认值通常足够。
2. 核心全局配置 (
core-site.xml
)
这个文件配置Hadoop的核心参数,最重要的是定义默认的文件系统(FS)和临时目录。
<configuration>
<!-- 指定HDFS的地址(NameNode的地址) -->
<!-- 端口9820是Hadoop 3.x中NameNode服务的默认RPC端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-master:9820</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<!-- 确保这个目录存在,并且当前用户有读写权限 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data/tmp</value>
</property>
</configuration>
3. HDFS配置 (
hdfs-site.xml
)
这个文件专门用于配置HDFS(分布式文件系统)。
<configuration>
<!-- 指定HDFS副本的数量,伪分布式模式只能为1 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定NameNode数据的存储位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<!-- 指定DataNode数据的存储位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
</configuration>
4. YARN配置 (
yarn-site.xml
)
YARN是Hadoop的资源调度系统。
<configuration>
<!-- 指定YARN的资源管理器(ResourceManager)地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-master</value>
</property>
<!-- 指定NodeManager上运行的附属服务,需包含shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 关闭虚拟内存检查,避免在开发环境因虚拟内存超限导致任务失败 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
5. MapReduce配置 (
mapred-site.xml
)
这个文件告诉Hadoop,MapReduce作业应该跑在YARN框架上。
<configuration>
<!-- 指定MapReduce运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
6. 工作节点配置 (
workers
)
这个文件列出了所有DataNode和NodeManager所在的主机名。在伪分布式模式下,只有本机。
echo "hadoop-master" > /opt/hadoop/etc/hadoop/workers
配置完成后,别忘了创建我们在
core-site.xml
中定义的临时目录:
mkdir -p /opt/hadoop/data/tmp
3.3 环境变量与PATH设置
为了让系统在任何位置都能识别Hadoop命令,需要将Hadoop的bin和sbin目录加入PATH。
# 编辑当前用户的 ~/.bashrc 文件
vim ~/.bashrc
# 在文件末尾添加以下内容
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 使配置立即生效
source ~/.bashrc
# 验证配置
hadoop version
# 应该能正确输出Hadoop 3.2.2的版本信息。
4. 服务启动、验证与初体验
配置全部完成后,激动人心的启动时刻到了。Hadoop的启动有严格的顺序要求。
4.1 格式化HDFS与启动服务
首次启动前,必须格式化HDFS的NameNode。 这相当于对文件系统进行“初始化”,会创建存储元数据的目录结构。 注意:格式化操作会清空HDFS上所有现有数据,仅在第一次搭建时执行。
# 1. 格式化HDFS NameNode
hdfs namenode -format
如果看到
... successfully formatted.
和
... Exiting with status 0
的提示,说明格式化成功。
2. 启动HDFS服务
# 启动HDFS(会启动NameNode和DataNode)
start-dfs.sh
使用
jps
命令查看Java进程,应该能看到
NameNode
、
DataNode
和
SecondaryNameNode
进程。
3. 启动YARN服务
# 启动YARN(会启动ResourceManager和NodeManager)
start-yarn.sh
再次使用
jps
命令,应该能看到
ResourceManager
和
NodeManager
进程。
一键启动/停止脚本
:Hadoop也提供了
start-all.sh
和
stop-all.sh
脚本,但在新版本中已标记为过时,建议使用分步启动的方式,更清晰。
4.2 服务验证与Web UI访问
进程起来不代表服务正常,我们需要通过命令行和Web界面双重验证。
1. 命令行验证HDFS
# 查看HDFS根目录
hdfs dfs -ls /
# 在HDFS上创建一个测试目录
hdfs dfs -mkdir -p /test/input
# 从本地拷贝一个文件到HDFS(可以用一个文本文件做测试)
echo "Hello Hadoop on OpenEuler" > test.txt
hdfs dfs -put test.txt /test/input/
# 查看文件是否上传成功
hdfs dfs -ls /test/input
2. 命令行验证YARN
# 查看YARN的节点状态
yarn node -list
应该能看到一个
hadoop-master
节点,状态为
RUNNING
。
3. Web UI 访问 Hadoop提供了非常直观的Web管理界面,是监控和排查问题的重要工具。
-
HDFS NameNode UI
: 浏览器访问
http://<你的服务器IP>:9870- 这里可以浏览HDFS文件树、查看DataNode状态、检查集群存储容量等。
-
YARN ResourceManager UI
: 浏览器访问
http://<你的服务器IP>:8088- 这里可以查看提交的应用程序(如MapReduce作业)、集群资源使用情况、节点状态等。
如果无法访问,请检查防火墙是否已关闭,以及服务器IP是否正确。
4.3 运行一个示例MapReduce作业
最后,我们运行Hadoop自带的经典示例——WordCount,来检验整个环境是否真正可用。
# 1. 准备输入数据。假设我们有一些文本文件在本地目录 /home/developer/wordcount_input
mkdir -p ~/wordcount_input
echo "Hello World Hello OpenEuler" > ~/wordcount_input/file1.txt
echo "Hadoop MapReduce OpenEuler Hadoop" > ~/wordcount_input/file2.txt
# 2. 将输入数据上传到HDFS
hdfs dfs -mkdir -p /user/developer/wordcount_input
hdfs dfs -put ~/wordcount_input/* /user/developer/wordcount_input/
# 3. 运行WordCount示例程序
# hadoop jar <jar包路径> <主类> <输入路径> <输出路径>
# 注意:输出路径必须不存在
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar \
wordcount \
/user/developer/wordcount_input \
/user/developer/wordcount_output
# 4. 查看输出结果
hdfs dfs -cat /user/developer/wordcount_output/part-r-00000
如果一切顺利,你将看到每个单词及其出现的次数,例如:
Hadoop 2
Hello 2
MapReduce 1
OpenEuler 2
World 1
看到这个结果,恭喜你!一个基于OpenEuler的Hadoop 3.2.2伪分布式开发环境已经成功搭建并运行起来了。
5. 常见问题排查与性能调优要点
即便按照步骤操作,你也可能会遇到一些问题。下面是我在搭建过程中遇到的一些典型问题及其解决方案,以及一些简单的性能调优建议。
5.1 启动失败与连接问题
问题1:执行
start-dfs.sh
或
hdfs
命令时,提示
JAVA_HOME is not set
或
Error: JAVA_HOME is not set and could not be found
。
- 原因 :Hadoop脚本没有找到正确的Java路径。
-
排查
:
-
检查
$HADOOP_HOME/etc/hadoop/hadoop-env.sh中的JAVA_HOME是否已正确设置并指向有效的JDK目录。 -
确保
JAVA_HOME路径中没有特殊字符或尾随空格。 -
在终端执行
echo $JAVA_HOME和java -version,确认系统级环境变量也正确。
-
检查
-
解决
:修正
hadoop-env.sh文件,并确保执行source命令或重新打开终端。
问题2:Web UI (9870或8088端口) 无法访问。
-
原因
:
- 防火墙未关闭或未开放端口。
- 服务未成功启动。
-
配置文件中的主机名绑定到了
localhost或127.0.0.1,导致外部无法访问。
-
排查
:
-
执行
jps确认NameNode和ResourceManager进程是否存在。 -
执行
sudo netstat -tlnp | grep java查看相关端口(9870, 8088)是否被Java进程监听,以及监听地址是0.0.0.0还是127.0.0.1。 -
检查
/etc/hosts文件,确保主机名hadoop-master正确解析到了服务器的 实际IP地址 ,而不是127.0.0.1。
-
执行
-
解决
:
- 关闭防火墙或开放端口。
-
检查配置文件(如
core-site.xml中的fs.defaultFS)是否使用了正确的主机名。 -
在
hadoop-env.sh中,可以添加export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"来优先使用IPv4。
问题3:DataNode或NodeManager启动后很快自动退出。
-
原因
:最常见的原因是多次执行了
hdfs namenode -format。每次格式化都会生成一个新的集群ID(clusterID),而DataNode保存的旧clusterID与NameNode的不匹配,导致它自动关闭。 -
排查
:查看
$HADOOP_HOME/logs/目录下对应进程(如hadoop-developer-datanode-*.log)的日志文件,通常会看到Incompatible clusterIDs的错误。 -
解决
:
-
彻底清理法
:停止所有服务,删除
core-site.xml中hadoop.tmp.dir指定的目录(例如/opt/hadoop/data/tmp),然后重新格式化并启动。 这会丢失所有HDFS数据。 -
手动同步法
:找到NameNode的
VERSION文件(位于dfs.name.dir配置的路径下,如/opt/hadoop/data/tmp/dfs/name/current/VERSION),复制其中的clusterID值。然后找到DataNode的VERSION文件(位于dfs.data.dir配置的路径下),用NameNode的clusterID替换掉原来的值。重启DataNode。
-
彻底清理法
:停止所有服务,删除
5.2 开发环境简易性能调优
对于单机伪分布式环境,性能不是首要目标,但合理的配置可以提升体验,并帮助你理解生产环境的调优思路。
1. 调整JVM堆内存大小
默认的堆内存可能较小,对于处理稍大的数据时容易引发GC或OOM。可以在
hadoop-env.sh
、
yarn-env.sh
和
mapred-env.sh
中调整。
# 在 hadoop-env.sh 中,为NameNode和DataNode设置
export HDFS_NAMENODE_OPTS="-Xmx1024m"
export HDFS_DATANODE_OPTS="-Xmx512m"
# 在 yarn-env.sh 中,为ResourceManager和NodeManager设置
export YARN_RESOURCEMANAGER_OPTS="-Xmx1024m"
export YARN_NODEMANAGER_OPTS="-Xmx512m"
# 在 mapred-env.sh 中,为MapReduce任务设置
export MAPRED_CHILD_OPTS="-Xmx512m"
具体数值需根据你的机器物理内存调整。例如,一台8GB内存的虚拟机,可以给NameNode和ResourceManager分配1-2GB,给DataNode和NodeManager分配512MB-1GB。
2. 优化HDFS块大小与副本数
伪分布式下,副本数必须为1。块大小(
dfs.blocksize
)默认为128MB。对于开发测试的小文件,可以适当调小(如32MB),以减少存储空间的浪费感。但注意,这只是一个学习性质的调整,生产环境会根据数据规模和集群大小慎重设定。
3. 关闭不必要的服务日志级别
Hadoop日志非常详细,有时会刷屏。可以在
log4j.properties
文件中调整特定类(如
org.apache.hadoop
)的日志级别为
WARN
或
ERROR
,减少控制台输出。但排查问题时,需要改回
INFO
或
DEBUG
。
踩坑实录
:有一次我在格式化NameNode后,直接拷贝了另一个环境的
data/tmp
目录过来,想“复用”数据,结果导致DataNode一直无法启动。日志报错五花八门,最终定位到就是
clusterID
不一致。所以,
Hadoop的元数据目录具有很强的环境绑定属性,不要随意迁移
。对于开发环境,每次重建时都干净地格式化反而是最省心的做法。
搭建过程就像一次精密的探险,每一步的配置都像在拧动一个齿轮。当所有齿轮咬合,服务成功启动并跑通第一个MapReduce作业时,那种成就感是看十篇教程也换不来的。这个基于OpenEuler的Hadoop环境,现在就是你探索大数据世界最趁手的一块实验田。接下来,你可以尝试在上面部署Hive、Spark,或者编写自己的MapReduce程序,让这片土地真正产出价值。
更多推荐


所有评论(0)