注意,这里搭建的是伪分布式模式。

伪分布式模式:也是单机运行,但是具备 Hadoop 集群的所有功能,一台服务器模
拟一个分布式的环境。

如果出现问题,可以去参看文章 搭建hadoop集群常见问题

再造虚拟机

前面已经创建了一台虚拟机了,两种选择:

  1. 选择直接克隆。由于涉及分发脚本等,虚拟机最好配置成静态IP(不配置其实也可以,只是未来IP改变后有部分东西会受影响)。克隆之后Hadoop和jdk等就都配置好了。注意克隆是在虚拟机软件(VMware、UTM)上右键虚拟机就可以克隆了。如果之前是手动配置的静态IP(修改netplan文件的),需要去看看netplan文件(配置静态IP的那个文件)看看IP信息,多半都需要改改,改成新的IP地址,可能用户名和主机名也需要修改,可以查看修改Ubuntu用户名、密码和主机名具体改后的值先看看下面的内容
  2. 再按照前面的流程创建两台虚拟机(Hadoop可以先不安装,但是jdk要安装上),这种适合非手动配置静态IP的人(在安装时就配置了静态IP的人)。

对了,配置的时候不要想着内存、核心数、硬盘数太大了,其实虚拟机用的内存不大,设置的是最大的内存,也就是三台机子同时高功耗执行任务才就会有达到(能到那种程度基本就用的公司的服务器了,学习更不用担心),核心数也是用的虚拟核心数,类似于线程数,一般也跑不满,硬盘就是最大硬盘了,Linux中可能只有主服务器占资源多一点,另外两台基本就是占用10GB左右硬盘,但是搭建好集群后,可能虚拟机总的硬盘要占到50GB左右,和512GB比起来问题也不大。

Hadoop集群配置规划

1号服务器 2号服务器 3号服务器
name hadoop103 hadoop104 hadoop105
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode
YARN NodeManager ResourceManager、NodeManager NodeManager

1号服务器还要配置历史服务器:JobHistoryServer

集群分发脚本

未来避免每台服务器都执行相同操作,需要自行编写集群分发脚本,使得各服务器快速,方便地同步一些内容。

参看: 集群分发脚本

配置文件说明

Hadoop 配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认 配置值时,才需要修改自定义配置文件,更改相应属性值。

由于你可能和我的位置不太一样,那就统一把hadoop根目录配置到环境变量中:vim ~/.bashrc,添加内容(这在后面启停脚本中需要,请你务必配置这一项):

1
2
3
4
#HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

刷新配置:source ~/.bashrc。之后就可以直接输入cd $HADOOP_HOME命令就可以跳转到hadoop的根目录/ur/local/hadoop下了。相当于是名词替换了。

相关配置文件

hadoop的配置文件都在$HADOOP_HOME/etc/hadoop目录下。

  1. 默认配置文件
| 要获取的默认文件     | 文件存放在 Hadoop 的 jar 包中的位置                       |
| -------------------- | --------------------------------------------------------- |
| [core-default.xml]   | hadoop-common-3.3.1.jar/core-default.xml                  |
| [hdfs-default.xml]   | hadoop-hdfs-3.3.1.jar/hdfs-default.xml                    |
| [yarn-default.xml]   | hadoop-yarn-common-3.3.1.jar/yarn-default.xml             |
| [mapred-default.xml] | hadoop-mapreduce-client-core-3.3.1.jar/mapred-default.xml |
  1. 自定义配置文件

    core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 四个配置文件存放在 $HADOOP_HOME/etc/hadoop 这个路径上,用户可以根据项目需求重新进行修改配置。我们后面进行的相关配置也是对这四个文件进行配置。

  2. 都是对应着核心配置文件core、hdfs配置文件、yarn配置文件、MapReduce配置文件。

配置集群

先都是在一号服务器(hadoop103)操作,之后利用分发脚本分发过去就行了,减少重复操作。

进入配置文件目录:

1
cd $HADOOP_HOME/etc/hadoop

核心配置文件

配置 core-site.xml

1
vim core-site.xml # 前提是跳转到了 $HADOOP_HOME/etc/hadoop 目录下

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop103:8020</value>
</property>

<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data</value>
</property>

<!-- 配置 HDFS 网页登录使用的静态用户为 hadoop103 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop103</value>
</property>
</configuration>

如下:

core-site

HDFS配置文件

配置hdfs-site.xml

1
vim hdfs-site.xml

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop103:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop105:9868</value>
</property>
</configuration>

如图:

hdfs-site

注意看端口,以后访问正确的端口.

YARN配置文件

配置 yarn-site.xml

1
vim yarn-site.xml

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop104</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop103:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>

如图:

yarn-site

3.2版本以上不需要配置环境变量了。

MapReduce配置文件

配置mapred-site.xml

1
vim mapred-site.xml

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop103:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop103:19888</value>
</property>
</configuration>

如图:

mapred-site

配置workers

1
vim workers

