zookeeper

zookeepe基础

什么是zookeeper

zookeeper是一个分布式协调服务,就是为用户的分布式程序提供协调服务
zookeeper是为别的分布式程序提供服务的
zookeeper本身也是一个分布式应用程序(只要有半数以上的节点存活,就可以对外提供服务)

zookeeper的功能

1、为用户提供数据的注册查询功能
2、为用户提供数据监听服务
3、通过心跳感知用户状态

特点

一个leader,多个follower组成集群
全局数据一致性:每一个server都保存一份相同的数据副本,client无论连接哪台server都可以获取到数据
更新的原子性,要不全部更新成功,要么就失败
实时性,在一定的时间范围内,client能读取到最新的数据

选取机制

1、初始化过程中的选举(选出已经启动的节点中的Id大的那个为老大)
先开启第一台机器,发出投票,总结出自己1张票,集群处于looking状态
开启第2台机器,发出投票,两台机器各一票,重新投,投票结果Id大的胜出。
2号是leader。
开启第3台机器,直接置为follower状态

2、运行过程中的选举
数据version、逻辑时钟、Id大的
数据版本大的,如果逻辑时钟小,则忽略该次选举结果,同步逻辑时钟,再重新选举

zookeeper的安装

集群安装

1、上传jar包并解压

tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local

2、配置环境变量

#vi /etc/profile
export ZK_HOME=绝对地址
exprt PATH=$PATH:$ZK_HOME/bin:$ZK_HOME/conf

#vi zoo.cfg
datadir=地址
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888

3、配置服务器Id

mkdir zkdata
echo 1 >> zkdata/myid

4、分发安装包

scp -r zookeeper-3.4.10 root@hadoop2:$PWD
scp -r zookeeper-3.4.10 root@hadoop3:$PWD

5、在其他两台机器上修改myid号

cd /usr/local/zookeeper-3.4.10/zkdata/
echo 2 > myid
6、启动集群
./zkServer.sh start
./zkServer.sh status

高可用集群

企业级的集群:
NAMENODE+RESOURCEMANAGER ZKFC ACTIVE  各1台 128G内存 + 12核48线程 + 8*1T机械硬盘
NAMENODE+RESOURCEMANAGER ZKFC STANDBY 可以共用一台物理机 配置跟上面类似

ZOOKEEPER + JOURNALNODE 3台

DATANODE+NODEMANAGER 3台

测试版高可用集群:3台
192.168.137.112 hadoop1 DATANODE NODEMANAGER ZOOKEEPER JOURNALNODE NAMENODE ZKFC RESOURCEMANAGER
192.168.137.113 hadoop2 DATANODE NODEMANAGER ZOOKEEPER JOURNALNODE NAMENODE ZKFC RESOURCEMANAGER
192.168.137.114 hadoop3 DATANODE NODEMANAGER ZOOKEEPER JOURNALNODE 

配置集群的先决条件

1、安装JDK

2、shh免密配置

NAMENODE-->DATANODE
hadoop1--->hadoop1 hadoop2 hadoop3
hadoop2--->hadoop1 hadoop2 hadoop3

3、关闭防火墙

4、设置静态IP

5、设置hostname

6、配置主机名和IP地址之间的映射关系

7、创建hadoop用户

8、配置sudo权限

9、时间同步

安装

1、解压

2、配置环境变量

#vi /etc/profile

3、配置HDFS的配置文件

#vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
JAVA_HOME=路径
#vi $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<!--指定hdfs的nameservice的Id为hadoop-->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop</value>
</property>

<!--指定客户端访问的zookeeper地址-->
<property>
   <name>ha.zookeeper.quorum</name>
   <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>

<!--配置读写缓存的大小-->
<property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
</property>

<!--配置集群运行时的临时文件的存储路径-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoopdata/tmp</value>
</property>
</configuration>
#vi $HADOOP-HOME/etc/hadoop/hdfs-site.xml
<configuration>
<!--指定hdfs的nameservices为hadoop,需要和core-site.xml中的配置保持一致-->
<property>
  <name>dfs.nameservices</name>
  <value>hadoop</value>
</property>

