zookeepr集群的搭建

来源:互联网 发布:java百度课程 编辑:程序博客网 时间:2024/06/07 18:08

本文中我们先搭建一台,在用这一台将配置信息发送到第二台、第三台。

由于zookeeper集群中挂掉一个节点,会有新的节点代替,被选举的leader也是如此。

因此我们尝试一下搭建zookeeper集群,当然在最后我们也会测试效果如何。

(一)伪分布式
##安装ZooKeeper
$ tar -zxf  /opt/software/zookeeper-3.4.5.tar.gz -C  /opt/modules/waremodules/


##新建一个Zookeeper的data目录
$ mkdir zkData   --//可以不用手动创建,启动自动生成


 ##修改配置文件${ZOOKEEPER_HOME}/conf
  1)$ cp zoo_sample.cfg zoo.cfg
  2)vi  zoo.cfg
 dataDir=/opt/modules/zookeeper-3.4.5/zkData


##启动zookeeper
bin/zkServer.sh start
8967 QuorumPeerMain


##查看zookeeper的状态
bin/zkServer.sh status


JMX enabled by default
Using config: /opt/modules/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: standalone    单机模式


(二)完全分布式
1.安装JDK(3台PC都要安装JDK)
配置环境变量
2.安装完全分布式集群
1)安装zk
2)配置zoo.cfg文件
dataDir=/opt/modules/zookeeper-3.4.5/zkData
server.1=hadoop.ibeifeng.com.cn01:2888:3888
server.2=hadoop.ibeifeng.com.cn02:2888:3888
server.3=hadoop.ibeifeng.com.cn03:2888:3888
3)创建zkData目录,在zkData目录目录下创建myid文件,编辑myid,内同就是此台server的id,就是zoo.cfg中指定的server.1
vi zkData/myid
1




4)从第一台(PC1)分发zookeeper目录
在/opt/modules目录下
$ scp -r zookeeper-3.4.5/ hadoop.senior03:/opt/modules/


5)修改第2(PC2)、3(PC3)台的myid文件
vi zkData/myid
修改对应的id(根据conf/zoo.zfg中绑定到server.n的主机名对应)


6)启动(3台上)
$ bin/zkServer.sh start


7)检查进程
jps
3050 QuorumPeerMain
3111 Jps


8)检查并核对状态(3台上)
$ bin/zkServer.sh status


Zookeeper shell命令
bin/zkCli.sh -server 主机名:2181
或者 bin/zkCli.sh


help
ZooKeeper -server host:port cmd args
connect host:port
get path [watch]
ls path [watch]
set path data [version]
rmr path
delquota [-n|-b] path
quit 
printwatches on|off
create [-s] [-e] path data acl
stat path [watch]
close 
ls2 path [watch]
history 
listquota path
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path


create /app demo  -》 create创建节点  /app 节点(服务器)名称(目录)  demo目录的数据
get /app  //读取/app的内容


get /app  watch  //注册一个目录(节点)内容变动的watch事件  如果修改文件内容则会自动触发


WATCHER::


WatchedEvent state:SyncConnected type:NodeDataChanged path:/ap


set /app test   //set 修改节点内容  /app具体节点   test 节点内容




ls /app watch  //注册一个/app节点变动的waych事件
WATCHER::


WatchedEvent state:SyncConnected type:NodeDeleted path:/app

delete /app  //删除节点


create -e //创建一个临时节点 -》 一点节点(断开:心跳信息丢失) 该节点会自动被删除


四 Hadoop Ha (High avilable)
Namenode HA
集群规划(3台)
PC01 PC02 PC03
NameNode NameNode
ZKFC ZKFC
ResourceManager
DataNode DataNodeDataNode
JournalNode JournalNodeJournalNode
NodeManager NodeManagerNodeManager
ZooKeeper ZooKeeperZooKeeper


一)安装hadoop

二)配置环境文件
hadoop-env.sh
mapred-env.sh
yarn-env.sh

export JAVA_HOME=/opt/modules/jdk1.7.0_67


三)配置4个site.xml文件

1.========core-site.xml========
<!--NameNode HA的逻辑访问名称-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>


<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0/data</value>
</property>


2.=================hdfs-site.xml=============
<!-- 分布式副本数设置为3 -->
<property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>

<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>

<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop.senior01:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop.senior01:50070</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop.senior02:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop.senior02:50070</value>
</property>

<!-- 指定NameNode的edit文件在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop.senior01:8485;hadoop.senior02:8485;hadoop.senior03:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.5.0/journal</value>
</property>

