Hadoop 3.3.6 单机伪分布式部署:Ubuntu 22.04 下 5 个核心配置文件详解

1. 环境准备与基础配置

在开始Hadoop 3.3.6的伪分布式部署前,我们需要确保系统环境满足基本要求。Ubuntu 22.04 LTS作为稳定的Linux发行版,是理想的运行平台。以下是需要完成的准备工作:

系统要求

  • 至少4GB内存(8GB以上更佳)
  • 50GB可用磁盘空间
  • Java 8或11(推荐OpenJDK 11)
  • SSH服务

首先安装必要的软件包:

sudo apt update
sudo apt install -y openjdk-11-jdk ssh pdsh

配置Java环境变量,编辑 ~/.bashrc 文件添加以下内容:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

验证Java安装:

java -version

接下来设置SSH免密登录:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

测试SSH连接:

ssh localhost

2. Hadoop安装与基础配置

从Apache官网下载Hadoop 3.3.6并解压:

wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -xzvf hadoop-3.3.6.tar.gz -C /usr/local
cd /usr/local
sudo mv hadoop-3.3.6 hadoop
sudo chown -R $USER:$USER hadoop

配置Hadoop环境变量,在 ~/.bashrc 中添加:

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME

应用配置并验证:

source ~/.bashrc
hadoop version

3. 核心配置文件详解

3.1 core-site.xml配置

core-site.xml 是Hadoop的核心配置文件,定义了全局参数。创建或编辑 $HADOOP_HOME/etc/hadoop/core-site.xml

<configuration>
    <!-- 定义HDFS的默认文件系统URI -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
    
    <!-- Hadoop临时文件存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/tmp</value>
    </property>
    
    <!-- 启用WebHDFS服务 -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>$(whoami)</value>
    </property>
    
    <!-- 文件系统回收站设置 -->
    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>
    </property>
</configuration>

关键参数说明:

  • fs.defaultFS :定义HDFS的默认访问地址和端口
  • hadoop.tmp.dir :指定Hadoop临时文件目录,确保该目录存在并有写权限
  • fs.trash.interval :设置文件删除后保留在回收站中的时间(分钟)

3.2 hdfs-site.xml配置

hdfs-site.xml 专门用于HDFS相关配置。编辑 $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration>
    <!-- 数据块副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    
    <!-- NameNode元数据存储路径 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/name</value>
    </property>
    
    <!-- DataNode数据存储路径 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/data</value>
    </property>
    
    <!-- 启用Web UI访问 -->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    
    <!-- NameNode Web UI访问地址 -->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>0.0.0.0:9870</value>
    </property>
    
    <!-- 启用权限检查 -->
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

关键参数说明:

  • dfs.replication :在伪分布式模式下设置为1,生产环境通常为3
  • dfs.namenode.name.dir :NameNode存储文件系统元数据的位置
  • dfs.webhdfs.enabled :启用HTTP REST API访问HDFS

3.3 mapred-site.xml配置

mapred-site.xml 负责MapReduce框架的配置。编辑 $HADOOP_HOME/etc/hadoop/mapred-site.xml

<configuration>
    <!-- 指定MapReduce运行框架 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    
    <!-- MapReduce应用主节点地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>localhost:10020</value>
    </property>
    
    <!-- MapReduce历史服务器Web UI地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>localhost:19888</value>
    </property>
    
    <!-- Map任务内存限制 -->
    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>1536</value>
    </property>
    
    <!-- Reduce任务内存限制 -->
    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>3072</value>
    </property>
</configuration>

关键参数说明:

  • mapreduce.framework.name :设置为yarn以使用YARN资源管理器
  • 内存参数应根据实际机器配置调整,避免OOM错误

3.4 yarn-site.xml配置

yarn-site.xml 配置YARN资源管理器。编辑 $HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration>
    <!-- 指定ResourceManager地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>localhost</value>
    </property>
    
    <!-- NodeManager上运行的附属服务 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!-- ResourceManager Web UI地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>localhost:8088</value>
    </property>
    
    <!-- 启用日志聚合 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    
    <!-- 日志保留时间 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
    
    <!-- 禁用虚拟内存检查 -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>

关键参数说明:

  • yarn.nodemanager.aux-services :必须设置为mapreduce_shuffle以支持MapReduce
  • yarn.log-aggregation-enable :启用日志聚合便于调试

3.5 hadoop-env.sh配置

hadoop-env.sh 设置Hadoop运行环境变量。编辑 $HADOOP_HOME/etc/hadoop/hadoop-env.sh

# 设置Java安装路径
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

# Hadoop日志目录
export HADOOP_LOG_DIR=/usr/local/hadoop/logs

# 设置Hadoop PID文件目录
export HADOOP_PID_DIR=/usr/local/hadoop/pids

# 设置Hadoop堆内存大小
export HADOOP_HEAPSIZE_MAX=1024m

# 启用远程调试
# export HADOOP_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

注意:在生产环境中,应根据服务器配置适当调整HADOOP_HEAPSIZE_MAX参数

