温馨提示×

Ubuntu下HDFS集群如何搭建

小樊
40
2025-11-11 07:06:46
栏目: 智能运维

Ubuntu下搭建HDFS集群详细步骤

1. 准备工作

  • 集群规划:确定集群角色(NameNode、DataNode、ResourceManager、NodeManager),建议至少1台NameNode+1台DataNode(生产环境需更多节点)。所有节点需在同一局域网,能互相通信(可通过ping命令测试)。
  • 硬件要求:每台节点至少4GB内存、500GB可用磁盘空间(生产环境需更高配置)。
  • 软件要求:Ubuntu 20.04及以上版本,Java 8(推荐OpenJDK)、Hadoop 3.x(推荐3.3.6及以上稳定版)。

2. 安装Java环境

Hadoop依赖Java运行,需先安装OpenJDK 8:

sudo apt update
sudo apt install -y openjdk-8-jdk
# 验证安装
java -version  # 应输出Java 8版本信息

3. 下载并解压Hadoop

从Apache官网下载Hadoop二进制包(选择稳定版本,如3.3.6),解压到/usr/local目录:

wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
sudo tar -xzvf hadoop-3.3.6.tar.gz -C /usr/local/
sudo mv /usr/local/hadoop-3.3.6 /usr/local/hadoop  # 重命名方便使用

4. 配置环境变量

编辑~/.bashrc文件(当前用户)或/etc/profile文件(所有用户),添加Hadoop和Java的环境变量:

echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> ~/.bashrc
echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc
# 使配置生效
source ~/.bashrc

5. 配置SSH免密登录

Hadoop节点间需通过SSH无密码通信,避免每次操作输入密码:

# 生成SSH密钥(若已有可跳过)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥复制到所有节点(包括自身)
ssh-copy-id user@namenode  # 替换为NameNode主机名
ssh-copy-id user@datanode1  # 替换为DataNode1主机名
ssh-copy-id user@datanode2  # 替换为DataNode2主机名(如有)
# 测试免密登录
ssh user@namenode  # 应无需密码进入
ssh user@datanode1   # 同上

6. 配置Hadoop核心文件

进入Hadoop配置目录$HADOOP_HOME/etc/hadoop,修改以下关键文件:

6.1 core-site.xml

配置HDFS的默认文件系统URI(需替换namenode为NameNode的实际主机名):

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://namenode:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/tmp</value>
    </property>
</configuration>

6.2 hdfs-site.xml

配置HDFS副本数(生产环境建议3)、NameNode/DataNode数据目录(需提前创建):

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>  <!-- 副本数,根据集群规模调整 -->
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/hadoop/data/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop/data/datanode</value>
    </property>
</configuration>

6.3 mapred-site.xml

配置MapReduce运行框架为YARN(需创建该文件,若不存在则复制模板):

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

编辑内容:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

6.4 yarn-site.xml

配置ResourceManager主机名和NodeManager的Shuffle服务:

<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>resourcemanager</value>  <!-- 替换为ResourceManager实际主机名 -->
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

7. 创建HDFS数据目录

在NameNode和DataNode节点上创建数据存储目录,并设置正确权限:

# 在NameNode节点上
sudo mkdir -p /usr/local/hadoop/data/namenode
# 在所有DataNode节点上
sudo mkdir -p /usr/local/hadoop/data/datanode
# 设置目录所有者(替换hdfs为Hadoop运行用户,通常为hdfs或当前用户)
sudo chown -R hdfs:hdfs /usr/local/hadoop/data

8. 格式化NameNode

首次启动HDFS前,必须格式化NameNode(会清空原有数据,仅第一次需要):

hdfs namenode -format

9. 启动HDFS集群

在NameNode节点上执行以下命令启动HDFS服务:

# 启动HDFS(包含NameNode、DataNode)
start-dfs.sh
# 查看进程是否启动成功
jps  # 应显示NameNode、DataNode进程

10. 验证集群状态

  • 检查HDFS状态:使用hdfs dfsadmin -report命令查看DataNode是否注册成功。
  • 查看Web界面:浏览器访问http://namenode:9870(Hadoop 3.x默认端口),可查看HDFS集群状态、存储信息。
  • 测试文件操作:上传/下载文件到HDFS,验证功能是否正常:
    hdfs dfs -mkdir -p /test  # 创建测试目录
    hdfs dfs -put $HADOOP_HOME/README.txt /test  # 上传文件
    hdfs dfs -ls /test  # 查看文件
    

常见问题解决

  • 权限问题:若启动时报权限错误,需确保HDFS数据目录的权限正确(chown -R hdfs:hdfs /usr/local/hadoop/data)。
  • 端口冲突:若端口被占用,可修改core-site.xml中的fs.defaultFS端口(如9000改为9001)或其他配置文件的端口。
  • 进程未启动:检查/usr/local/hadoop/logs目录下的日志文件(如hadoop-*-namenode-*.log),定位错误原因。

0