五、搭建高可用集群

发布时间 2023-11-29 11:05:52作者: SIKeborn

一、zookeeper搭建

1、上传安装包到master并解压

tar -xvf zookeeper-3.5.7.tar.gz

 

2、配置环境变量

vim /etc/profile

export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin


source /etc/profile

 

 

3、修改配置文件

cd conf
cp  zoo_sample.cfg zoo.cfg

修改
dataDir=/usr/local/soft/zookeeper-3.5.7/data

增加
server.0=master:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:3888

 

 

4、同步到其它节点

scp -r zookeeper-3.5.7node1:`pwd`
scp -r zookeeper-3.5.7 node2:`pwd`

配置node1和node2的环境变量
scp /etc/profile node1:/etc/
scp /etc/profile node2:/etc/ 

 

在所有节点执行
source /etc/profile

 

 

 

4、创建/usr/local/soft/zookeeper-35.7/data目录,所有节点都要创建

mkdir /usr/local/soft/zookeeper-3.5.7/data

在data目录下创建myid文件
vim myid 
master,node1,node2分别加上0,12

 

 

5、启动zk, zkServer.sh start 三台都需要执行

zkServer.sh status 查看状态

当有一个leader的时候启动成功

 

连接zk zkCli.sh

zk  是一个目录结构 ,每个节点可以存数据,同时可以有子节点

 

zk shell

创建目录
create /test test
create /test/a 1

获取数据
get /test
 
ls /test

delete 只能删除没有子节点的节点
rmr /test  删除节点

 

 

关闭命令

zkServer.sh stop

拍摄快照

重置zk

1、杀掉所有zk进程 kiil -9 pid

2、删除data目录下的version文件, 所有节点都要删除 rm -rf /usr/local/soft/zookeeper-3.5.7/data/version-2

2、启动zk zkServer.sh start

 

 

二、搭建Hadoop-HA

 

1、防火墙
service firewalld stop
2、时间同步
yum install ntp
ntpdate -u s2c.time.edu.cn

 

3、免密钥 (远程执行命令)
在两个主节点生成密钥文件
ssh-keygen -t rsa
ssh-copy-id ip

 

master-->master,node1,node2
node1-->master,node1,node2

 

 

4、修改hadoop配置文件
停止HDFS集群:stop-dfs.sh

cd /usr/local/soft/hadoop-3.1.1/etc/hadoop/
core-site.xml

添加
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://cluster</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/soft/hadoop-3.1.1/tmp</value>
    </property>
    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>
    </property>
    <property>
          <name>ha.zookeeper.quorum</name>
          <value>master:2181,node1:2181,node2:2181</value>
    </property>
</configuration>

hdfs-site.xml

<configuration>
<!-- 指定hdfs元数据存储的路径 (文件夹会自动创建)-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/soft/hadoop-3.1.1/data/namenode</value>
</property>

<!-- 指定hdfs数据存储的路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/soft/hadoop-3.1.1/data/datanode</value>
</property>

<!-- 数据备份的个数 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

<!-- 关闭权限验证 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>

<!-- 开启WebHDFS功能(基于REST的接口服务) -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>

<!-- //////////////以下为HDFS HA的配置////////////// -->
<!-- 指定hdfs的nameservices名称为mycluster -->
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>

<!-- 指定cluster的两个namenode的名称分别为nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>nn1,nn2</value>
</property>

<!-- 配置nn1,nn2的rpc通信端口 -->
<property>
<name>dfs.namenode.rpc-address.cluster.nn1</name>
<value>master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster.nn2</name>
<value>node1:8020</value>
</property>

<!-- 配置nn1,nn2的http通信端口 -->
<property>
<name>dfs.namenode.http-address.cluster.nn1</name>
<value>master:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster.nn2</name>
<value>node1:9870</value>
</property>

<!-- 指定namenode元数据存储在journalnode中的路径 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;node1:8485;node2:8485/cluster</value>
</property>

<!-- 指定journalnode日志文件存储的路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/soft/hadoop-3.1.1/data/journal</value>
</property>

<!-- 指定HDFS客户端连接active namenode的java类 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 配置隔离机制为ssh -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>

<!-- 指定秘钥的位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>

<!-- 开启自动故障转移 -->
<property>  
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>

 

 

 

将yarn-site.xml也一并配置

添加
<configuration>
<!-- NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 开启日志 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!-- 配置日志删除时间为7天,-1为禁用,单位为秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>


<!-- //////////////以下为YARN HA的配置////////////// -->
<!-- 开启YARN HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>

<!-- 启用自动故障转移 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<!-- 指定YARN HA的名称 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
</property>

<!-- 指定两个resourcemanager的名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>

<!-- 配置rm1,rm2的主机 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node1</value>
</property>

<!-- 配置YARN的http端口 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master:8088</value>
</property>    
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>node1:8088</value>
</property>

<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,node1:2181,node2:2181</value>
</property>

<!-- 配置zookeeper的存储位置 -->
<property>
<name>yarn.resourcemanager.zk-state-store.parent-path</name>
<value>/rmstore</value>
</property>

<!-- 开启yarn resourcemanager restart -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>

<!-- 配置resourcemanager的状态存储到zookeeper中 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

<!-- 配置nodemanager IPC的通信端口 -->
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:45454</value>
</property>
</configuration>

 

 

修改 hadoop-env.sh
添加权限
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root

5、删除hadoop数据存储目录下的文件 每个节点都需要删除
rm -rf /usr/local/soft/hadoop-3.1.1/tmp
同步到其它节点(直接将node1,node2 上的hadoop-3.1.1 删除 重新将master的hadoop-3.1.1同步过去
cd /usr/local/soft
scp -r hadoop-3.1.1 node1:`pwd`
scp -r hadoop-3.1.1 node2:`pwd`

 

6、启动zookeeper 三台都需要启动
zkServer.sh start
zkServer.sh status

 

7、启动JN 存储hdfs元数据
三台JN上执行 启动命令:
/usr/local/soft/hadoop-3.1.1/sbin/hadoop-daemon.sh start journalnode

 

8、格式化 在一台NN上执行,这里选择master
hdfs namenode -format
启动当前的NN
hadoop-daemon.sh start namenode

 


9、执行同步 没有格式化的NN上执行 在另外一个namenode上面执行 这里选择node1
/usr/local/soft/hadoop-3.1.1/bin/hdfs namenode -bootstrapStandby

 


10、格式化ZK 在master上面执行
!!一定要先 把zk集群正常 启动起来
/usr/local/soft/hadoop-3.1.1/bin/hdfs zkfc -formatZK

 

11、启动hdfs集群,在master上执行
start-dfs.sh