4. 系统启动与验证

4.1 格式化HDFS

首次启动前需要格式化NameNode:

hdfs namenode -format

成功格式化后应看到类似输出:

Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted

4.2 启动Hadoop服务

使用以下脚本启动所有服务:

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver

验证服务是否正常运行:

jps

应看到以下关键进程:

NameNode
DataNode
ResourceManager
NodeManager
SecondaryNameNode
JobHistoryServer
Jps

4.3 验证部署

HDFS验证

hdfs dfs -mkdir -p /user/$(whoami)
hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /user/$(whoami)/input
hdfs dfs -ls /user/$(whoami)/input

MapReduce验证

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/$(whoami)/input /user/$(whoami)/output

查看结果:

hdfs dfs -cat /user/$(whoami)/output/*

Web UI访问

  • NameNode: http://localhost:9870
  • ResourceManager: http://localhost:8088
  • JobHistory: http://localhost:19888

5. 高级配置与优化

5.1 性能调优参数

hdfs-site.xml 中添加以下性能相关配置:

<property>
    <name>dfs.blocksize</name>
    <value>128m</value>
</property>
<property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
</property>
<property>
    <name>dfs.datanode.max.xcievers</name>
    <value>4096</value>
</property>

5.2 YARN资源管理

优化 yarn-site.xml 资源配置:

<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
</property>
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>6144</value>
</property>
<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>4</value>
</property>

5.3 安全配置

启用简单认证,在 core-site.xml 中添加:

<property>
    <name>hadoop.http.authentication.type</name>
    <value>simple</value>
</property>
<property>
    <name>hadoop.http.filter.initializers</name>
    <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
</property>

5.4 日志配置

配置日志级别,编辑 $HADOOP_HOME/etc/hadoop/log4j.properties

# 设置NameNode日志级别为INFO
log4j.logger.org.apache.hadoop.hdfs.server.namenode=INFO
# 设置DataNode日志级别为WARN
log4j.logger.org.apache.hadoop.hdfs.server.datanode=WARN
# 启用滚动日志
log4j.appender.RFA=org.apache.log4j.RollingFileAppender

6. 常见问题解决

问题1:端口冲突

解决方案:

  • 检查端口占用: netstat -tulnp | grep <端口号>
  • 修改冲突端口配置

问题2:磁盘空间不足

解决方案:

  • 清理临时文件: hdfs dfsadmin -report
  • 扩展磁盘空间或调整数据目录

问题3:Web UI无法访问

解决方案:

  • 检查防火墙设置: sudo ufw status
  • 开放必要端口: sudo ufw allow 9870/tcp

问题4:权限问题

解决方案:

  • 确保所有服务以相同用户运行
  • 检查文件权限: hdfs dfs -ls /
  • 临时禁用权限检查(仅测试环境):
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

7. 维护与管理脚本

创建启动/停止脚本 hadoop-cluster.sh

#!/bin/bash

case $1 in
start)
    echo "Starting Hadoop cluster..."
    start-dfs.sh
    start-yarn.sh
    mr-jobhistory-daemon.sh start historyserver
    ;;
stop)
    echo "Stopping Hadoop cluster..."
    mr-jobhistory-daemon.sh stop historyserver
    stop-yarn.sh
    stop-dfs.sh
    ;;
status)
    jps
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
    ;;
esac

赋予执行权限并使用:

chmod +x hadoop-cluster.sh
./hadoop-cluster.sh start

8. 数据备份与恢复

NameNode元数据备份

# 手动备份
hdfs dfsadmin -fetchImage ~/namenode_backup

# 配置自动备份(在hdfs-site.xml中)
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file://${hadoop.tmp.dir}/dfs/name,file:///backup/dfs/name</value>
</property>

数据导出/导入

# 导出HDFS数据到本地
hadoop fs -copyToLocal /hdfs/path /local/path

# 从本地导入数据
hadoop fs -copyFromLocal /local/path /hdfs/path

9. 监控与性能分析

使用Hadoop自带工具

# HDFS健康状况
hdfs dfsadmin -report

# 磁盘使用情况
hdfs dfs -df -h

# YARN应用列表
yarn application -list

配置Ganglia监控

  1. 安装Ganglia监控组件
  2. hadoop-metrics2.properties 中配置:
*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
*.sink.ganglia.period=10
namenode.sink.ganglia.servers=localhost:8649
datanode.sink.ganglia.servers=localhost:8649

10. 升级与迁移

版本升级步骤

  1. 备份配置和数据
  2. 停止所有Hadoop服务
  3. 安装新版本到不同目录
  4. 迁移配置文件
  5. 启动服务并验证

数据迁移工具

# 使用DistCp跨集群复制
hadoop distcp hdfs://old-cluster:8020/path hdfs://new-cluster:8020/path

在实际使用中发现,伪分布式模式虽然方便开发测试,但某些性能指标与完全分布式环境存在差异,特别是在网络IO和磁盘吞吐方面。建议在性能测试时使用与生产环境相似的配置。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