资讯动态

OpenEuler系统上Hadoop 3.2.2伪分布式环境搭建与配置详解

发布时间:2026/8/11 5:01:40 来源:尧图企业网站定制
1. 项目概述为什么要在OpenEuler上搞Hadoop最近在折腾一个数据中台的原型验证项目客户那边技术栈指定要用国产化的欧拉操作系统OpenEuler作为底层上层的大数据平台则选了Hadoop。这个组合听起来挺“硬核”的一个是国内主推的企业级Linux发行版另一个是开源大数据领域的“老大哥”。说实话一开始我也犯嘀咕Hadoop社区官方文档和网上铺天盖地的教程基本都是基于CentOS、Ubuntu这些“国际主流”系统写的在OpenEuler上会不会水土不服踩坑肯定是免不了的但折腾完一圈下来发现OpenEuler作为CentOS的“精神续作”兼容性其实相当不错只是有些细节需要特别注意。这个环境搭建的核心目标就是在一台或多台OpenEuler系统的服务器上部署一套Hadoop 3.2.2的伪分布式或完全分布式环境用于后续的开发、测试和概念验证。伪分布式模式是把所有Hadoop服务NameNode, DataNode, ResourceManager, NodeManager都装在一台机器上模拟集群行为非常适合学习和开发调试。而完全分布式则是真正的多节点集群用于生产或性能测试。今天这篇分享我会以伪分布式环境搭建为主线把从系统准备、环境配置到服务启动验证的全过程以及我踩过的那些“坑”都详细捋一遍。无论你是想尝鲜OpenEuler还是需要在国产化环境下部署Hadoop这篇实操记录应该都能给你省下不少查资料和排错的时间。2. 环境准备与系统调优工欲善其事必先利其器。在开始安装Hadoop之前我们必须先把OpenEuler这个“地基”打牢固。很多后续安装失败或者运行诡异的问题根源都出在系统基础环境没配置好。2.1 OpenEuler系统安装与初始化我使用的版本是OpenEuler 22.03 LTS。选择LTS长期支持版本是出于稳定性的考虑避免被滚动更新带来的兼容性问题困扰。安装过程与常见的CentOS 8/9非常相似可以通过官网下载ISO镜像在VMware、VirtualBox等虚拟机或物理机上安装。安装时有几个关键点需要注意软件选择建议选择“Server with GUI”或“Minimal Install”。如果只是做服务器最小化安装足够但如果你需要在图形界面下操作或者运行一些需要GUI支持的辅助工具带GUI的版本更方便。我这次选的是“Server with GUI”方便后续截图和演示。分区对于学习环境自动分区即可。如果是生产环境需要仔细规划例如将Hadoop的数据目录如/data/hadoop单独挂载到一块大容量磁盘上与系统盘分离这样既能提升I/O性能也便于管理和备份。网络配置务必配置静态IP。Hadoop集群节点间通过主机名通信依赖稳定的网络地址。在安装过程中就设置好静态IP比装完再改要省心得多。记下你的IP地址、子网掩码、网关和DNS。系统安装完成后第一件事不是急着装Hadoop而是进行一系列初始化操作。用root用户登录执行以下步骤# 1. 更新系统获取最新的安全补丁和软件包 dnf update -y # 2. 安装常用的基础工具如网络工具、解压工具等 dnf install -y vim wget net-tools tar gzip sshpass # 3. 关闭并禁用防火墙仅用于内网测试环境生产环境需配置策略 systemctl stop firewalld systemctl disable firewalld # 4. 关闭SELinux同样简化配置生产环境需评估 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config setenforce 0注意在生产环境中直接关闭防火墙和SELinux是极不安全的。正确的做法是开放Hadoop相关进程所需的特定端口如HDFS的8020、9000、50070YARN的8032、8088等并配置SELinux策略或设置为宽容模式。这里为了搭建过程顺畅我们选择关闭但你心里一定要清楚这个区别。2.2 创建专用用户与SSH免密登录配置Hadoop官方不建议使用root用户直接运行因此我们需要创建一个专门的用户比如hadoop。# 创建用户组和用户 groupadd hadoop useradd -g hadoop -m hadoop # 为用户设置密码 passwd hadoop接下来是至关重要的一步配置SSH免密登录。即使是伪分布式模式Hadoop的启动脚本也需要通过SSH连接到localhost来启动各个守护进程。如果每次都要输密码脚本会执行失败。# 切换到hadoop用户 su - hadoop # 生成SSH密钥对一路回车即可 ssh-keygen -t rsa # 将公钥追加到授权文件实现对本机的免密登录 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 修改授权文件权限权限过大SSH会拒绝 chmod 600 ~/.ssh/authorized_keys # 测试一下第一次可能需要输入yes确认之后应该直接登录无需密码 ssh localhost如果执行ssh localhost后不需要密码就进入了另一个shell并显示[hadooplocalhost ~]$说明配置成功。输入exit退回原来的会话。这里有个小坑OpenEuler默认的ssh服务配置可能比较严格。如果免密登录失败可以检查/etc/ssh/sshd_config文件确保以下配置项是开启的PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes # 为了方便调试可以先开启密码认证修改后需要重启SSH服务sudo systemctl restart sshd。2.3 JDK安装与环境变量配置Hadoop是Java写的所以JDK是必须的。Hadoop 3.2.2官方兼容Java 8和Java 11。我选择安装OpenJDK 11因为它是目前LTS版本且OpenEuler的仓库里就有。# 切换回root用户安装JDK exit # 从hadoop用户退出回到root dnf install -y java-11-openjdk-devel # 检查安装是否成功 java -version # 应该输出类似openjdk version 11.0.xx ...安装完成后需要为hadoop用户配置JAVA_HOME环境变量。Hadoop脚本会读取这个变量。# 首先找到JDK的安装路径 readlink -f $(which java) | sed s|/bin/java|| # 通常输出类似/usr/lib/jvm/java-11-openjdk-11.0.xx.x-x.x86_64 # 编辑hadoop用户的bash配置文件 su - hadoop vim ~/.bashrc在文件末尾添加以下内容请将路径替换为你实际查到的路径export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.xx.x-x.x86_64 export PATH$PATH:$JAVA_HOME/bin保存退出后执行source ~/.bashrc使配置生效。然后验证echo $JAVA_HOME # 应输出你设置的路径 java -version # 应正常显示版本3. Hadoop 3.2.2 部署与核心配置解析基础环境搞定现在可以请出主角Hadoop了。我们将采用从Apache官网下载压缩包手动配置的方式。这种方式最直接也最能理解各个组件和配置文件的作用。3.1 软件包下载与解压我们使用hadoop用户来操作。# 确保当前是hadoop用户在家目录下操作 cd ~ # 下载Hadoop 3.2.2二进制包。如果网络慢可以事先用其他工具下载好再上传。 wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz # 验证文件完整性可选但推荐 wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz.sha512 sha512sum -c hadoop-3.2.2.tar.gz.sha512 # 解压到指定目录我习惯放在/opt下方便管理 sudo tar -xzf hadoop-3.2.2.tar.gz -C /opt/ # 修改目录所有者让hadoop用户有权限 sudo chown -R hadoop:hadoop /opt/hadoop-3.2.2 # 创建软链接方便以后版本升级 sudo ln -s /opt/hadoop-3.2.2 /opt/hadoop # 将Hadoop添加到hadoop用户的环境变量 vim ~/.bashrc在.bashrc文件中追加export HADOOP_HOME/opt/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop保存并source ~/.bashrc。现在可以测试一下基础命令hadoop version应该能正确显示版本信息。3.2 伪分布式配置文件详解Hadoop的配置核心是$HADOOP_HOME/etc/hadoop/目录下的一系列XML文件。对于伪分布式我们需要修改其中四个关键文件。请务必理解每个配置项的含义而不是简单复制粘贴。1. 配置Hadoop核心属性 (core-site.xml)这个文件定义了Hadoop最基础的参数比如文件系统的默认URI。configuration !-- 指定HDFS的默认访问地址和端口。9000是HDFS内部通信端口 -- property namefs.defaultFS/name valuehdfs://localhost:9000/value /property !-- 指定Hadoop运行时产生的临时文件目录。需要手动创建并赋权 -- property namehadoop.tmp.dir/name value/home/hadoop/hadoop_tmp/value /property /configuration执行mkdir ~/hadoop_tmp创建这个目录。2. 配置HDFS (hdfs-site.xml)这个文件配置HDFS相关的参数比如副本数、数据存储路径等。configuration !-- 指定副本数量伪分布式只有一台机器所以只能是1 -- property namedfs.replication/name value1/value /property !-- NameNode数据存储目录包括元数据fsimage和编辑日志edits -- property namedfs.namenode.name.dir/name valuefile://${hadoop.tmp.dir}/dfs/name/value /property !-- DataNode数据块存储目录 -- property namedfs.datanode.data.dir/name valuefile://${hadoop.tmp.dir}/dfs/data/value /property !-- 是否开启权限检查学习环境可以关闭避免权限问题干扰 -- property namedfs.permissions.enabled/name valuefalse/value /property /configuration实操心得dfs.namenode.name.dir和dfs.datanode.data.dir的路径不要放在/tmp下因为/tmp目录可能被系统定期清理。我们使用前面在core-site.xml中定义的hadoop.tmp.dir变量来引用是个好习惯。3. 配置YARN资源管理器 (yarn-site.xml)YARN负责集群的资源管理和任务调度。configuration !-- 指定ResourceManager运行的主机 -- property nameyarn.resourcemanager.hostname/name valuelocalhost/value /property !-- NodeManager上运行的附属服务。Shuffle是MapReduce任务的关键步骤 -- property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property !-- 关闭虚拟内存检查避免因虚拟内存超限导致任务被杀 -- property nameyarn.nodemanager.vmem-check-enabled/name valuefalse/value /property !-- 关闭物理内存检查同样是为了简化环境 -- property nameyarn.nodemanager.pmem-check-enabled/name valuefalse/value /property /configuration注意事项在生产环境中vmem-check-enabled和pmem-check-enabled需要根据实际服务器内存情况精细配置以防止单个任务耗尽资源影响整个节点。学习环境关闭可以避免很多莫名其妙的Container启动失败。4. 配置MapReduce计算框架 (mapred-site.xml)这个文件告诉HadoopMapReduce作业应该跑在YARN框架上。configuration !-- 指定MapReduce运行在YARN框架上 -- property namemapreduce.framework.name/name valueyarn/value /property !-- 配置MapReduce作业历史服务器地址 -- property namemapreduce.jobhistory.address/name valuelocalhost:10020/value /property !-- 配置历史服务器Web UI地址 -- property namemapreduce.jobhistory.webapp.address/name valuelocalhost:19888/value /property /configuration5. 配置Hadoop环境脚本 (hadoop-env.sh)这个文件主要设置Hadoop守护进程运行时的环境变量。最关键的是确认JAVA_HOME已正确设置。# 打开文件 vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh # 找到 export JAVA_HOME 这一行取消注释并确保路径正确 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.xx.x-x.x86_64同样你可以在yarn-env.sh和mapred-env.sh中检查或设置JAVA_HOME但通常hadoop-env.sh的设置会被继承。4. 集群启动、验证与初体验配置文件全部修改完毕后激动人心的启动时刻到了。Hadoop的启动有严格的顺序。4.1 格式化HDFS与启动服务第一步格式化NameNode。这相当于对HDFS进行“初始化安装”会创建dfs.namenode.name.dir指定的目录结构。注意这个操作只在第一次搭建时执行重复执行会清空所有HDFS数据# 确保在hadoop用户下 hdfs namenode -format如果看到Storage directory ... has been successfully formatted和Exiting with status 0的提示说明格式化成功。第二步启动HDFS服务。# 这个脚本会启动NameNode和DataNode start-dfs.sh用jps命令查看Java进程应该能看到NameNode和DataNode。第三步启动YARN服务。start-yarn.sh再次使用jps应该能看到ResourceManager和NodeManager。第四步可选启动历史日志服务器。方便查看已完成的MapReduce作业详情。mr-jobhistory-daemon.sh start historyserverjps会多出一个JobHistoryServer进程。现在所有服务都启动了。你可以通过Web UI来直观地查看集群状态HDFS NameNode UI:http://你的服务器IP:9870/YARN ResourceManager UI:http://你的服务器IP:8088/MapReduce JobHistory UI:http://你的服务器IP:19888/如果是在本地虚拟机搭建可以直接用浏览器访问这些地址。看到管理页面就说明服务基本正常了。4.2 基础HDFS操作与WordCount示例光看界面不够我们得实际操作一下。首先在HDFS上创建用户目录这是Hadoop的惯例。# 在HDFS上为当前用户hadoop创建一个家目录 hdfs dfs -mkdir -p /user/hadoop # 查看根目录下的内容 hdfs dfs -ls /接下来运行Hadoop的“Hello World”——WordCount示例。这个例子会统计输入文件中每个单词出现的次数。准备本地输入文件cd ~ echo Hello World Hello OpenEuler file1.txt echo Hello Hadoop Goodbye OpenEuler file2.txt在HDFS上创建输入目录并上传文件hdfs dfs -mkdir /user/hadoop/input hdfs dfs -put file*.txt /user/hadoop/input hdfs dfs -ls /user/hadoop/input # 确认文件已上传运行MapReduce作业Hadoop安装包自带了很多示例JAR包。# 运行wordcount程序 # 格式hadoop jar jar包路径 主类 HDFS输入路径 HDFS输出路径 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /user/hadoop/input /user/hadoop/output命令执行后控制台会输出大量的Map和Reduce进度日志。最终看到Job completed successfully就成功了。查看结果# 查看输出目录会有一个_SUCCESS文件和一个结果文件 hdfs dfs -ls /user/hadoop/output # 查看统计结果 hdfs dfs -cat /user/hadoop/output/part-r-00000你应该能看到类似下面的输出Goodbye 1 Hadoop 1 Hello 3 OpenEuler 2 World 1这表明我们的Hadoop伪分布式集群已经可以正常运行计算任务了4.3 服务停止与日常管理测试完毕后可以按顺序停止服务mr-jobhistory-daemon.sh stop historyserver stop-yarn.sh stop-dfs.sh再次使用jps命令应该只剩下jps命令本身的进程。日常管理技巧所有启动/停止脚本都在$HADOOP_HOME/sbin/目录下。可以通过hdfs dfsadmin -report查看HDFS集群状态和数据节点报告。可以通过yarn node -list查看YARN集群的节点状态。最重要的心得遇到服务启动失败第一件事是查日志日志文件位于$HADOOP_HOME/logs/目录下以hadoop-hadoop-进程名-主机名.log命名。比如NameNode的日志就是hadoop-hadoop-namenode-localhost.log。90%的问题都能在日志中找到明确的错误信息。5. 避坑指南与进阶配置搭建过程很少一帆风顺下面是我在OpenEuler上遇到的一些典型问题及解决方案希望能帮你提前扫雷。5.1 常见启动失败问题排查问题1启动start-dfs.sh时DataNode启动失败或自动关闭。现象jps看不到DataNode或者看到后很快消失。查看DataNode日志 (logs/hadoop-hadoop-datanode-*.log) 常有Incompatible clusterIDs或java.io.IOException: Incompatible namespaceIDs错误。原因这是最经典的问题。通常是因为多次执行了hdfs namenode -format。每次格式化都会为NameNode生成一个新的集群ID (clusterID)而旧的DataNode还保存着旧的ID导致不匹配。解决停止所有Hadoop服务。彻底清理Hadoop的临时数据目录即core-site.xml中hadoop.tmp.dir指定的路径我的是/home/hadoop/hadoop_tmp。执行rm -rf /home/hadoop/hadoop_tmp。重新格式化NameNodehdfs namenode -format。重新启动服务。根本解法除非确定要清空所有HDFS数据否则不要轻易重新格式化。如果需要重置务必先彻底删除所有节点的数据目录。问题2无法通过Web UI访问9870或8088端口。现象浏览器显示无法连接。原因1防火墙未关闭。即使在伪分布式下本地访问也可能被防火墙规则阻止。解决确认已按2.1步骤关闭防火墙或开放了对应端口。原因2配置文件中的监听地址绑定到了127.0.0.1。默认配置可能只监听回环地址导致外部IP无法访问。解决在core-site.xml中为NameNode的RPC地址显式配置0.0.0.0不推荐生产环境或在hdfs-site.xml中配置dfs.namenode.http-address为0.0.0.0:9870。YARN的Web UI地址通常在yarn-site.xml的yarn.resourcemanager.webapp.address配置。更安全的做法是配置正确的服务器IP。问题3运行MapReduce作业失败提示Container exited with a non-zero exit code 1。现象在YARN的Web UI8088端口上查看任务详情发现Container运行失败。原因非常广泛可能是内存不足、类路径问题、脚本执行权限问题等。排查看日志在YARN UI的任务页面有“Logs”链接可以查看每个Container包括ApplicationMaster和Map/Reduce Task的标准输出stdout、标准错误stderr和系统日志。这是最直接的排错入口。检查环境变量确认JAVA_HOME在hadoop-env.sh中正确设置并且所有节点一致。调整YARN资源参数如果日志提示内存不足可以适当调大yarn-site.xml中的yarn.nodemanager.resource.memory-mbNodeManager总内存和yarn.scheduler.maximum-allocation-mb单个容器最大内存。对于学习环境可以先把虚拟内存检查关掉如3.2节配置所示。5.2 OpenEuler特定优化与注意事项依赖库问题OpenEuler基于openEuler其软件仓库非常丰富。如果编译Hadoop原生库如Snappy、Zlib压缩库或运行某些需要本地库的组件时出错可以通过dnf search和dnf install来安装对应的-devel开发包。例如安装Snappysudo dnf install snappy-devel。时间同步对于分布式集群时间同步至关重要。OpenEuler默认使用chronyd服务。确保所有节点时间一致sudo systemctl status chronyd # 查看状态 sudo chronyc sources -v # 查看时间源 sudo chronyc makestep # 手动同步文件描述符与进程数限制Hadoop在高负载下可能会打开大量文件和进程。可以调整系统限制# 编辑 /etc/security/limits.conf在末尾为hadoop用户添加 hadoop soft nofile 65536 hadoop hard nofile 65536 hadoop soft nproc 65536 hadoop hard nproc 65536修改后需要重新登录hadoop用户生效。Swap分区影响如果服务器开启了Swap在内存紧张时可能会发生内存交换导致Hadoop进程性能急剧下降。可以考虑降低vm.swappiness的值如设置为10或5甚至关闭Swap仅限内存充足的测试环境。# 临时生效 sudo sysctl vm.swappiness10 # 永久生效编辑 /etc/sysctl.conf添加 vm.swappiness105.3 从伪分布式到完全分布式如果你有多台OpenEuler服务器想搭建完全分布式集群伪分布式环境是一个完美的跳板。主要扩展步骤如下节点规划通常需要至少3个节点分别作为主节点Master运行NameNode和ResourceManager、从节点1Slave1运行DataNode和NodeManager、从节点2Slave2运行DataNode和NodeManager。生产环境需要更多。同步环境在所有节点上重复第2章的操作创建用户、配置SSH、安装JDK。关键是配置Master到所有Slave节点包括自己的SSH免密登录以及所有Slave节点到Master的免密登录用于某些管理脚本。修改配置文件core-site.xml中的fs.defaultFS应指向Master节点的主机名或IP如hdfs://master:9000。hdfs-site.xml的dfs.replication可以设置为2或3根据Slave节点数。yarn-site.xml中的yarn.resourcemanager.hostname指向Master节点。新增workers文件Hadoop 3.x之前是slaves文件列出所有DataNode和NodeManager节点的主机名每行一个。分发安装包和配置将Master节点上配置好的$HADOOP_HOME整个目录使用scp或rsync同步到所有Slave节点。启动集群在Master节点上执行start-dfs.sh和start-yarn.sh脚本会自动读取workers文件通过SSH远程启动所有从节点上的服务。这个过程比伪分布式复杂但核心原理相通。每完成一步都建议用jps命令在各个节点上验证服务是否按预期启动。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价