前置准备工作:

准备一份适用于 Linux 环境的 JDK 压缩文件,可前往官网下载:
Java Archive | Oracle

拉取 apache/hadoop 镜像

docker pull apache/hadoop:3.4.1

创建并启动 Hadoop 容器

docker run -itd --name=hadoop-node apache/hadoop:3.4.1 bash -c "tail -f /dev/null"

复制下载好的 JDK 到容器

docker cp ./jdk-8u431-linux-x64.tar.gz hadoop-node:/usr/local/

以 root 用户身份进入 hadoop-node 容器的交互式终端

docker exec -u root -it hadoop-node bash

解压 JDK

tar -zxvf /usr/local/jdk-8u431-linux-x64.tar.gz -C /usr/local

修复 CentOS 系统的 YUM 软件源(默认源可能已失效)

cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

刷新 YUM 缓存并更新系统

yum clean all && yum makecache
yum update -y

(可选)安装 vim 文本编辑器和 which 命令

yum -y install vim
yum -y install which

后续可能需要通过 SSH 登录容器,需设置或修改容器内 root 用户的密码

passwd root

安装 SSH 客户端和服务端

yum -y install openssh-clients openssh-server

生成 SSH 密钥对,并启动 SSH 服务

ssh-keygen -A
/usr/sbin/sshd

查看 sshd 进程是否运行,验证 SSH 服务是否正常启动

ps -ef | grep sshd

这说明 SSH 服务已成功启动,处于正常运行状态

接下来配置容器内root用户免密登录本地(localhost)

生成 RSA 密钥对(默认存于~/.ssh)

ssh-keygen -t rsa

将公钥(id_rsa.pub)添加到授权文件(authorized_keys),并设置目录和文件的权限(SSH 对权限敏感,过松会拒绝免密)

mkdir -p ~/.ssh
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

验证免密登录是否生效(首次登录需输入yes确认,后续无需密码)

ssh localhost

The authenticity of host 'localhost (::1)' can't be established. 这个提示是 SSH 首次连接 localhost 时的正常安全验证步骤,不是错误,接下来输入 yes 并回车即可。

配置环境变量与启动脚本

cd /etc/profile.d/
cat > run.sh << 'EOF'
## 1. 配置JDK与Hadoop环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_431
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

## 2. 设置Hadoop进程运行用户(避免权限报错)
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

## 3. 容器启动时自动启动SSHD
/usr/sbin/sshd
EOF
chmod +x /etc/profile.d/run.sh
source /etc/profile.d/run.sh
  • profile.d目录下的.sh脚本会在用户登录时自动执行,确保环境变量全局生效。
  • 配置JAVA_HOME和HADOOP_HOME,并将其可执行目录添加到PATH,方便直接运行hadoop、hdfs等命令。
  • 声明 Hadoop 各进程的运行用户为root(默认可能因权限不足报错)。
  • 容器启动时自动启动sshd服务,避免每次手动启动。

验证环境变量

echo $JAVA_HOME
echo $HADOOP_HOME

配置 Hadoop 核心文件(hadoop-env.sh)

sudo sed -i '1i export JAVA_HOME=/usr/local/jdk1.8.0_431' /opt/hadoop/etc/hadoop/hadoop-env.sh
  • Hadoop 启动时依赖此文件指定JAVA_HOME,否则无法找到 Java 环境

配置 HDFS 默认地址(core-site.xml)

sudo sed -i '/<configuration>/,/<\/configuration>/c\
<configuration>\
    <property>\
        <name>fs.defaultFS</name>\
        <value>hdfs://localhost:9000</value>\
    </property>\
</configuration>' /opt/hadoop/etc/hadoop/core-site.xml
  • 修改core-site.xml,设置 HDFS 的默认名称节点(NameNode)地址为localhost:9000。
  • Hadoop 的文件系统(HDFS)需要指定一个默认的访问入口,客户端会通过此地址访问 HDFS

配置 HDFS 副本数(hdfs-site.xml)

sudo sed -i '/<configuration>/,/<\/configuration>/c\
<configuration>\
    <property>\
        <name>dfs.replication</name>\
        <value>1</value>\
    </property>\
</configuration>' /opt/hadoop/etc/hadoop/hdfs-site.xml
  • 设置 HDFS 的默认副本数为 1。
  • HDFS 默认副本数为 3(为了容错),但单节点环境无法满足 3 个副本(无其他节点存储),故改为 1

配置 MapReduce 框架(mapred-site.xml)

sudo sed -i '/<configuration>/,/<\/configuration>/c\
<configuration>\
    <property>\
        <name>mapreduce.framework.name</name>\
        <value>yarn</value>\
    </property>\
    <property>\
        <name>yarn.app.mapreduce.am.env</name>\
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>\
    </property>\
    <property>\
        <name>mapreduce.map.env</name>\
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>\
    </property>\
    <property>\
        <name>mapreduce.reduce.env</name>\
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>\
    </property>\
</configuration>' /opt/hadoop/etc/hadoop/mapred-site.xml
  • 配置 MapReduce 使用 YARN 作为资源管理器,并设置相关环境变量。
  • Hadoop 2.x 后推荐使用 YARN 管理 MapReduce 的资源(如 CPU、内存),需明确指定框架类型。

配置 YARN 辅助服务(yarn-site.xml)

sudo sed -i '/<configuration>/,/<\/configuration>/c\
<configuration>\
    <property>\
        <name>yarn.nodemanager.aux-services</name>\
        <value>mapreduce_shuffle</value>\
    </property>\
</configuration>' /opt/hadoop/etc/hadoop/yarn-site.xml
  • 配置 YARN 的节点管理器(NodeManager)支持mapreduce_shuffle辅助服务。
  • MapReduce 的 Shuffle 过程(数据分发)依赖 YARN 提供的此服务,否则 MapReduce 作业无法正常运行。

创建输入数据目录及文件

cd ~ && mkdir input && cd input
cat > test.txt << 'EOF'
2012-6-9 a 
2012-6-10 b 
2012-6-11 c 
2012-6-12 d 
2012-6-13 a 
2012-6-14 b 
2012-6-15 c 
2012-6-11 c
EOF
for i in {1..4}; do cp test.txt "test$i.txt"; done
  • 创建input目录,生成测试文本文件,并复制出 4 个副本(共 5 个输入文件)。
  • 为后续 MapReduce 词频统计(wordcount)提供输入数据。

初始化 HDFS 的名称节点(NameNode)元数据

cd /opt/hadoop/bin
./hdfs namenode -format

启动 Hadoop 的 HDFS 和 YARN 服务

cd /opt/hadoop/sbin
./start-dfs.sh
./start-yarn.sh
  •  这两个命令等于./start-all.sh

验证 Hadoop 进程

jps

  • 应包含NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager,说明服务启动成功

将本地/root/input目录(含测试文件)上传到 HDFS 的根目录(/)

hdfs dfs -put /root/input /
  • hdfs dfs是 HDFS 的命令行工具,-put用于从本地复制文件到 HDFS

运行 Hadoop 自带的wordcount示例程序,统计 HDFS 上/input目录中所有文件的词频,结果输出到/output

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.1.jar wordcount /input /output

查看词频统计结果

hdfs dfs -cat /output/part-r-00000

以上命令完整演示了从创建容器、配置环境、安装依赖、部署 Hadoop 到运行 MapReduce 作业的全流程,最终实现了在单节点 Hadoop 环境中进行词频统计,验证了 HDFS 和 YARN 的基本功能。

更多推荐