下半学期开了“大数据与云计算”的课程,一次实验课要求配置 Hadoop 分布式集群。配环境这东西真的不好说,运气好一气呵成,运气不好,真的要杠上两三天。所以这篇就给踩的坑做一个笔记。

前言

Hadoop 提供 单机模式伪分布式模式 以及 分布式模式,因为真正的生产环境都是在真正的分布式环境下,所以这里就选最后一种进行配置。

为了方便起见,所有都机器都是本地 CentOS 7 的虚拟机,也只配置一个 master 和一个 worker 节点。

修改主机名

为了方便管理,需要修改一些主机名。
修改 /etc/hosts

1
2
3
# 增加下面两行
10.211.55.19 master
10.211.55.23 worker

master 就是当前正在配置的虚拟机的内网 IP,worker 准备从 master 里 clone 出来,后续需要再进行补充/修改,到时就不再赘述了。

修改 /etc/hostname

1
2
# 整个替换文件内容,如果是 worker 就填 worker,这一行也不能要
master

安装 JDK

Hadoop 是 Java 编写的,所以环境就只用配置 JDK 就好,其它的 CentOS 7 都自带了。

1
sudo yum install java-1.8.0-openjdk-devel

这里一定要安装带 -devel 后缀的 JDK,不然安装的就是 JRE 了,后续还要使用 JDK 的 JPS 工具查看进程是不是如期启动了。版本就安装 8,更高带版本会因为一些模块移除导致各种问题。

1
echo export JAVA_HOME=/usr/lib/jvm/jre >> ~/.zshrc

用的 zsh,其它的根据自己情况更改

安装 Hadoop

我们安装最新的 Hadoop 3.1.1:

1
2
3
wget https://www-eu.apache.org/dist/hadoop/common/hadoop-3.1.1/hadoop-3.1.1.tar.gz
tar -zxvf hadoop-3.1.1.tar.gz
sudo mv hadoop-3.1.1 /usr/local/hadoop

然后配置一下环境变量:

1
2
3
4
5
6
7
8
echo export HADOOP_HOME=/usr/local/hadoop >> ~/.zshrc
echo export HADOOP_COMMON_HOME=$HADOOP_HOME >> ~/.zshrc
echo export HADOOP_HDFS_HOME=$HADOOP_HOME >> ~/.zshrc
echo export HADOOP_YARN_HOME=$HADOOP_HOME >> ~/.zshrc
echo export HADOOP_MAPRED_HOME=$HADOOP_HOME >> ~/.zshrc
echo export HADOOP_INSTALL=$HADOOP_HOME >> ~/.zshrc
echo export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native >> ~/.zshrc
source ~/.zshrc

HADOOP_HOME 是一定要配,绝大多数博客也都说了,剩下的很少有文章提到,但是启动的时候就会提示没有配置而启动失败。

配置 Hadoop

etc/hadoop 目录下是 Hadoop 的配置文件,暂时只需要关注 hadoop-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml 这五个文件。

注意现在是在 master 节点上配置

hadoop-env.sh

这个文件是 Hadoop 启动时的环境配置文件,不知道为什么还要把 JAVA_HOME 在这个文件里再写一遍,反正不写会启动失败:

1
echo export JAVA_HOME=/usr/lib/jvm/jre >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh

core-site.xml

这个文件配置集群全局参数,如 HDFS URL、Hadoop 临时目录等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 配置 HDFS URL,这里 master 需要在 /etc/hosts 里配置 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 配置 Hadoop 临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:///home/centos/hadoop</value>
</property>
<!-- 这里配置 WebUI 登陆的用户,当前虚拟机用户名是 centos,用户名就代表了操作权限,默认用户是 read-only 权限 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>centos</value>
</property>
</configuration>

hdfs-site.xml

这个文件配置 HDFS 参数,namenode、datanode 数据存储位置,文件副本数量等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 文件副本数量 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- namenode 数据存储位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/centos/hadoop/dfs/name</value>
</property>
<!-- datanode 数据存储位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/centos/hadoop/dfs/data</value>
</property>
</configuration>

mapred-site.xml

Mapreduce 配置文件。

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 使用的框架,计算任务会由 yarn 提供计算资源解决 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

yarn-site.xml

配置 yarn (资源管理)参数,如 ResourceManager、NodeManager 通信端口,WebUI 端口等。

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>

配置子节点

到这里主节点就配置完成了,通过 clone 虚拟机完成子节点的创建,然后简单修改 /etc/hosts 文件就可以了。

然后再修改 主节点 上的 $HADOOP_HOME/etc/hadoop/workers,没有就创建:

1
2
hadoop@worker
# 一排一个子节点...

这里的 Hadoop 是子节点的用户名,worker 之前在 /etc/hosts 里配置了。

网上文章一般都是只填 worker,而不填前面的用户名
这是因为一般情况下所有节点都应该配置成一样,比如用户名、目录等,方便管理减少配置成本。但是有时候主节点和子节点的用户名不一样,比如主节点用户名叫 centos,那么在主节点执行 ssh worker 等价于执行 ssh centos@worker。当然为了避免麻烦,使用统一的配置才是正解。

启动

第一次启动 之前在主节点上执行:

1
$HADOOP_HOME/bin/hdfs namenode -format

主节点上 依次执行:

1
2
3
4
5
6
# 启动 HDFS
$HADOOP_HOME/sbin/start-dfs.sh
# 启动 yarn
$HADOOP_HOME/sbin/start-yarn.sh
# 启动 historyserver
$HADOOP_HOME/bin/mapred --daemon start historyserver

判断有没有启动成功可以 jps 查看 Java 进程:

1
2
3
4
5
10848 JobHistoryServer
10289 SecondaryNameNode
10515 ResourceManager
10061 NameNode
10910 Jps

子节点 上执行 jps 会看到:

1
2
3
4626 DataNode
4859 NodeManager
4950 Jps

如果想关闭的话,在主节点上执行:

1
2
3
$HADOOP_HOME/sbin/stop-dfs.sh
$HADOOP_HOME/sbin/stop-yarn.sh
$HADOOP_HOME/bin/mapred --daemon stop historyserver

Web UI

启动完 hadoop 之后,访问 http://10.211.55.19:9870:
NameNode

访问 http://10.211.55.19:8088:
ResourceManager

访问 http://10.211.55.19:19888:
MapReduce JobHistory Server

References

Hadoop r3.1.1 docs

集群配置详解