- 前文
- Hadoop3.3.1 HA 高可用集群的搭建
- QJM 的 NameNode HA
- Hadoop HA模式搭建(高可用)
- 1、集群规划
- 2、Zookeeper集群搭建:
- 3、修改Hadoop集群配置文件
- 修改 vim core-site.xml
- 修改 hadoop-env.sh
- 修改 hdfs-site.xml
- workers
- Yarn高可用
- 修改 mapred-site.xml
- 修改 yarn-site.xml
- 启动zookeeper集群
- 在每台机器上启动:
- 格式化namenode、zkfc
- 启动hdfs
- 尝试HA模式
- 此时再次查看节点
前文
- 一、CentOS7 hadoop3.3.1安装(单机分布式、伪分布式、分布式
- 二、JAVA API实现HDFS
- 三、MapReduce编程实例
- 四、Zookeeper3.7安装
- 五、Zookeeper的Shell操作
- 六、Java API操作zookeeper节点
Hadoop3.3.1 HA 高可用集群的搭建
(基于Zookeeper,NameNode高可用+Yarn高可用)
QJM 的 NameNode HA
用Quorum Journal Manager或常规共享存储
QJM的NameNode HA
Hadoop HA模式搭建(高可用)
1、集群规划
一共三台虚拟机,分别为master、worker1、worker2;
namenode三台上都有,resourcemanager在worker1,woker2上。
master | woker1 | worker2 | |
---|---|---|---|
NameNode | yes | yes | yes |
DataNode | no | yes | yes |
JournalNode | yes | yes | yes |
NodeManager | no | yes | yes |
ResourceManager | no | yes | yes |
Zookeeper | yes | yes | yes |
ZKFC | yes | yes | yes |
因为没有重新创建虚拟机,是在原本的基础上修改。所以名称还是hadoop1,hadoop2,hadoop3
hadoop1 = master
hadoop2 = worker1
hadoop3 = worker2
2、Zookeeper集群搭建:
参考:四、Zookeeper3.7安装
3、修改Hadoop集群配置文件
修改 vim core-site.xml
vim core-site.xml
core-site.xml:
fs.defaultFS
hdfs://mycluster
hadoop.tmp.dir
/export/servers/data/hadoop/tmp
hadoop.http.staticuser.user
root
ha.zookeeper.quorum
hadoop1:2181,hadoop2:2181,hadoop3:2181
ha.zookeeper.session-timeout.ms
1000
ms
上面指定 zookeeper 地址中的Hadoop1,hadoop2,hadoop3换成你自己机器的主机名(要先配置好主机名与 IP 的映射)或者 ip
修改 hadoop-env.sh
vim hadoop-env.sh
hadoop-env.sh
在使用集群管理脚本的时候,由于使用ssh进行远程登录时不会读取/etc/profile文件中的环境变量配置,所以使用ssh的时候java命令不会生效,因此需要在配置文件中显式配置jdk的绝对路径(如果各个节点的jdk路径不一样的话那hadoop-env.sh中应改成本机的JAVA_HOME)。
hadoop 3.x中对角色权限进行了严格限制,相比于hadoop 2.x要额外对角色的所属用户进行规定。
此处仅为搭建HDFS集群,如果涉及到YARN等内容的话应一并修改对应yarn-env.sh等文件中的配置
在脚本末尾添加以下内容:
export JAVA_HOME=/opt/jdk1.8.0_241
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_ZKFC_USER="root"
export HDFS_JOURNALNODE_USER="root"
修改 hdfs-site.xml
vim hdfs-site.xml
hdfs-site.xml
dfs.replication
3
dfs.namenode.name.dir
/export/servers/data/hadoop/tmp/dfs/name
dfs.datanode.data.dir
/export/servers/data/hadoop/tmp/dfs/data
dfs.webhdfs.enabled
true
dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2,nn3
dfs.namenode.rpc-address.mycluster.nn1
hadoop1:9000
dfs.namenode.http-address.mycluster.nn1
hadoop1:9870
dfs.namenode.rpc-address.mycluster.nn2
hadoop2:9000
dfs.namenode.http-address.mycluster.nn2
hadoop2:9870
dfs.namenode.rpc-address.mycluster.nn3
hadoop3:9000
dfs.namenode.http-address.mycluster.nn3
hadoop3:9870
dfs.namenode.shared.edits.dir
qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster
dfs.journalnode.edits.dir
/export/servers/data/hadoop/tmp/journaldata
dfs.ha.automatic-failover.enabled
true
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
dfs.ha.fencing.ssh.connect-timeout
30000
ha.failover-controller.cli-check.rpc-timeout.ms
60000
dfs.namenode.secondary.http-address
hadoop3:9868
要创建journaldata文件夹
workers
在hadoop 2.x中这个文件叫slaves,配置所有datanode的主机地址,只需要把所有的datanode主机名填进去就好了
hadoop1
hadoop2
hadoop3
Yarn高可用
vim mapred-site.xml
修改 mapred-site.xml
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
hadoop1:10020
mapreduce.jobhistory.webapp.address
hadoop1:19888
vim yarn-site.xml
修改 yarn-site.xml
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
yrc
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
hadoop2
yarn.resourcemanager.hostname.rm2
hadoop3
yarn.resourcemanager.zk-address
hadoop1:2181,hadoop2:2181,hadoop2:2181
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.log-aggregation-enable
true
yarn.log-aggregation.retain-seconds
86400
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
都修改好了,就分发给其他集群节点
(在hadoop/etc路径下)
scp /export/servers/hadoop-3.3.1/etc/hadoop/* hadoop2:/export/servers/hadoop-3.3.1/etc/hadoop/
scp /export/servers/hadoop-3.3.1/etc/hadoop/* hadoop3:/export/servers/hadoop-3.3.1/etc/hadoop/
启动zookeeper集群
在每台机器上启动:
zkServer.sh start
zkServer.sh status
格式化namenode、zkfc
首先,在所有虚拟机上启动journalnode:
hdfs --daemon start journalnode
都启动完毕之后,在master(hadoop1)节点上,格式化namenode
hadoop namenode -format
因为之前搭建过完全分布式,所以格式化一次namenode
但是,集群中的datanode,namenode与/current/VERSION/中的
CuluserID
有关所以再次格式化,并启动,其他两个节点同步格式化好的namenode并不冲突
formatZK同理
然后单独启动namenode:
hdfs namenode
然后,在另外两台机器上,同步格式化好的namenode:
hdfs namenode -bootstrapStandby
应该能从master上看到传输信息。
传输完成后,在master节点上,格式化zkfc:
hdfs zkfc -formatZK
启动hdfs
在master节点上,先启动dfs:
start-dfs.sh
然后启动yarn:
start-yarn.sh
启动mapreduce任务历史服务器:
mapred --daemon start historyserver
可以看到各个节点的进程启动情况:
如果datanode未启动
是版本号不一致产生的问题,那么我们就单独解决版本号的问题,将你格式化之后的NameNode的VERSION文件找到,然后将里面的clusterID进行复制,再找到DataNode的VERSION文件,将里面的clusterID进行替换,保存之后重启
尝试HA模式
首先看看各个namenode主机状态:
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
hdfs haadmin -getServiceState nn3
可以看到,有两个standby,一个active。
在active的master节点上,kill掉namenode进程:
此时再次查看节点
可以看到,nn1已经切换为active,Hadoop 高可用集群基本搭建完成。