Hadoop集群本地虚拟机部署 + Hadoop HA部署

记录自己尝试搭建Hadoop集群的一次经历

无HA

提前设计集群结构

看一下虚拟机NAT的网段号(一般就是192.168.xxx.0),然后提前规划你的几个节点的ip地址以及主机名

node01 node02 node03 node04 node05
NameNode
SecondaryNameNode
ResourceManager
NodeManager NodeManager NodeManager NodeManager NodeManager
DataNode DataNode DataNode DataNode DataNode

系统配置

CentOS-7-x86_64-2009

先配置一个node,然后用你的虚拟机的clone功能快速clone出其余几个node

安装的时候,记得按照你的提前计划

  • 不要使用DHCP服务器分配地址,你手动设置一个固定的ipv4地址,填写子网掩码,VMWare的网关默认是192.168.xxx.2,然后DNS服务器就写网关就可以了
  • 更改你的主机名
  • 除了root用户,你最好创建一个你使用的用户,给一个管理员权限

安装vim、net-tools

1
yum list installed | grep net-tools

检查装了没,这个版本的centos应该是自带了

装 vim 方便之后修改配置文件

1
2
3
4
5
sudo yum install net-tools
sudo yum install vim

sudo vim /etc/vimrc
set ts=4(加一行,设置Tab键是四个空格长度,看着舒服)

防火墙设置

1
2
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

关闭SELinux安全系统

1
2
3
sudo vim /etc/selinux/config

修改 SELINUX=disabled

不关之后的节点通信可能有问题

准备java环境,配置hadoop

JDK下载:https://www.oracle.com/java/technologies/downloads/

Hadoop:https://hadoop.apache.org/releases.html

这里我用的是

hadoop-3.2.3 和 jdk-8u321-linux-x64

java

用rpm方式安装了java环境,好处就是不用配置hadoop配置文件hadoop-env.sh中的jdk路径了,rpm安装好之后与默认路径 JAVA_HOME=/usr/java/default 一致

装之前最好把centos自带的openJDK给卸载了

循环这个过程:

1
2
3
4
java -version
看一下shell输出的版本
rpm -qa | grep jdk
rpm -e 当前版本

直到 java -version 没有输出

然后安装你准备好的包

1
rpm -ivh rpm文件名
hadoop
1
sudo tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local

这里我装到 /usr/local 下了,你随意

然后把hadoop常用的bash目录配置到PATH里

1
2
3
4
5
6
7
sudo vim /etc/profile.d/hadoop.sh
写两行
export HADOOP_HOME=你的hadoop目录在哪里?
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile
立即生效

因为是sudo解压的hadoop目录,你的用户没有权限

1
sudo chown -R 用户名:组名 hadoop目录

最后创建一下hadoop的那个 hadoop.tmp.dir ,默认情况下你的NN、DN和之后的JournalNode都是在这个目录存储文件

1
2
sudo mkdir /var/hadoop_data
sudo chown -R 用户名:组名 /var/hadoop_data

这里我创建到 /var 下了,你随意

配置hadoop的配置文件

位置都在 你的hadoop目录/etc/hadoop 下存放

主要就是

  • core-site.xml (主节点信息、持久化和数据文件的主目录)

  • hdfs-site.xml (HDFS默认的数据存放策略)

  • mapred-site.xml (MapReduce任务调度策略)

  • yarn-site.xml (Yarn资源管理角色的信息)

  • workers (datanode的信息,我的版本是 workers,可能你的版本旧的话就是 slaves )

这里参照老师上课时的文档,以及Hadoop的官方文档

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html (配置文件的基本格式,左边栏有各个Configuration文件的默认参数,建议参考一下,里面每个参数的description写参数的作用写的很清楚)

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/ClusterSetup.html (一些集群操作的参数命令)

最后配置一下workers文件,把你规划好的所有DataNode的名字添加进去

1
2
3
nodexx
nodexx
nodexx

配置hosts文件,让机器能解析你的主机名

1
2
3
4
5
sudo vim /etc/hosts
192.168.xxx.80 node01
192.168.xxx.81 node02
192.168.xxx.82 node03
···

把这个文件里面之前的内容删除再添加

开始克隆

关闭你配置好的这一台机器,克隆出等同于你规划的node数量的机器,过程比安装新机器快得多

更改对应主机名和IP地址

克隆完所有机器后,在每台机器上依次执行以下的操作

1
2
3
4
5
sudo vim /etc/sysconfig/networ-scripts/ifcfg-ens33
把里面的 IPADDR 字段 改成你的规划的对应IP

