基于 Docker 在 Windows 环境下简单搭建一个单节点 Hadoop 并进行词频统计测试
前置准备工作:
准备一份适用于 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 的基本功能。
更多推荐
所有评论(0)