第4章:Hadoop集群基础搭建——用户创建、目录规划与配置文件详解

好,咱们进入正题。这一章是Hadoop集群搭建的实操核心。说白了,前面那些理论铺垫,都是为了这一刻能顺利把集群跑起来。

我记得第一次给客户搭集群时,光用户创建就折腾了半天。为啥?权限搞错了,后面各种报错。所以这一章,我会把每个细节掰开揉碎讲清楚。

4.1 用户创建与目录规划

先说说用户。Hadoop不建议用root跑,这是大忌。我习惯创建一个专门的hadoop用户,所有服务都归它管。

# 创建hadoop用户组和用户
groupadd hadoop
useradd -g hadoop -m hadoop
passwd hadoop

# 配置sudo权限(可选,但建议)
echo "hadoop ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

嗯,这里要注意:密码别设太复杂,但也不能太简单。我一般用hadoop123这种,方便记忆,但生产环境请自行加强。

接下来是目录规划。这个很多人会忽略,但恰恰是后期运维的噩梦来源。我见过一个团队把所有数据都塞在/tmp下,结果磁盘满了都不知道。

我个人习惯这样规划:

目录路径 用途 建议大小
/opt/hadoop Hadoop安装目录 10GB
/data/hadoop/tmp 临时文件目录 50GB
/data/hadoop/namenode NameNode元数据 100GB(SSD)
/data/hadoop/datanode DataNode数据块 剩余所有空间
/var/log/hadoop 日志目录 20GB
# 创建目录并授权
mkdir -p /opt/hadoop
mkdir -p /data/hadoop/{tmp,namenode,datanode}
mkdir -p /var/log/hadoop

chown -R hadoop:hadoop /opt/hadoop /data/hadoop /var/log/hadoop
我曾经踩过的坑:NameNode目录千万别放在普通磁盘上。元数据读写频繁,用SSD能明显提升集群响应速度。有一次客户集群NameNode响应慢,查了半天发现是机械磁盘的IO瓶颈。

4.2 配置文件详解

配置文件是Hadoop的灵魂。你想想看,几十个参数,每个都影响集群行为。我刚开始学的时候,看着这些XML文件就头大。但后来发现,核心就四个文件。

4.2.1 core-site.xml

这个文件管的是全局配置。最核心的就是文件系统地址和临时目录。

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
        <description>HDFS的访问入口,master是NameNode主机名</description>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop/tmp</value>
        <description>临时文件目录,一定要和前面规划的一致</description>
    </property>
</configuration>

这里有个细节:fs.defaultFS的值决定了客户端怎么连HDFS。我习惯用主机名而不是IP,因为后期扩容时主机名更容易管理。

4.2.2 hdfs-site.xml

HDFS的专属配置。副本数、块大小、NameNode和DataNode的存储路径都在这里。

<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>
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
        <description>块大小,128MB,默认就是128MB</description>
    </property>
</configuration>
我的经验:副本数设3是黄金法则。设少了数据不安全,设多了浪费存储。有一次客户设了5副本,结果磁盘空间直接爆了。

4.2.3 mapred-site.xml

MapReduce的配置。说白了就是告诉系统,计算框架用什么跑。

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

嗯,这里要注意:mapred-site.xml这个文件默认不存在,需要从模板复制:

cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml

4.2.4 yarn-site.xml

YARN的配置。资源管理器、节点管理器都在这里定义。

<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需要shuffle</description>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>
核心要点:这四个配置文件必须保持一致。比如core-site.xml里定义了master:9000,那所有节点上的这个值都要一样。我曾经因为一个节点配错了IP,导致整个集群连不上。

4.3 集群启动与验证

配置文件搞定后,就是激动人心的启动环节了。但别急,先做一步初始化。

# 格式化NameNode(只在master上执行一次)
hdfs namenode -format

格式化会清空NameNode的元数据。所以生产环境千万别乱执行。我见过有人手滑,把生产集群格式化了...嗯,那画面太美不敢看。

启动集群有两种方式:

  1. 一键启动(适合测试环境)
# 启动HDFS
start-dfs.sh

# 启动YARN
start-yarn.sh
  1. 逐进程启动(适合生产环境,方便排查问题)
# 在master上启动NameNode
hdfs --daemon start namenode

# 在所有worker上启动DataNode
hdfs --daemon start datanode

# 在master上启动ResourceManager
yarn --daemon start resourcemanager

# 在所有worker上启动NodeManager
yarn --daemon start nodemanager

启动后怎么验证?我一般用这三板斧:

第一板斧:看进程

jps

在master上应该看到:NameNodeResourceManager。在worker上应该看到:DataNodeNodeManager

第二板斧:看Web UI

  • HDFS管理界面:http://master:9870
  • YARN管理界面:http://master:8088

打开浏览器,能看到集群状态、节点列表、存储使用情况。如果页面空白,八成是防火墙没关或者端口没开。

第三板斧:跑个测试

# 创建一个测试目录
hdfs dfs -mkdir /test

# 上传一个文件
hdfs dfs -put /etc/hosts /test/

# 跑一个示例程序
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 10 100

如果能看到Job FinishedPi的值,恭喜你,集群搭建成功了。

避坑指南:启动时如果报Incompatible clusterIDs,说明DataNode的clusterID和NameNode不匹配。解决办法是清空/data/hadoop/datanode目录下的内容,然后重新启动。我当年被这个坑折腾了一下午。

好了,这一章的内容就到这里。配置文件是Hadoop的骨架,骨架搭好了,后面调优才有基础。下一章我们会聊集群的高可用配置,到时候再细说。