搭建Hadoop 2.x MapReduce环境,核心是配置好HDFS和YARN,并确保MapReduce作业能正确提交到集群。
搭建Hadoop 2.x环境前的必要准备
在动手搭建之前,先理清几个基础条件,Hadoop 2.x依赖Java运行环境,同时节点间需要免密通信,否则后续启动集群时会频频报错。
-
系统与软件要求
Hadoop官方推荐在Linux下运行,CentOS 7 或 Ubuntu 16.04 以上版本均可,JDK版本建议用Oracle JDK 1.8,OpenJDK 8 也能用,但部分生产环境会遇到兼容性问题,Hadoop 2.x的安装包可以从Apache官网直接下载,选择稳定版如2.7.7或2.10.1。参考2 -
JDK配置与SSH免密登录
先安装JDK,设置JAVA_HOME环境变量,然后创建hadoop用户,配置SSH免密登录这是Hadoop节点间通信的基础,执行ssh-keygen -t rsa生成密钥,再用ssh-copy-id分发到所有节点(包括本机),这一步漏掉,后续启动DataNode和NodeManager时会反复要求输入密码。 -
网络与防火墙
集群内所有主机需要互通,hosts文件里添加映射关系,防火墙关闭或开放必要端口:HDFS的NameNode默认端口8020/9000,YARN的ResourceManager端口8032,MapReduce历史服务器端口19888,如果是在云服务器上搭建,记得在安全组规则里放行这些端口。参考2
Hadoop 2.x MapReduce环境搭建步骤详解
Hadoop 2.x的安装目录通常放在/usr/local/hadoop,解压后重点修改四个配置文件,其他参数保持默认即可。
配置文件核心参数解读
- core-site.xml
设置HDFS的默认文件系统地址,例如hdfs://master:9000,临时目录
hadoop.tmp.dir要指定一个磁盘空间充足的路径,否则默认的/tmp在重启后容易被清空。 - hdfs-site.xml
数据块副本数dfs.replication,伪分布式环境设成1即可,NameNode和DataNode的数据目录单独指定,避免与系统盘混用。 - yarn-site.xml
启用YARN的ResourceManager和NodeManager。yarn.nodemanager.aux-services设为mapreduce_shuffle,这是MapReduce在YARN上运行的必要配置,资源参数yarn.nodemanager.resource.memory-mb和yarn.scheduler.minimum-allocation-mb根据机器内存调整,测试环境给2GB左右就够了。 - mapred-site.xml
从模板复制mapred-site.xml.template,设置mapreduce.framework.name为yarn,让MapReduce作业走YARN资源调度,历史服务器配置mapreduce.jobhistory.address,方便后续查看作业日志。
初始化与启动集群
配置文件修改完毕,先格式化NameNode:hdfs namenode -format,只有首次需要,重复格式化会丢失DataNode上的数据块,接着启动HDFS和YARN守护进程,推荐使用start-dfs.sh和start-yarn.sh脚本,如果节点分布在不同主机,脚本会自动根据slaves文件(或workers文件,2.7版本用slaves)启动各节点进程。
启动后,执行jps命令检查进程,Master节点应该看到NameNode、SecondaryNameNode、ResourceManager;Worker节点看到DataNode和NodeManager,如果缺少某个进程,去对应日志文件($HADOOP_HOME/logs)里排查,常见原因包括:配置文件路径写错、SSH免密未生效、端口被占用。

验证Hadoop 2.x MapReduce环境是否成功
环境搭建完,最直接的验证方式就是跑一个官方MapReduce样例,Hadoop安装包自带hadoop-mapreduce-examples-.jar,用wordcount作为入门测试。
运行MapReduce官方示例
先在HDFS上创建输入目录并上传文本文件:
hdfs dfs -mkdir /input
hdfs dfs -put /etc/hosts /input
然后提交作业:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /input /output
作业执行过程中,YARN的Web界面(http://master:8088)可以实时查看任务进度,如果最终输出目录/output里出现part-r-00000文件,且内容正确,说明整个环境配置无误,据统计,超过九成的刚接触Hadoop的开发者通过这一步骤就能确认环境是否准备就绪。
常见问题排查
- ClassNotFoundException: 通常是因为
HADOOP_CLASSPATH未设置,或者依赖的第三方JAR包没有分发到所有节点,检查mapred-site.xml里的mapreduce.application.classpath,确保包含了Hadoop公共库。 - Container killed by YARN: 内存不足导致,在
yarn-site.xml中增大yarn.nodemanager.resource.memory-mb,并相应调低yarn.scheduler.minimum-allocation-mb。 - NameNode safemode: 刚启动时NameNode会自动进入安全模式,等待一段时间或手动退出:
hdfs dfsadmin -safemode leave,如果数据块损坏,先修复再用hdfs fsck检查文件系统。
Hadoop 2.x MapReduce环境搭建常见问题
Q1:伪分布式环境里,为什么DataNode启动后立即消失?
检查hdfs-site.xml中的dfs.datanode.data.dir是否指向了正确的目录,同时确认NameNode的dfs.namenode.name.dir和DataNode的目录不在同一分区,格式化时若重复执行,NameSpace ID不匹配也会导致DataNode拒绝连接,解决方法是在hdfs-site.xml中指定dfs.datanode.data.dir为新目录,然后重新格式化。
Q2:MapReduce作业一直卡在Map阶段,进度停在0%?
多数情况下是YARN资源不足,观察ResourceManager界面,如果分配的内存不够,Container会一直等待,调大yarn.scheduler.maximum-allocation-mb,并确保mapreduce.map.memory.mb小于该值,另一种可能是输入文件过大且没有分片,检查mapreduce.input.fileinputformat.split.maxsize参数。
Q3:Hadoop 2.x和3.x搭建流程上最大的区别在哪里?
Hadoop 3.x引入了workers文件替代slaves,并提供了hadoop命令脚本统一管理,在配置上,3.x默认启用了erasure coding,对存储利用率有优化,但搭建基础步骤相似,很多迁移到3.x的团队反馈,主要差异在于需要调整hadoop-env.sh中的HADOOP_OPTS参数,以适应新的Java版本。
搭建Hadoop 2.x MapReduce环境,核心就是吃透配置文件的分工,并确保HDFS和YARN两个层面都正常通信,当你手头有一个稳定的集群后,后续的MapReduce开发、数据迁移、性能调优都会变得顺理成章,整个过程不需要多少花哨技巧,按部就班把每个参数敲对,就能得到一个可用的生产级环境。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/532602.html

