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 | sudo yum install net-tools |
防火墙设置
1 | sudo systemctl stop firewalld.service |
关闭SELinux安全系统
1 | sudo vim /etc/selinux/config |
不关之后的节点通信可能有问题
准备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 | java -version |
直到 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 | sudo vim /etc/profile.d/hadoop.sh |
因为是sudo解压的hadoop目录,你的用户没有权限
1 | sudo chown -R 用户名:组名 hadoop目录 |
最后创建一下hadoop的那个 hadoop.tmp.dir ,默认情况下你的NN、DN和之后的JournalNode都是在这个目录存储文件
1 | sudo mkdir /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 | nodexx |
配置hosts文件,让机器能解析你的主机名
1 | sudo vim /etc/hosts |
把这个文件里面之前的内容删除再添加
开始克隆
关闭你配置好的这一台机器,克隆出等同于你规划的node数量的机器,过程比安装新机器快得多
更改对应主机名和IP地址
克隆完所有机器后,在每台机器上依次执行以下的操作
1 | sudo vim /etc/sysconfig/networ-scripts/ifcfg-ens33 |
配置集群的ssh免密
这里可以用 TELNET 登录,我用的 XShell,可以同时把键盘输入发送给多个 Session
建议用这个功能,特别方便
在所有机器上执行
1 | ssh-keygen -t rsa |
集群时间同步
课件上老师的方法 (适用于集群可以连接外网):
1 | crontab –e |
无法连接外网:
我找了一篇博客: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 |
对应的进程的含义如果你觉得好奇,官网写的很清楚
JournalNode、ZKFailoverController:https://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 | tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz -C /usr/local/ |
同样位置不固定
修改配置文件
1 | cd apache-zookeeper-3.7.0-bin/conf/ |
再SCP发送到其他节点上
这里说的是先部署了非HA集群,克隆时没有克隆zookeeper的情况
1 | sudo scp -r /usr/local/apache-zookeeper-3.7.0-bin node02:/usr/local |
修改Hadoop的配置文件为HA
同样是这些文件
- core-site.xml (主节点信息、持久化和数据文件的主目录)
- hdfs-site.xml (HDFS默认的数据存放策略)
- mapred-site.xml (MapReduce任务调度策略)
- yarn-site.xml (Yarn资源管理角色的信息)
同样参照老师上课时的文档,以及Hadoop的官方文档
如何启动
启动Zookeeper
所有节点
1 | Zookeeper目录/bin/zkServer.sh start |
手动启动JournalNode(仅第一次在所有规划好的JournalNode上启动)
1 | hdfs --daemon start journalnode |
格式化启动同步namenode(仅第一次)
在一个NameNode上执行
1 | hdfs namenode -format |
这时候在另一个节点上执行同步
1 | hdfs namenode -bootstrapStandby |
格式化ZKFC(仅第一次)
在任意一个NameNode上格式化
1 | hdfs zkfc -formatZK |
之后就可以启动了
1 | start-all.sh |
总结
- 配置文件别敲错
- 启动不了进程去hadoop/logs里面查看对应进程的log文件中的error查错
- 使用虚拟机快照记录当前状态,之后可以回档