规划原则:
➢ NameNode 和 SecondaryNameNode 不要安装在同⼀台服务器
➢ ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同⼀台服务器
master | slave1 | slave2 | |
---|---|---|---|
hdfs | namenode | namenode | |
datanode | datanode | datanode | |
yarn | datanode | datanode | datanode |
nodemanager | nodemanager | nodemanager |
各个组件功能
active nn:
- 接收client的rpc的请求,同时自己的editlog文件写一份,
- 也会向jn集群写一份
- 也同时接收dn的heartbeat(心跳) blockreport(块报告)
standby nn:
- 同时会接受到从jn集群的这份记录,使自己的元数据和active nn的元数据保持一致。
- 这个动作叫做 【重演】,说白了 就是active nn的一个实时热备份。
- 一旦standby切换为active状态,就能够立即马上对外提供服务。
JournalNode jn集群:- 用于active standby nn同步数据的,
- 本身由jn节点组成,至少3台 2n+1 保证高可用
zkfc:
- 监控nn的健康状态
- 向zk集群定期的发送心跳 让自己被选举上,
- 当被zk选举为active时,zkfc通过rpc协议调用让nn状态转换为nn active
dn:
- 同时向两个NN发送 心跳 块报告
1.配置namenode节点和备份节点
vim /hadoop/hadoop-3.2.2/etc/hadoop/hdfs-site.xml
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--指定集群的namenode节点有哪些-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!--指定集群的namenode节点远程通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:9000</value>
</property>
<!--指定集群的namenode节点http请求地址-->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
<!--指定集群的namenode节点edits⽂件存放路径-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>
<!--配置节点隔离级别,同⼀时刻只能有⼀个namenode提供服务-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--journalnode存放路径-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/hadoop/jn</value>
</property>
<!--关闭权限-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--⾃动切换的代理类-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--⾃动故障转移的开关开启-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--⽆密登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop/dfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/hadoop/dfs/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave2:9001</value>
</property>
<property>
<name>dfs.permissions.superusergroup</name>
<value>hadoop</value>
</property>
2.指定datanode和managernode节点
vim /hadoop/hadoop-3.2.2/etc/hadoop/workers
master slave1 slave2
修改后将⽂件分发到三台机器
注意: 三台机器需都配置公私钥
启动时在resourcemanager在的机器输⼊群起命令start-all.sh
集群节点分布如图
3.安装zookeeper
下载,上传Zookeeper,建⽴软链接,配置环境变量:家⽬录下
的.bash_profile
export ZOOKEEPER_HOME=zookeeper家⽬录
export PATH=$PATH:$ZOOKEEPER_HOME/bin
配置完后让环境变量⽣效:source .bash_profile
- 3.1. 在~/software/zookeeper⽬录下新建⼀个⽬录zkData
- 3.2. 将zookeeper家⽬录下的conf⽬录下的zoo_sample.cfg更名为zoo.cfg
- 3.3. 修改zoo.cfg的内容:
bash dataDir=zookeeper家⽬录/zkData
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
(hadoop101…是主机名,也可以⽤主机IP地址,2888:服务器与leader之间通信的端口3888:选举端口 server.num,其中num是每个节点中的myid⽂件中的编号)
- 3.4. 将Zookeeper .bash_profile同步到其他机器上
- 3.5.在每个节点的zookeeper家⽬录下zkData中新建⼀个myid⽂件,每个节点id不同。
- 3.6.在每台机器上启动zookeeper:zkServer.sh start启动zookeeper集群后会可以使⽤zkCli.sh登录客⼾端。
Zookeeper集群中存在半数机制,即:在集群中运⾏zookeeper的节点占运⾏zookeeper总节点数的⼀半的时候后才会对外提供服务;
4.修改core-site.xml⽂件
<!-- 指定HDFS 的namenode的通信地址,这里默认为本地 -->
<property>
<name>fs.defaultFS</name>
<!-- <value>hdfs://master:9000</value> -->
<value>hdfs://mycluster</value>
</property>
<!-- 指定运⾏在zookeeper上的节点,以及通信端口-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!-- 指定hadoop运行时产生文件的存储路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
5.修改yarn-site.xml⽂件
<!-- 设置resourcemanager为master write by gleam 2021-02-18-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>slave2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>slave2:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>slave2:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>slave2:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>slave2:8088</value>
</property>
<!-- 设置yarn集群的内存分配方案 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<!-- 开启日志聚合功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置聚合日志在hdfs上的保存时间 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 设置yarn历史服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://master:19888/jobhistory/logs</value>
</property>
<!-- 关闭yarn内存检查 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
6.执行以下步骤
分布core-site.xml,hdfs-site.xml,yarn-site.xml⽂件到其他机器
假设nn1上和nn2上有namenode
- 将每个节点上的data,和logs⽂件夹删除
- 启动journalnode(此时data和logs⽂件夹会出现)
- 在nn1上格式化namenode:hdfs namenode -format
- 在nn1上启动namenode:hadoop-daemon.sh start
namenode - 在nn2上主动拉取nn1上的元数据:hdfs namenode-bootstrapStandby
- 在nn2上启动namenode:hadoop-daemon.sh start namenode
- 将两个namenode停⽌
- 启动zookeeper集群:zkServer.sh start
- 在有namenode的节点上初始化zk集群:hdfs zkfc -formatZK(在zk集群上创建出hadoop⾼可⽤节点)
- 启动hadoop集群(在ResourceManager节点上):start-all.sh
如果启动后⽆datanode可能是格式化后namenode和datanode版本不⼀致
可参考此篇博客:https://blog.youkuaiyun.com/weixin_47350757/article/details/114270077
7.每台机器执行jps查看节点是否启动,如果未启动,查看日志文件,按日志报错解决问题
正常启动后节点分布如下