<!--指定hadoop下有两个namenode,名字分别为nn1,nn2-->
<property>
  <name>dfs.ha.namenodes.hadoop</name>
  <value>nn1,nn2</value>
</property>

<!--nn1的RPC通讯地址-->
<property>
  <name>dfs.namenode.rpc-address.hadoop.nn1</name>
  <value>hadoop1:9000</value>
</property>

<!--nn2的RPC通讯地址-->
<property>
  <name>dfs.namenode.rpc-address.hadoop.nn2</name>
  <value>hadoop2:9000</value>
</property>

<!--指定nn1的web ui的通讯地址-->
<property>
  <name>dfs.namenode.http-address.hadoop.nn1</name>
  <value>hadoop1:50070</value>
</property>

<!--指定nn2的web ui的通讯地址-->
<property>
  <name>dfs.namenode.http-address.hadoop.nn2</name>
  <value>hadoop2:50070</value>
</property>

<!--指定namenode的元数据在journalnode上的存放路径-->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/hadoop</value>
</property>

<!--配置失败自动切换的实现方式-->
<property>
  <name>dfs.client.failover.proxy.provider.hadoop</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!--配置隔离机制方法,多个机制之间用换行符分割,即每一个机制一行-->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>
  sshfence
  shell(/bin/true)
  </value>
</property>

<!--使用sshfence隔离机制需要ssh免密-->
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/root/.ssh/id_rsa</value>
</property>

<!--配置sshfence隔离机制的超时时间-->
<property>
  <name>dfs.ha.fencing.ssh.connect-timeout</name>
  <value>30000</value>
</property>

<!--开启namenode的失败自动切换-->
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

<!--配置hdfs的副本数量-->
<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>

<!--指定hdfs的块大小-->
<property>
  <name>dfs.block.size</name>
  <value>134217728</value>
</property>

<!--指定hdfs的namenode的元数据的存储路径-->
<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:///usr/local/hadoopdata/dfs/name</value>
</property>

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

<!--单个QJM进程(角色)存放本地edits文件的Linux地址-->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/usr/local/hadoopdata/journaldata</value>
</property>
</configuration>
#vi $HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
<!--指定mapreduce程序的运行框架名称-->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
  <final>true</final>
</property>

<!--指定历史作业的内部通信地址-->
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop1:10020</value>
</property>

<!--历史作业的web ui通讯地址-->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop1:19888</value>
</property>
</configuration>
#vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<!--开启RM的高可用-->
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>

<!--指定RM的clustered Id-->
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>yrc</value>
</property>

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

<!--分别指定RM的地址-->
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>hadoop1</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>hadoop2</value>
</property>

<!--指定RM的web ui的通讯地址-->
<property>
  <name>yarn.resourcemanager.webapp.address.rm1</name>
  <value>hadoop1:8088</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm2</name>
  <value>hadoop2:8088</value>
</property>

<!--指定zk集群的地址-->
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>

<!--指定mapreduce使用shuffle过程-->
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
</configuration>
#vi slaves
hadoop1

检查ssh免密配置

4、分发安装包

scp core-site.xml hdfs-site.xml yarn-site.xml root@hadoop2:$PWD
scp core-site.xml hdfs-site.xml yarn-site.xml root@hadoop3:$PWD

5、启动集群

启动之前删除之前的配置目录

####第一次启动要严格的按照步骤进行

1、启动zookeeper集群
zkServer.sh start
2、启动journalnode
hadoop-daemon.sh start journalnode
3、格式化HDFS
hdfs namenode -format
4、同步namenode的数据
先启动初始化节点上的namenode
hadoop-daemon.sh start namenode
然后再复制name的元数据文件到nn2
第一种方法:scp - r hadoopdata/dfs

第二种(在第二台机器上执行):hdfs namenode -bootstrapStandby
5、格式化ZKFC
hdfs zkfc -formatZK
6、启动HDFS
start-dfs.sh

6、启动yarn集群

start-yarn.sh
yarn只会启动一个resourcemanager,需要手动去启动其他的RM
yarn-daemon.sh start resourcemanager 

hadoop的ha架构

ha架构

分布式共享锁

分布式共享锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值