sudo vim /etc/hostname
改一下每台主机的主机名

配置集群的ssh免密

这里可以用 TELNET 登录,我用的 XShell,可以同时把键盘输入发送给多个 Session

建议用这个功能,特别方便

在所有机器上执行

1
2
3
4
5
6
7
8
ssh-keygen -t rsa
一路确认后生成rsa公钥

给每台机器的公钥都拷贝给所有机器
ssh-copy-id node01
ssh-copy-id node02
ssh-copy-id node03
···

集群时间同步

课件上老师的方法 (适用于集群可以连接外网):

1
2
3
crontab –e
键入下面的一行代码:
0 1 * * * /usr/sbin/ntpdate us.pool.ntp.org

无法连接外网:

我找了一篇博客:https://blog.csdn.net/a18850765326/article/details/121693857

方法就是选择一个服务器作为同步对象,让其他服务器和他同步

格式化NameNode

在你的设计的 NameNode 上执行

1
hdfs namenode -format

至此,无HA的Hadoop集群就可以正常运行了

1
start-dfs.sh

HA部署

HA部署在官网有两种方式,一种是 QJM,另一种是 NFS

  • 使用QJM时,active的NameNode和standby的NameNode使用独立守护进程JournalNode通信。当Active节点执行任何命名空间修改时,它会将修改记录持久地记录到这些 JN 中的大多数。这样Standby 节点就能够从 JN 中读取同步数据
  • NFS与QJM类似,只不过没有使用JournalNode,使用了一个支持NFS的远程文件管理器装载在每个NameNode上同步数据

我使用了QJM方式

集群结构设计

node01 node02 node03 node04 node05
NameNode NameNode
ZKFailoverController ZKFailoverController
ResourceManager ResourceManager
JournalNode JournalNode JournalNode
NodeManager NodeManager NodeManager NodeManager NodeManager
DataNode DataNode DataNode DataNode DataNode
QuorumPeerMain QuorumPeerMain QuorumPeerMain QuorumPeerMain QuorumPeerMain

对应的进程的含义如果你觉得好奇,官网写的很清楚

JournalNodeZKFailoverControllerhttps://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

我是先部署了无HA集群,再进行修改成HA集群,如果你要部署HA,可以在克隆前就把Hadoop的配置文件写成HA的配置,并且把Zookeeper配置好

安装Zookeeper

官网:https://zookeeper.apache.org/releases.html

我用了 latest stable release 版本,apache-zookeeper-3.7.0

先在一台机器上部署

1
2
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz -C /usr/local/
sudo chown -R 用户名:组名 /usr/local/apache-zookeeper-3.7.0-bin

同样位置不固定

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd apache-zookeeper-3.7.0-bin/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg

修改dataDir=/var/zookeeper_data/ 位置不固定

添加:
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
···
之后就:wq

创建dataDir文件夹
sudo mkdir /var/zookeeper_data
sudo chown -R 用户名:组名 /var/zookeeper_data
echo 1 > /var/zookeeper_data/myid

再SCP发送到其他节点上

这里说的是先部署了非HA集群,克隆时没有克隆zookeeper的情况

1
2
3
4
5
6
sudo scp -r /usr/local/apache-zookeeper-3.7.0-bin node02:/usr/local
sudo scp -r /var/zookeeper_data node02:/var
···
记得把权限提升
然后把每个myid文件都改成对应的id
例如:node02改成2

修改Hadoop的配置文件为HA

同样是这些文件

  • core-site.xml (主节点信息、持久化和数据文件的主目录)
  • hdfs-site.xml (HDFS默认的数据存放策略)
  • mapred-site.xml (MapReduce任务调度策略)
  • yarn-site.xml (Yarn资源管理角色的信息)

同样参照老师上课时的文档,以及Hadoop的官方文档

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

如何启动

启动Zookeeper

所有节点

1
Zookeeper目录/bin/zkServer.sh start

手动启动JournalNode(仅第一次在所有规划好的JournalNode上启动)

1
hdfs --daemon start journalnode

格式化启动同步namenode(仅第一次)

在一个NameNode上执行

1
2
hdfs namenode -format
hdfs --daemon start namenode

这时候在另一个节点上执行同步

1
hdfs namenode -bootstrapStandby

格式化ZKFC(仅第一次)

在任意一个NameNode上格式化

1
hdfs zkfc -formatZK

之后就可以启动了

1
start-all.sh

总结

  1. 配置文件别敲错
  2. 启动不了进程去hadoop/logs里面查看对应进程的log文件中的error查错
  3. 使用虚拟机快照记录当前状态,之后可以回档