写入(默认里面有内容localhost,但是我的hadoop103对于的有localhost,所以我把localhost删掉了,写入下面内容):

1
2
3
hadoop103
hadoop104
hadoop105

配置文件写完了,可以再cat检查一下写得对不对。


分发Hadoop配置文件

利用集群分发脚本,如果还没有弄集群分发脚本请参看集群分发脚本

1
xsync /usr/local/hadoop/etc/hadoop

分发结果

启动集群

没有特别说明都是在$HADOOP_HOME目录下执行命令。

第一次启动

如果集群是第一次启动,需要在 hadoop103 节点格式化 NameNode(注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)

注意是集群启动之前初始化,如果启动了请先停止集群再执行命令:

1
hdfs namenode -format

初始化完毕会新生成两个文件夹,一个是data(hadoop的数据存储目录),另一个是logs(hadoop的日志存储目录).

再提醒一遍:之后再执行namenode初始化命令要提前把data和logs删除,且停止集群

正式启动

1
sbin/start-dfs.sh

关闭即为:

1
sbin/stop-dfs.sh

启动YARN

在配置了 ResourceManager 的节点启动,即hadoop104,输入下面命令:

1
sbin/start-yarn.sh

关闭即为:

1
sbin/stop-yarn.sh

启动历史服务器

在hadoop103上启动

1
mapred --daemon start historyserver

查看历史服务器是否启动:

1
jps

查看JobHistory:

http://hadoop103:19888/jobhistory

关闭即为:

1
mapred --daemon stop historyserver

这样就启动成功了。

注意启动和关闭顺序:

启动: dfs -> yarn -> historyserver

关闭;histroyserver -> yarn -> dfs


封装集群启停脚本

此脚本只包含HDFS、Yarn、Historyserver 。如果有其他服务,自行参照改写代码。

作用:方便快速的启动和停止集群。

不用输入sbin/start-dfs.shsbin/start-yarn.sh等。

存放地址:

/home/hadoop/bin这是自己编写的脚本的存放地。前面的xsync就是在这里面,这个文件路径也已经被添加进了环境变量。

1
2
cd /home/hadoop103/bin
vim myhadoop

写入脚本文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi

case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="

echo " --------------- 启动 hdfs ---------------"
ssh hadoop103 "$HADOOP_HOME/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop104 "$HADOOP_HOME/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop103 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="

echo " --------------- 关闭 historyserver ---------------"
ssh hadoop103 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop104 "$HADOOP_HOME/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop103 "$HADOOP_HOME/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac

其实内容很简单,就是先获取参数个数:$#

  • 如果参数个数小于1(if [ $# -lt 1]),也就是没有参数,就输出提升说没有参数,然后结束脚本。

  • 如果参数个数大于等于1,就执行下面的命令。

    直接就是一个switch-case判断参数是干嘛的,注意只判断第一个参数$1,如果是start就启动,启动就跳转到hadoop103中启动hdfsssh hadoop103 "$HADOOP_HOME/sbin/start-dfs.sh",然后启动yarn,跳转到hadoop104启动yarnssh hadoop104 "$HADOOP_HOME/sbin/start-yarn.sh"。之后又跳转到hadoop103启动历史服务器功能ssh hadoop103 "$HADOOP_HOME/bin/mapred --daemon start historyserver"

关闭同理。

所以需要配置ssh免密登录,否则可能就报错,ssh免密登录请参看:集群分发脚本

赋予脚本执行权限

1
chmod +x myhadoop

以后启动和关闭就简单了。

启动:

1
myhadoop start

关闭:

1
myhadoop stop

编写统一状态查看脚本

作用:一个命令,查看所有节点上的服务运行状态

原理:jps是查看一台节点上的服务运行状态命令。利用ssh跳转调用jps命令即可完成。很简答,有时间自己尝试写吧。

1
2
cd /home/hadoop103/bin
vim jpsall

编写脚本内容:

1
2
3
4
5
6
7
#!/bin/bash

for host in hadoop103 hadoop104 hadoop105
do
echo =============== $host ===============
ssh $host jps
done

赋予脚本执行权限:chmod +x jpsall

统一测试

这里直接就可以测试.

测试包含以下内容:

  1. 测试集群是否能正常启动,搭建是否正确
  2. 测试myhadoop集群启停脚本是否正常工作
  3. 测试jpsall统一状态查看脚本是否正常工作
  4. 脚本是否符合预期计划,将服务配置到对应服务器上
1
myhadoop start

测试统一启动脚本

1
jpsall

测试统一状态查看脚本

注意对照我们前面的规划表Hadoop集群配置规划.查看服务是否启动,以及启动节点是否正确。

如果谨慎的话可以查看对应端口是否能正常访问,请参看hadoop常用端口号(这里常常会出现一点问题)。

1
myhadoop stop

然后在jpsall查看一下,如果所有服务器都只剩jps一个服务了,就代表顺利关闭了。

如果有问题请参看:搭建hadoop集群常见问题