安装 Ubuntu 22.04

首先根据微软官方指南安装 WSL,然后使用如下指令安装 Ubuntu 22.04:

wsl --install --distribution Ubuntu-22.04

安装 ssh 和 rsync:

sudo apt-get install ssh rsync

安装 Java 8

前往官网本站镜像下载 JDK 8,创建安装目录:

sudo mkdir /usr/java

将二进制文件解压至安装目录:

sudo tar -zxf jdk-8u401-linux-x64.tar.gz -C /usr/java/

安装 Hadoop 3.3.6

前往官网本站镜像下载 Hadoop 3.3.6,创建安装目录:

mkdir ~/hadoop_installs

将下载的压缩包移动到上述目录后解压:

tar -zxvf hadoop-3.3.6.tar.gz

配置环境变量

编辑 .bashrc 文件:

nano ~/.bashrc

在文件末尾添加以下内容:

# Set up Hadoop and Java
export JAVA_HOME=/usr/java/jdk1.8.0_401
export JRE_HOME=${JAVA_HOME}/jre
export HADOOP_HOME=$HOME/hadoop_installs/hadoop-3.3.6
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export CLASSPATH=$JAVA_HOME/lib:${JRE_HOME}/lib

使上述修改即刻生效:

source ~/.bashrc

向系统注册 JDK:

sudo update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_401/bin/java 300

查看 java 版本,预期结果如下:

jjl9807@ubuntu:~$ java -version
java version "1.8.0_401"
Java(TM) SE Runtime Environment (build 1.8.0_401-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.401-b10, mixed mode)

配置 SSH 密钥访问

创建密钥:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

添加密钥:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

测试连接:

ssh localhost

配置 Hadoop

Hadoop 的配置文件存放在安装目录下的 etc/hadoop 目录中:

cd $HADOOP_HOME/etc/hadoop

修改 hadoop-env.sh 文件中以下内容:

export JAVA_HOME=/usr/java/jdk1.8.0_401

修改 core-site.xml,添加以下内容:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
    <property>
        <name>hadoop.work.dir</name>
        <value>/home/jjl9807/hadoop_tmp</value>
    </property>
</configuration>
⚠️ 注意: 请将上面的 /home/jjl9807/hadoop_tmp 调整为你自己设定的 Hadoop 工作路径!

修改 hdfs-site.xml,添加以下内容:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

修改 mapred-site.xml,添加以下内容:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>      
            $HADOOP_HOME/etc/hadoop,
            $HADOOP_HOME/share/hadoop/common/*,
            $HADOOP_HOME/share/hadoop/common/lib/*,
            $HADOOP_HOME/share/hadoop/hdfs/*,
            $HADOOP_HOME/share/hadoop/hdfs/lib/*,
            $HADOOP_HOME/share/hadoop/mapreduce/*,
            $HADOOP_HOME/share/hadoop/mapreduce/lib/*,
            $HADOOP_HOME/share/hadoop/yarn/*,
            $HADOOP_HOME/share/hadoop/yarn/lib*
        </value>
    </property>
</configuration>

修改 yarn-site.xml,添加以下内容:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <Value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</Value>
    </property>
</configuration>

启动 Hadoop

格式化 NameNode:

hdfs namenode -format
⚠注意: 切勿多次格式化!如果需要重新格式化,必须要删除后重新创建前面指定的工作目录。

启动 NameNode daemon 和 DataNode daemon:

start-dfs.sh

查看集群状态,输出结果应与如下内容相近:

jjl807@ubuntu:~/$ jps
200918 DataNode
201142 SecondaryNameNode
200746 NameNode
201342 Jps

现在可以通过 http://localhost:9870 访问 HDFS NameNode 的 Web 接口。

启动 ResourceManage daemon 和 NodeManage daemon:

start-yarn.sh

再次查看集群状态,输出结果应与如下内容相近:

jjl807@ubuntu:~/$ jps
200918 DataNode
201142 SecondaryNameNode
226890 Jps
200746 NameNode
226334 ResourceManager
226493 NodeManager

现在可以通过 http://localhost:8088 访问 Resource Manager 的 Web 接口。

运行示例

创建执行 MapReduce 作业的 HDFS 目录:

hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/jjl9807
hdfs dfs -mkdir test-in 

上面第三条命令在当前用户工作目录下创建,省略了 /user/<username>,直接使用了相对路径。

./test 文件夹中创建以下两个文件:

file1.txt: hello hadoop hello world
file2.txt: goodbye hadoop

拷贝输入文件至分布式文件系统:

hdfs dfs -put test/*.txt test-in

运行 Hadoop 自带的 MapReduce 示例:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount test-in test-out

如果 Hadoop 正常运行,部分输出日志应与如下内容相近:

2024-04-18 19:14:03,769 INFO mapreduce.Job: Running job: job_1713438748713_0002
2024-04-18 19:14:08,819 INFO mapreduce.Job: Job job_1713438748713_0002 running in uber mode : false
2024-04-18 19:14:08,820 INFO mapreduce.Job:  map 0% reduce 0%
2024-04-18 19:14:12,855 INFO mapreduce.Job:  map 100% reduce 0%
2024-04-18 19:14:15,867 INFO mapreduce.Job:  map 100% reduce 100%
2024-04-18 19:14:16,877 INFO mapreduce.Job: Job job_1713438748713_0002 completed successfully
2024-04-18 19:14:16,927 INFO mapreduce.Job: Counters: 54

将 HDFS 的输出文件拷贝至本地文件系统:

hdfs dfs -get test-out output

查看输出结果,预期内容如下:

jjl9807@ubuntu:~$ cat output/*
goodbye 1
hadoop  2
hello   2
world   1