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