<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行
sshfence:当Active出问题后,standby切换成Active,此时,原Active又没有停止服务,这种情况下会被强制杀死进程。
shell(/bin/true):NN Active和它的ZKFC一起挂了,没有人通知ZK,ZK长期没有接到通知,standby要切换,此时,standby调一个shell(脚本内容),这个脚本返回true则切换成功。
-->
<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>/home/hadoop/.ssh/id_rsa</value>
</property>

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




<!-- 关闭权限检查用户或用户组 -->
<property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>


3.=============mapred-site.xml
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

<property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop.senior01:10020</value>
    </property>

<property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop.senior01:19888</value>
    </property>


  4.============yarn-site.xml
  <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop.senior03</value>
    </property>

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

<property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

<property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>

5.=================slaves
hadoop.senior01
hadoop.senior02
hadoop.senior03

四)分发配置
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml  hadoop.senior02:/opt/modules/hadoop-2.5.0/etc/hadoop/


$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml  hadoop.senior03:/opt/modules/hadoop-2.5.0/etc/hadoop/


五)启动HDFS HA
## 注意:每一个步骤都严格按照以下步骤执行
1.删除data和logs目录(3台上,有必须删掉)
$ rm -rf data logs


2.启动zk(3台上都要)
$ bin/zkServer.sh start


3.启动journalnode(3台上都要)
$ sbin/hadoop-daemon.sh start journalnode

3908 JournalNode
2740 QuorumPeerMain


4.格式化namenode(PC1 也就是nn1)
$ bin/hdfs namenode -format   
$ sbin/hadoop-daemon.sh start namenode


5.同步nn1的元数据(PC2 也就是nn2)
$ bin/hdfs namenode -bootstrapStandby
$ sbin/hadoop-daemon.sh start namenode


6.查看web界面
http://hadoop.senior01:50070       ##standby
http://hadoop.senior02:50070       ##standby


7.手动切换namenode的状态(开启ZKFC后失效)
$ bin/hdfs haadmin -transitionToActive nn1  ##切换active
$ bin/hdfs haadmin -transitionToStandby nn1  ##切换成standby


六)开启故障自动转移
1.配置故障转移
1)=====core-site.xml
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop.senior01:2181,hadoop.senior02:2181,hadoop.senior03:2181</value>
</property>


2)====hdfs-site.xml
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>


2.分发配置文件
$ scp etc/hadoop/core-site.xml  etc/hadoop/hdfs-site.xml hadoop.senior02:/opt/modules/hadoop-2.5.0/etc/hadoop/


3.启动故障转移服务
1)首先停止hdfs和zk
$ sbin/stop-dfs.sh

$ bin/zkServer.sh stop##关闭zk(3台服务器)
重启
$ bin/zkServer.sh start##启动zk(3台服务器)


2)初始化zkfc[PC1也就是nn1]
$ bin/hdfs zkfc -formatZK  ##初始化ZKFC


17/03/27 16:49:18 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns1 in ZK.

$ sbin/start-dfs.sh##启动hdfs

bin/hdfs haadmin -getServiceState nn1     #查看nn1状态
bin/hdfs haadmin -getServiceState nn2     #查看nn2状态




[PC1]
[hadoop@hadoop hadoop-2.5.0]$ jps
4196 JournalNode
4356 DFSZKFailoverController
4012 DataNode
3920 NameNode
3586 QuorumPeerMain
4458 Jps


[PC2]
[hadoop@hadoop hadoop-2.5.0]$ jps
4117 Jps
3849 DataNode
3786 NameNode
3926 JournalNode
3633 QuorumPeerMain
4045 DFSZKFailoverController


[PC3]
[hadoop@hadoop hadoop-2.5.0]$ jps
3387 DataNode
3461 JournalNode
3551 Jps
3231 QuorumPeerMain



测试HA是否生效
(1)先查看一下两个节点的运行情况,现在spark1运行了master,spark2是待命状态
   
(2)在spark1上把master服务停掉


[root@spark1 spark-1.0]# sbin/stop-master.sh 
stopping org.apache.spark.deploy.master.Master
[root@spark1 spark-1.0]# jps
5797 Worker
6373 Jps
2602 QuorumPeerMain
复制代码
(3)用浏览器访问master的8080端口,看是否还活着。以下可以看出,master已经挂掉
 
(4)再用浏览器访问查看spark2的状态,从下图看出,spark2已经被切换当master了