3. Hadoop集群搭建:从零开始,手把手带你跑起来
好,咱们进入正题。这一章,我带你亲手搭一个Hadoop集群。别怕,这事儿我干过不下几十次了,踩过的坑比你们见过的Hadoop版本还多。说白了,集群搭建就是个熟练工,你跟着我走一遍,后面就顺了。
本章核心脉络:下载解压 → 改四个配置文件 → 初始化 → 启动 → 验证。就这五步,少一步都跑不起来。
3.1 下载与解压:选对版本,少走弯路
我个人习惯用Apache Hadoop 3.3.x系列。为什么?因为3.x以后,HDFS支持了纠删码,性能提升明显。你如果还在用2.x,嗯,也不是不行,但新项目我建议直接上3.x。
下载地址我一般去Apache官网的镜像站。别去第三方网站下,我吃过亏——有次下到一个被篡改的包,集群跑起来各种诡异报错,排查了两天才发现是包的问题。
# 下载(以3.3.6为例)
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
# 解压到指定目录
tar -xzf hadoop-3.3.6.tar.gz -C /usr/local/
# 创建软链接,方便以后升级
ln -s /usr/local/hadoop-3.3.6 /usr/local/hadoop
我的小技巧:解压后第一件事,检查一下bin目录下有没有hadoop这个可执行文件。我曾经遇到过解压不完整的情况,跑hadoop version直接报错。用 ls -l /usr/local/hadoop/bin/hadoop 看一眼,心里踏实。
3.2 核心配置文件:四个文件,一个都不能少
配置Hadoop,说白了就是改四个XML文件。你想想看,Hadoop自己也不知道你的数据存在哪、副本要几个、计算框架用啥。这些信息,全靠这四个文件告诉它。
3.2.1 core-site.xml — 集群的“门牌号”
这个文件告诉Hadoop:你的老大(NameNode)在哪,临时文件放哪。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
<description>NameNode的地址和端口</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
<description>Hadoop临时文件目录,别放/tmp下,重启就没了</description>
</property>
</configuration>
注意:hadoop.tmp.dir这个路径,一定要提前创建好,并且确保Hadoop用户有读写权限。我曾经图省事没建目录,结果格式化NameNode时报错“权限不足”,折腾了半小时才发现是目录没建。
3.2.2 hdfs-site.xml — 数据怎么存,你说了算
这个文件管的是HDFS的行为。副本数设多少?数据块多大?数据存哪个盘?都在这里配。
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>副本数,生产环境至少3,测试可以设1</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/namenode</value>
<description>NameNode元数据存储目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/datanode</value>
<description>DataNode数据存储目录</description>
</property>
</configuration>
这里我要多说一句。副本数设3,不是拍脑袋定的。HDFS的设计哲学是“硬件故障是常态”,三副本能保证在坏掉一台机器的情况下,数据依然完整。我在项目中遇到过磁盘坏道,就是因为副本数够,数据一点没丢。
3.2.3 mapred-site.xml — 告诉Hadoop:用YARN跑计算
这个文件以前叫mapred-site.xml.template,需要你手动重命名。它告诉MapReduce:你的计算任务交给YARN来调度。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>使用YARN作为资源调度框架</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
<description>历史服务器地址,方便查看已完成的任务</description>
</property>
</configuration>
3.2.4 yarn-site.xml — 资源调度的大脑
YARN是Hadoop 2.x以后引入的资源管理器。说白了,它就是集群的“包工头”,谁要多少资源,它说了算。
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
<description>ResourceManager运行在哪台机器上</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>NodeManager的辅助服务,MapReduce必须配这个</description>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
<description>每个NodeManager可用内存,根据机器配置调整</description>
</property>
</configuration>
配置检查清单:
- 四个文件都放在
$HADOOP_HOME/etc/hadoop/目录下 - 所有路径目录都已创建,权限正确
- 主机名(如master)在/etc/hosts中已配置
- SSH免密登录已设置好(我习惯用ssh-keygen生成密钥对)
3.3 集群初始化与启动:最激动人心的一步
配置写好了,接下来就是见证奇迹的时刻。不过我得提醒你,第一次格式化NameNode时,手别抖。
# 第一步:格式化NameNode(只在主节点执行一次!)
hdfs namenode -format
# 第二步:启动HDFS
start-dfs.sh
# 第三步:启动YARN
start-yarn.sh
# 或者一步到位
start-all.sh
血的教训:格式化NameNode只能做一次!如果你不小心格式化了两次,集群里所有元数据都会丢失。我曾经在测试环境手滑了,结果整个集群的数据都找不回来了。所以,格式化前一定确认:这是第一次搭建,不是重启。
启动后,用 jps 命令看看进程都在不在。主节点上应该看到:NameNode、ResourceManager、SecondaryNameNode。从节点上应该看到:DataNode、NodeManager。
# 主节点进程示例
[root@master ~]# jps
12345 NameNode
12346 ResourceManager
12347 SecondaryNameNode
12348 Jps
# 从节点进程示例
[root@slave1 ~]# jps
23456 DataNode
23457 NodeManager
23458 Jps
3.4 Web UI验证:眼见为实
命令行看到进程还不够,我习惯再用浏览器看一眼。Hadoop提供了两个Web界面,一个管存储,一个管计算。
| 服务 | URL | 端口 | 看什么 |
|---|---|---|---|
| HDFS NameNode | http://master:9870 | 9870 | 数据节点状态、存储容量、文件系统浏览 |
| YARN ResourceManager | http://master:8088 | 8088 | 集群资源使用、正在运行的任务、节点列表 |
打开浏览器,输入 http://master:9870。如果看到Hadoop的Logo,下面显示“NameNode - master”,恭喜你,HDFS跑起来了。再打开 http://master:8088,看到YARN的界面,说明资源调度也没问题。
一个小细节:如果Web界面打不开,先别急着怀疑配置。检查一下防火墙:systemctl stop firewalld。我遇到过好几次,配置全对,就是防火墙挡着,关了立马就能访问。
嗯,到这里,你的Hadoop集群就算搭好了。从下载到验证,每一步我都带着你走了一遍。你可能会觉得步骤有点多,但相信我,多搭几次就熟了。后面我们就要在这个集群上跑真正的数据处理任务了。
公众号:蓝海资料掘金营,微信deep3321